Submission #372718

#TimeUsernameProblemLanguageResultExecution timeMemory
372718BJoozz케이크 (JOI13_cake)C++14
0 / 100
56 ms14572 KiB
#include <bits/stdc++.h> using namespace std; #define X first #define Y second #define pb push_back //#define int long long const int MAX = 300000+3,M=(1<<25)+1,mod=1e9+7; void maxx(int &a,int b) {if(b>a) a=b;} void minn(int &a,int b) {if(b<a) a=b;} using ii = pair < int ,int > ; using ll = long long; int a[MAX]; ll B[MAX][2]; int ST[MAX][20]; ll ans[MAX]; int minu(int i,int j){ if(a[i]<a[j]) return i; else return j; } int n; int LG[MAX]; int id(int u){ if(u<1) return u+n; if(u>n) return u-n; return u; } int nex[MAX],pre[MAX]; int get(int l,int r){ int u=r-l+1; if(r<l)u+=n; u=LG[u]; return minu(ST[l][u],ST[id(r-(1<<u)+1)][u]); } bool tt; ll getsum(bool x,int l,int r){ if(r>=l) return B[r][x]-B[l-1][x]; else return B[n][x]-B[l-1][x]+B[r][x^tt]; } ll getsum2(bool x,int l,int r){ if(r>=l) return B[r][x]-B[l-1][x]; else return B[n][x^tt]-B[l-1][x^tt]+B[r][x]; } int H; int dis(int L,int R){ if(R>=L) return R-L+1; else return R-L+1+n; } int getdown(int x,int u,int val){ //if(a[u]<val) return u; for(int z=LG[dis(x,u)];z>=0;z--) if(a[ ST[id(u-(1<<z))][z] ]>=val ) { u=id(u-(1<<z)); } return u; } int getup(int x,int u,int val){ for(int z=LG[dis(u,x)];z>=0;z--) if(a[ ST[nex[u]][z] ]>=val ) { u=id(u+(1<<z)); } return u; } ll cos(int z,int L,int R){ ll res=a[z]; if(dis(L,z)<dis(z,R)){ int i=pre[z],j=nex[z]; bool ok=1; if(L+R<=dis(L,z)*12){ while(i!=L){ while(a[j]>a[i]) { ok^=1;if(ok) res+=a[j];j=nex[j]; continue; } ok^=1;if(ok) res+=a[i];i=pre[i]; } while(j!=R){ ok^=1;if(ok) res+=a[j];j=nex[j]; } return res; } while(i!=L){ if(a[j]<a[i]) {if(!ok) res+=a[i];i=pre[i];ok^=1;continue;} int m=getup(R,j,a[i]); res+=getsum((ok^j)&1,j,m); ok^=dis(j,m)&1; j=nex[m]; } if(j!=R) res+=getsum(!ok,j,pre[R]); /*while(j!=R){ if(!ok) res+=a[j]; ok^=1; j=nex[j]; }*/ } else{ int i=pre[z],j=nex[z]; bool ok=1; if(L+R<=dis(z,R)*12){ while(j!=R){ while(a[i]>a[j]) { ok^=1;if(ok) res+=a[i];i=pre[i]; continue; } ok^=1;if(ok) res+=a[j];j=nex[j]; } while(i!=L){ ok^=1;if(ok) res+=a[i];i=pre[i]; } return res; } while(j!=R){ if(a[i]<a[j]) {if(!ok) res+=a[j];j=nex[j];ok^=1;continue;} int m=getdown(L,i,a[j]); res+=getsum2((ok^i)&1,m,i); ok^=dis(m,i)&1; i=pre[m]; } if(i!=L) res+=getsum2(!ok,nex[L],i); /*while(i!=L){ if(!ok) res+=a[i]; ok^=1; i=pre[i]; }*/ } return res; } void GODOWN(int L,int R,ll sum){ if(R==id(L+1))return; int z=get(id(L+1),id(R-1)); ans[z]=cos(z,L,R)+sum; GODOWN(L,z,sum+getsum( (z^tt^ dis(z,L)) &1,z,pre[R] )); GODOWN(z,R,sum+getsum2( (z^tt^dis(R,z))&1,nex[L],z )); } signed main() { ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); //freopen("A.inp", "r", stdin);freopen("A.out", "w", stdout); LG[1]=0; for(int i=2;i<MAX;i++) LG[i]=LG[i/2]+1; cin>>n; H=LG[n]; if(H>=17) H--; for(int i=1;i<=n;i++) nex[i]=i+1,pre[i]=i-1; pre[1]=n;nex[n]=1; for(int i=1;i<=n;i++){ cin>>a[i]; ST[i][0]=i; B[i][0]=B[i-1][0]; B[i][1]=B[i-1][1]; B[i][i&1]+=a[i]; } for(int j=1;j<20;j++){ for(int i=1;i<=n;i++){ ST[i][j]=minu(ST[i][j-1],ST[id((i+(1<<j-1))%n)][j-1]); } } int u1=ST[1][19]; int u2=get(id(u1+1),id(u1-1)); ll &res = ans[u1]; tt=n&1; res=cos(u1,u2,u2);//return 0; if(tt) res+=a[u2]; if(tt) GODOWN(u1,u1,a[u1]); else GODOWN(u1,u1,0); for(int i=1;i<=n;i++) cout<<ans[i]<<'\n'; }

Compilation message (stderr)

cake.cpp: In function 'int main()':
cake.cpp:164:52: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
  164 |             ST[i][j]=minu(ST[i][j-1],ST[id((i+(1<<j-1))%n)][j-1]);
      |                                                   ~^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...