Submission #358282

#TimeUsernameProblemLanguageResultExecution timeMemory
358282KerimWombats (IOI13_wombats)C++17
55 / 100
20088 ms86028 KiB
#include "wombats.h" #include "bits/stdc++.h" #define MAXN 100009 #define INF 1000000007 #define mp(x,y) make_pair(x,y) #define all(v) v.begin(),v.end() #define pb(x) push_back(x) #define wr cout<<"----------------"<<endl; #define ppb() pop_back() #define tr(ii,c) for(__typeof((c).begin()) ii=(c).begin();ii!=(c).end();ii++) #define ff first #define ss second #define my_little_dodge 46 #define debug(x) cerr<< #x <<" = "<< x<<endl; using namespace std; typedef long long ll; typedef pair<int,int> PII; template<class T>bool umin(T& a,T b){if(a>b){a=b;return 1;}return 0;} template<class T>bool umax(T& a,T b){if(a<b){a=b;return 1;}return 0;} const int R=5005,C=202; int h[R][C],v[R][C],n,m; struct node{ vector<vector<int> >dp; void init(){ dp.resize(m); for(int i=0;i<m;i++) dp[i].resize(m); } void fill(){ init(); for(int i=0;i<m;i++) for(int j=0;j<m;j++) dp[i][j]=INF; } void print(){ for(int i=0;i<m;i++){ for(int j=0;j<m;j++) printf("%d ",dp[i][j]); puts(""); } } }seg[R<<2]; int opt[C][C]; node merge(node x,node y,int mid){ node z;z.fill(); for(int len=0;len<m;len++){ for(int i=0,k;i+len<m;i++){ k=i+len; if(i==k){ for(int j=0;j<m;j++) if(umin(z.dp[i][k],x.dp[i][j]+v[mid][j]+y.dp[j][k])) opt[i][k]=j; } else{ for(int j=opt[i][k-1];j<=opt[i+1][k];j++) if(umin(z.dp[i][k],x.dp[i][j]+v[mid][j]+y.dp[j][k])) opt[i][k]=j; for(int j=opt[k-1][i];j<=opt[k][i+1];j++) if(umin(z.dp[k][i],x.dp[k][j]+v[mid][j]+y.dp[j][i])) opt[k][i]=j; } } } for(int i=0;i<m;i++) for(int j=0;j<m;j++) for(int k=0;k<m;k++) umin(z.dp[i][k],x.dp[i][j]+v[mid][j]+y.dp[j][k]); return z; } const int L=10; int odp[L][C]; node noob(int x){ node z;z.init(); for(int i=0;i<m;i++){ int cur=0; for(int j=i;j<m;j++){ z.dp[i][j]=cur; if(j<m-1) cur+=h[x][j]; }cur=0; for(int j=i-1;j>=0;j--){ cur+=h[x][j]; z.dp[i][j]=cur; } } return z; } void naive(int nd,int x,int y){ seg[nd]=noob(x); for(int i=x;i<y;i++) seg[nd]=merge(seg[nd],noob(i+1),i); } void build(int nd,int x,int y){ seg[nd].init(); if(y-x<L){ naive(nd,x,y); return; } int mid=(x+y)>>1; build(nd<<1,x,mid); build(nd<<1|1,mid+1,y); seg[nd]=merge(seg[nd<<1],seg[nd<<1|1],mid); } void upd(int p,int nd,int x,int y){ if(y-x<L){ naive(nd,x,y); return; } int mid=(x+y)>>1; if(p<=mid)upd(p,nd<<1,x,mid); else upd(p,nd<<1|1,mid+1,y); seg[nd]=merge(seg[nd<<1],seg[nd<<1|1],mid); } 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++) h[i][j]=H[i][j]; for(int i=0;i<n-1;i++) for(int j=0;j<m;j++) v[i][j]=V[i][j]; build(1,0,n-1); } void changeH(int P, int Q, int W) { h[P][Q]=W;upd(P,1,0,n-1); } void changeV(int P, int Q, int W) { v[P][Q]=W;upd(P,1,0,n-1); } int escape(int V1, int V2) { return seg[1].dp[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;
      |      ^~~
#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...