Submission #358265

#TimeUsernameProblemLanguageResultExecution timeMemory
358265KerimWombats (IOI13_wombats)C++17
76 / 100
16760 ms262148 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]; node merge(node x,node y,int mid){ node z;z.fill(); 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=5; int odp[L][C]; void naive(int nd,int x,int y){ queue<PII>q;int nx,ny,id; for(int i=0;i<m;i++){ memset(odp,127,sizeof odp); q.push(mp(x,i));odp[0][i]=0; while(!q.empty()){ nx=q.front().ff;ny=q.front().ss;q.pop();id=nx-x; if(ny>0 and umin(odp[id][ny-1],odp[id][ny]+h[nx][ny-1])) q.push(mp(nx,ny-1)); if(ny+1<m and umin(odp[id][ny+1],odp[id][ny]+h[nx][ny])) q.push(mp(nx,ny+1)); if(nx<y and umin(odp[id+1][ny],odp[id][ny]+v[nx][ny])) q.push(mp(nx+1,ny)); } for(int j=0;j<m;j++) seg[nd].dp[i][j]=odp[y-x][j]; } } 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...