Submission #399000

#TimeUsernameProblemLanguageResultExecution timeMemory
399000wnguscjf01수열 (APIO14_sequence)C++14
11 / 100
23 ms10180 KiB
#include<bits/stdc++.h>
#define MAXK 201
#define MAXN 100001
using namespace std;
struct data{
	long long int slope, yy;
	double s;
	int num;
};
struct data d[2][MAXN];
bool compare(const struct data &a, const struct data &b){
	return a.s < b.s;
}
double cross(long long int a, long long int b, long long int c, long long int d){
	return 1.0*(d-b)/(a-c);
}
long long int ans[2][MAXN], sum[MAXN];
int dsize[2], tr[MAXK][MAXN], ans2[MAXN];
int main()
{
	int n, k, i, j;
	cin >> n >> k;
	
	for(i=1; i<=n; i++){
		int aa;
		scanf("%d",&aa);
		sum[i] = sum[i-1]+aa;
	}
	
	for(j=1; j<=k; j++){
		dsize[j%2]=0;
		for(i=j; i<n; i++){
			if(sum[i] >= d[(j-1)%2][dsize[(j-1)%2]].s){ans[j%2][i] = d[(j-1)][dsize[(j-1)%2]].slope*sum[i] + d[(j-1)%2][dsize[(j-1)]].yy + sum[i]*sum[n] - sum[i]*sum[i]; tr[j][i] = d[(j-1)][dsize[(j-1)]].num;}
			else{
				struct data tmp;
				tmp.s = sum[i];
				int p = lower_bound(d[(j-1)%2], d[(j-1)%2]+dsize[(j-1)%2]+1,tmp,compare)-d[(j-1)%2]-1;
				ans[j%2][i] = d[(j-1)%2][p].slope*sum[i] + d[(j-1)%2][p].yy + sum[i]*sum[n] - sum[i]*sum[i];
				tr[j][i] = d[(j-1)%2][p].num;
			}
			dsize[j%2]++;
			d[j%2][dsize[j%2]].slope = sum[i];
			d[j%2][dsize[j%2]].yy = ans[j%2][i] - sum[i]*sum[n];
			d[j%2][dsize[j%2]].num = i;
			if(dsize[j%2]==1) d[j%2][dsize[j%2]].s = LLONG_MIN;
			else{
				while(cross(d[j%2][dsize[j%2]].slope,d[j%2][dsize[j%2]].yy,d[j%2][dsize[j%2]-1].slope,d[j%2][dsize[j%2]-1].yy) <= d[j%2][dsize[j%2]-1].s){
					d[j%2][dsize[j%2]-1].slope = d[j%2][dsize[j%2]].slope;
					d[j%2][dsize[j%2]-1].yy = d[j%2][dsize[j%2]].yy;
					d[j%2][dsize[j%2]-1].num = d[j%2][dsize[j%2]].num;
					dsize[j%2]--;
				}
				d[j%2][dsize[j%2]].s = cross(d[j%2][dsize[j%2]].slope,d[j%2][dsize[j%2]].yy,d[j%2][dsize[j%2]-1].slope,d[j%2][dsize[j%2]-1].yy);
			}
		}
		/*for(i=1; i<n; i++){
			printf("%lld  ",ans[j%2][i]);
		}
		cout << endl;*/
	}
	
	int maxind = 1;
	for(i=k; i<n; i++){
		if(ans[k%2][i] > ans[k%2][maxind]) maxind = i;
	}
	printf("%lld\n",ans[k%2][maxind]);
	int p = k, q = maxind;
	while(1){
		if(p<1) break;
		ans2[p] = q;
		q = tr[p][q];
		p--;
	}
	for(i=1; i<=k; i++) printf("%d ",ans2[i]);
	
	return 0;
}
/*
7 3
4 1 3 4 0 2 3
*/
/*
5 4
8 9 6 2 5
*/
/*
10 5
9 7 1 6 8 3 8 10 2 4
*/

Compilation message (stderr)

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