Submission #899498

#TimeUsernameProblemLanguageResultExecution timeMemory
899498oblantisSplit the sequence (APIO14_sequence)C++17
100 / 100
621 ms83768 KiB
#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
#define all(v) v.begin(), v.end()
#define pb push_back
#define ss second
#define ff first
#define vt vector
using namespace std;
//using namespace __gnu_pbds;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<double, int> pdi;
const ll inf = 1e18;
const int mod = 1e9+7;
const int maxn = 3e3 + 1;
void solve() {
	int n, k;
	cin >> n >> k;
	ll a[n + 1], p[n + 1];
	ll dp[n + 1][2];
	int from[n + 1][k + 2];
	p[0] = 0;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
		p[i] = a[i] + p[i - 1];
	}
	for(int i = 1; i <= n; i++){
		dp[i][0] = (p[n] - p[i]) * p[i];
	}
	dp[0][0] = 0;
	for(int t = 2; t <= k + 1; t++){
		deque<pair<pll, pll>> dq;
		dq.push_back({{dp[t - 1][0], p[t - 1]}, {0, t - 1}});
		from[t - 1][t] = t - 2;
		for(int i = 0; i < t; i++)dp[i][1] = -inf;
		for(int i = t; i <= n; i++){
			while(!dq.empty() && dq.back().ss.ff > p[n] - p[i])dq.pop_back();
			dp[i][1] = dq.back().ff.ff + (p[n] - p[i]) * p[i] - (dq.back().ff.ss * (p[n] - p[i]));
			from[i][t] = dq.back().ss.ss;
			ll x = dp[i][0], y = p[i];
			if(dq.front().ff.ff >= x)continue;
			while(!dq.empty()){
				pll nw = dq.front().ff;
				ll it = dq.front().ss.ss;
				dq.pop_front();
				if(y == nw.ss)continue;
				ll z = (x - nw.ff + y - nw.ss - 1) / (y - nw.ss);
				if(dq.empty() || z < dq.front().ss.ff){
					dq.push_front({nw, {z, it}});
					break;
				}
			}
			dq.push_front({{x, y}, {0, i}});
		}
		for(int i = 0; i <= n; i++)dp[i][0] = dp[i][1];
	}
	cout << dp[n][0] << '\n';
	int x = n;
	while(k > 0){
		cout << from[x][k + 1] << ' ';
		x = from[x][k + 1];
		k--;
	}
}
int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int times = 1;
	//cin >> times;
	for(int i = 1; i <= times; i++) {
		solve();
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...