Submission #13761

#TimeUsernameProblemLanguageResultExecution timeMemory
13761cometSplit the sequence (APIO14_sequence)C++98
0 / 100
0 ms2776 KiB
#include<cstdio> #include<algorithm> #include<deque> #include<stdlib.h> #include<time.h> #include<cstring> #define MOD (ll)(1e9) using namespace std; typedef long long ll; typedef pair<ll,ll> pp; ll d[2][1010],s[100010],N,K; short r[201][1001]; void f(int x,int y){ if(x==1)return; f(x-1,r[x][y]); printf("%d ",(int)r[x][y]); } /*void f2(int x,int y){ if(x==1)return; f(x-1,r2[x][y]); printf("%d ",(int)r2[x][y]); }*/ struct convex{ deque<ll> a,b,c; void init(){a.clear();b.clear();c.clear();} bool check(ll z0,ll z1,ll z2,ll z3){ ll uz0=z0/MOD,uz1=z1/MOD,uz2=z2/MOD,uz3=z3/MOD; z0%=MOD,z1%=MOD,z2%=MOD,z3%=MOD; ll p=0,q=0,r=0,p2=0,q2=0,r2=0; r=z0*z1,r2=z2*z3; q+=r/MOD,q2+=r2/MOD; r%=MOD,r2%=MOD; q+=z0*uz1+uz0*z1,q2+=z2*uz3+z3*uz2; p+=q/MOD,p2+=q2/MOD; q%=MOD,q2%=MOD; p+=uz0*uz1,p2+=uz2*uz3; if(p!=p2)return p>p2; if(q!=q2)return q>q2; return r>r2; } void push(ll n,ll m,ll v){ while(a.size()>1&&check(b.back()-b[b.size()-2],a.back()-n,m-b.back(),a[a.size()-2]-a.back())){ a.pop_back(); b.pop_back(); c.pop_back(); } a.push_back(n); b.push_back(m); c.push_back(v); } pp query(ll x){ while(!a.empty()&&(a[0]-a[1])*x<(b[1]-b[0])){ a.pop_front(); b.pop_front(); c.pop_front(); } return pp(a[0]*x+b[0],c[0]); } }; int main(){ srand(time(NULL)); scanf("%lld%lld",&N,&K); //for(int comet=0;comet<100000;comet++){ if(K==0)K++; for(int i=1;i<=N;i++){ scanf("%lld",&s[i]); //s[i]=rand(); s[i]+=s[i-1]; } convex* pre=new convex; convex* cur=new convex; pp ret; for(int i=1;i<=N;i++){ d[1][i]=s[i]*(s[N]-s[i]); pre->push(s[i],d[1][i]-s[i]*s[N],i); } for(int g=2;g<=K+1;g++){ for(int i=g;i<=N;i++){ ret=pre->query(s[i]); d[g&1][i]=ret.first+(s[N]-s[i])*s[i]; r[g][i]=ret.second; cur->push(s[i],d[g&1][i]-s[i]*s[N],i); } pre->init(); swap(cur,pre); } /*for(int i=1;i<=N;i++)d2[1][i]=s[i]*(s[N]-s[i]); for(int g=2;g<=K+1;g++){ for(int i=g;i<=N;i++){ for(int j=1;j<i;j++){ if(d2[g%2][i]<d2[(g+1)%2][j]+(s[i]-s[j])*(s[N]-s[i])){ d2[g%2][i]=d2[(g+1)%2][j]+(s[i]-s[j])*(s[N]-s[i]); r2[g][i]=j; } } } }*/ /*if(d[(K+1)&1][N]!=d2[(K+1)%2][N]){ printf("%lld %lld\n",N,K); for(int i=1;i<=N;i++)printf("%lld ",s[i]); printf("\nans= %lld, %lld\n",d[(K+1)&1][N],d2[(K+1)%2][N]); f(K+1,N); f2(K+1,N); break; } */ printf("%lld \n",d[(K+1)&1][N]); f(K+1,N); //f2(K+1,N); delete cur,pre; }
#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...