Submission #6891

#TimeUsernameProblemLanguageResultExecution timeMemory
6891qja0950Split the sequence (APIO14_sequence)C++98
100 / 100
688 ms93500 KiB
#include <stdio.h> #define MAXN 101101 #define MAXK 222 typedef long long ll; int N, K; int A[MAXN]; int S[MAXN]; void INPUT() { scanf("%d %d", &N, &K); for(int i=1; i<=N; i++) { scanf("%d", &A[i]); S[i]=S[i-1]+A[i]; } } long long D[2][MAXN]; int Mom[MAXK][MAXN]; long long Stack[3][MAXN]; int Stackp; bool MyOperator(ll Linea[], ll Lineb[]) { ll Line[3][2]; for(int i=0; i<3; i++) { Line[i][0]=Linea[i]; Line[i][1]=Lineb[i]; } ll temp1=(ll)(Line[0][1]-Line[1][1])*(ll)(Line[2][0]-Line[1][0]); ll temp2=(ll)(Line[1][1]-Line[2][1])*(ll)(Line[1][0]-Line[0][0]); return temp1>=temp2; } int C; int P; void Stack_Push(int k) { ++Stackp; Stack[0][Stackp]=(ll)S[k]; Stack[1][Stackp]=-(ll)S[k]*(ll)S[k]+D[C%2][k]; Stack[2][Stackp]=k; } void Stack_Pop() { if(P==Stackp) P--; Stackp--; } void Stack_Clear() { Stackp=0; } void Graph(int k) { if(Stackp==0) { Stack_Push(k); // printf("<<<<<%d %lld %lld>>>>>\n", k, Stack[0][Stackp], Stack[1][Stackp]); return; } if(A[k]==0) return; if(Stackp==1) { Stack_Push(k); // printf("<<<<<%d %lld %lld>>>>>\n", k, Stack[0][Stackp], Stack[1][Stackp]); return; } Stack_Push(k); // printf("<<<<<%d %lld %lld>>>>>\n", k, Stack[0][Stackp], Stack[1][Stackp]); // printf(".%lld\t %lld\t %lld\n", Stack[0][Stackp-2], Stack[0][Stackp-1], Stack[0][Stackp]); // printf(".%lld\t %lld\t %lld\n", Stack[1][Stackp-2], Stack[1][Stackp-1], Stack[1][Stackp]); while(MyOperator(Stack[0]+Stackp-2, Stack[1]+Stackp-2)) { Stack_Pop(); Stack_Pop(); Stack_Push(k); if(Stackp<=2) break; } } ll MAX(ll x, ll y) { if(x>y) return x; else return y; } void Find(int i, int j); void PROCESS() { // Trick(); for(int i=1; i<=K; i++) { for(int j=i+1; j<=N; j++) D[i%2][j]=0; C=i-1; Stack_Clear(); P=1; for(int j=i+1; j<=N; j++) { Graph(j-1); while(1) { if(P>=Stackp) break; ll nowa =Stack[0][P] , nowb =Stack[1][P]; ll nexta=Stack[0][P+1] , nextb=Stack[1][P+1]; ll nowD=nowa*(ll)S[j]+nowb, nextD=nexta*(ll)S[j]+nextb; // printf("<%d (%lld %lld) %lld (%lld %lld) %lld : %d>\n" // , k, nowa, nowb, nowD, nexta, nextb, nextD, S[j]); if(nowD<=nextD) P++; else break; } if(P>=Stackp) P=Stackp; ll Da =Stack[0][P] , Db =Stack[1][P]; D[i%2][j]=Da*(ll)S[j]+Db; Mom[i][j]=Stack[2][P]; // printf("%d %d : %lld %lld / %lld (%d %d / %d)\n" // , i, j, Da, Db, D[i%2][j], k, Stackp, Stack[2][k]); /* for(int k=i; k<j; k++) { ll temp=D[1-i%2][k]-((ll)S[k]*(ll)S[k])+(ll)S[j]*(ll)S[k]; D[i%2][j]=MAX(D[i%2][j], temp); if(D[i%2][j]==temp) Mom[i][j]=k; } printf("%d %d / %lld %d\n" , i, j, D[i%2][j], Mom[i][j]); */ } } long long Ans=0; int p=N; Ans=MAX(Ans, D[K%2][N]); printf("%lld\n", Ans); Find(K, p); } void Find(int i, int j) { if(i==0) return; printf("%d ", Mom[i][j]); return Find(i-1, Mom[i][j]); } int main() { INPUT(); PROCESS(); }
#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...