Submission #1134355

#TimeUsernameProblemLanguageResultExecution timeMemory
1134355Math4Life2020Split the sequence (APIO14_sequence)C++17
100 / 100
802 ms97444 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long; using pii = pair<ll,ll>;

const ll Nm = 1e5+5; const ll Km = 205; const ll INF = 1e18;
ll a[Nm];
ll psa[Nm+1];

//pii dp[Nm+1][Km+1]; //filled with zeroes initially: {value, previous index}
int dp[Nm+1][Km+1]; //just previous index now!

pii eval(array<ll,3> a1, ll x) {
	return {a1[0]*x+a1[1],a1[2]};
}

//vector<array<ll,3>> adp[Km+1];
deque<array<ll,3>> adp[Km+1];
//more positive to more negative slopes

pii rd(deque<array<ll,3>>& v1, ll x) {
	//read from front
	if (v1.size()==1) {
		return eval(v1.front(),x);
	}
	array<ll,3> t1 = v1.front(); v1.pop_front();
	array<ll,3> t2 = v1.front();
	pii p1 = eval(t1,x); pii p2 = eval(t2,x);
	if (p2.first<p1.first) {
		return rd(v1,x);
	} else {
		v1.push_front(t1); return p1;
	}
}

void anl(deque<array<ll,3>>& v1) {
	if (v1.size()<3) {
		return;
	}
	array<ll,3> t3 = v1.back(); v1.pop_back();
	array<ll,3> t2 = v1.back(); v1.pop_back();
	array<ll,3> t1 = v1.back();
	if (!((t3[1]*t1[0]+t1[1]*t2[0]+t2[1]*t3[0])>(t1[1]*t3[0]+t2[1]*t1[0]+t3[1]*t2[0]))) {
		v1.push_back(t3);
		anl(v1);
	} else {
		v1.push_back(t2);
		v1.push_back(t3);
	}
}

void wt(ll i, ll k, pii dpv) {
	adp[k].push_back({-2*psa[i],dpv.first+2*psa[i]*psa[i],i});
	anl(adp[k]);
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(0);
	ll N,K; cin >> N >> K;
	for (ll k=0;k<Km;k++) {
		adp[k].push_back({0,INF,-1});
	}
	psa[0]=0;
	for (ll i=0;i<N;i++) {
		cin >> a[i];
		psa[i+1]=psa[i]+a[i];
	}
	for (ll i=0;i<=N;i++) {
		if (i==0) {
			adp[0].push_back({0,0,0});
			continue;
		}
		for (ll k=Km;k>=1;k--) {
			//dp[i][k]=rd((adp[k-1]),psa[i]);
			pii pdp = rd((adp[k-1]),psa[i]);
			dp[i][k]=pdp.second;
			if (pdp.first==INF) {
				continue;
			}
			wt(i,k,pdp);
			if (i==N && k==(K+1)) {
				cout << (-pdp.first/2) <<"\n";
			}
		}
	}
	//cout << (-dp[N][K+1].first)/2 << "\n";
	string ansS;
	ll ip = N; ll kp = K+1;
	vector<ll> vip;
	while (kp>0) {
		vip.push_back(ip);
		ip = dp[ip][kp];
		kp--;
	}
	for (ll k=0;k<K;k++) {
		cout << vip[K-k];
		if (k != (K-1)) {
			cout << " ";
		}
	}
	cout << ansS << "\n";
}
#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...