Submission #57044

#TimeUsernameProblemLanguageResultExecution timeMemory
57044PlurmSplit the sequence (APIO14_sequence)C++11
0 / 100
129 ms104632 KiB
#include <cstdio>
#include <cstring>
#define bad(x,y,z) ((C[y]-C[x])*(M[x]-M[z]) >= (C[z]-C[x])*(M[x]-M[y]))
int a[100005];
long long dp[100005];
long long qs[100005];
int par[100005][256];
struct{
	int M,C,idx;
} L1[100005], L2[100005];
int prt[100005];
int ptr1,ptr2;
int csz1,csz2;
int main(){
	int n,k;
	scanf("%d%d",&n,&k);
	k++;
	csz1++;
	for(int i = 1; i <= n; i++){
		scanf("%d",a+i);
		qs[i] = qs[i-1] + (long long)a[i];
		dp[i] = -1e16;
	}
	for(int j = 1; j <= k; j++){
		csz2 = ptr2 = 0;
		int id;
		for(int i = j; i <= n; i++){
			if(ptr1 >= csz1) ptr1 = csz1-1;
			while(ptr1 < csz1-1 && L1[ptr1+1].M*qs[i] + L1[ptr1+1].C > L1[ptr1].M*qs[i] + L1[ptr1].C) ptr1++;
			id = ptr1;
			par[i][j] = L1[id].idx;
			dp[i] = L1[id].M*qs[i] + L1[id].C;
			while(csz2 >= 2 && (L2[csz2-1].C-L2[csz2-2].C)*(L2[csz2-2].M-qs[i]) >= (dp[i]-qs[i]*qs[i]-L2[csz2-2].C)*(L2[csz2-2].M-L2[csz2-1].M)) csz2--;
			L2[csz2].M = qs[i];
			L2[csz2].C = dp[i] - qs[i]*qs[i];
			L2[csz2].idx = i;
			csz2++;
		}
		for(int i = 0; i < csz2; i++){
			L1[i] = L2[i];
		}
		csz1 = csz2;
		ptr1 = ptr2;
	}
	printf("%lld\n",dp[n]);
	int x = n;
	csz1 = 0;
	for(int j = k; j > 1; j--){
		x = par[x][j];
		prt[csz1++] = x;
	}
	for(int i = 0; i < csz1; i++){
		printf("%d ",prt[i]);
	}
}

Compilation message (stderr)

sequence.cpp: In function 'int main()':
sequence.cpp:16:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d",&n,&k);
  ~~~~~^~~~~~~~~~~~~~
sequence.cpp:20:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d",a+i);
   ~~~~~^~~~~~~~~~
#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...