Submission #1021274

#TimeUsernameProblemLanguageResultExecution timeMemory
1021274amirhoseinfar1385Wombats (IOI13_wombats)C++17
100 / 100
3386 ms158800 KiB
#include "wombats.h" #include<bits/stdc++.h> using namespace std; const int maxn=5000+10,maxm=200+10,t=20,mt=(maxn/t)+5,lg=log2(mt)+1; int n,m,inf=1e9+5; struct bakhsh{ int allr[t+5][maxm],allc[t+5][maxm],dp[maxm][maxm],ps[maxm],suf[maxm],mxr=0; void calps(int i){ for(int j=1;j<=m;j++){ ps[j]=ps[j-1]+allr[i][j-1]; } } void calc(){ for(int k=1;k<=m;k++){ calps(0); for(int j=1;j<=m;j++){ dp[k][j]=abs(ps[k]-ps[j]); } for(int i=1;i<=mxr;i++){ int mn=inf; for(int j=1;j<=m;j++){ mn=min(mn+allr[i][j-1],dp[k][j]+allc[i-1][j]); ps[j]=mn; } mn=inf; for(int j=m;j>=1;j--){ mn=min(mn+allr[i][j],dp[k][j]+allc[i-1][j]); dp[k][j]=min(ps[j],mn); } } for(int j=1;j<=m;j++){ dp[k][j]+=allc[mxr][j]; } } } void updr(int i,int j,int w){ j++; mxr=max(mxr,i); allr[i][j]=w; } void updc(int i,int j,int w){ j++; mxr=max(mxr,i); allc[i][j]=w; } }allsq[mt]; int kaf=(1<<lg); struct segment{ int seg[(1<<(lg+1))][maxm][maxm]; int now[maxm][maxm]; segment(){ for(int i=0;i<(1<<lg+1);i++){ for(int r=0;r<maxm;r++){ for(int c=0;c<maxm;c++){ seg[i][r][c]=inf; } } } } pair<int,int>stf[maxm][maxm]; void por(int ind,int ez[maxm][maxm]){ for(int i=1;i<=m;i++){ for(int j=1;j<=m;j++){ seg[ind][i][j]=ez[i][j]; } } } void dfs(int cl,int cr,int r=m,int c=1){ if(r==0||c==m+1){ return ; } // cout<<cl<<" "<<cr<<" "<<r<<" "<<c<<endl; if(r==m){ stf[r][c].second=m; } if(c==1){ stf[r][c].first=1; } now[r][c]=inf; int opt=stf[r][c].first; for(int i=stf[r][c].first;i<=stf[r][c].second;i++){ if(seg[cl][r][i]+seg[cr][i][c]<now[r][c]){ opt=i; now[r][c]=seg[cl][r][i]+seg[cr][i][c]; } } stf[r-1][c].second=opt; stf[r][c+1].first=opt; dfs(cl,cr,r-1,c); if(r==m){ dfs(cl,cr,r,c+1); } } void calc(int i){ if(seg[(i<<1)][1][1]==inf){ por(i,seg[(i<<1)^1]); return ; } if(seg[(i<<1)^1][1][1]==inf){ por(i,seg[(i<<1)]); return ; } dfs((i<<1),(i<<1)^1); por(i,now); } void upd(int i,int dp[maxm][maxm]){ i+=kaf; por(i,dp); i>>=1; while(i>0){ calc(i); i>>=1; } } }seg; void init( int R, int C, int H[5000][200], int V[5000][200]) { n=R; m=C; for(int i=0;i<n;i++){ for(int j=0;j<m-1;j++){ allsq[i/t].updr(i%t,j,H[i][j]); } } for(int i=0;i<n-1;i++){ for(int j=0;j<m;j++){ allsq[i/t].updc(i%t,j,V[i][j]); } } for(int i=0;i<=(n-1)/t;i++){ allsq[i].calc(); seg.upd(i,allsq[i].dp); } } void changeH( int P, int Q, int W) { allsq[P/t].updr(P%t,Q,W); allsq[P/t].calc(); seg.upd(P/t,allsq[P/t].dp); } void changeV( int P, int Q, int W) { allsq[P/t].updc(P%t,Q,W); allsq[P/t].calc(); seg.upd(P/t,allsq[P/t].dp); } int escape( int V1, int V2) { V1++; V2++; return seg.seg[1][V1][V2]; }

Compilation message (stderr)

grader.c: In function 'int main()':
grader.c:15:6: warning: variable 'res' set but not used [-Wunused-but-set-variable]
   15 |  int res;
      |      ^~~
wombats.cpp: In constructor 'segment::segment()':
wombats.cpp:53:29: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
   53 |         for(int i=0;i<(1<<lg+1);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...