Submission #67599

#TimeUsernameProblemLanguageResultExecution timeMemory
67599CrownWombats (IOI13_wombats)C++14
55 / 100
20054 ms263168 KiB
#include "wombats.h" #include <bits/stdc++.h> using namespace std; #define X first #define Y second #define pb push_back typedef pair<int, int> ii; typedef long long ll; int n, m; const int maxn = 5005; const int maxm = 205; int H[maxn][maxm], V[maxn][maxm]; struct node { vector< vector<int> > dist; node(){} node(bool create) { if(create) { dist.assign(m, vector<int>(m, 1e9)); for(int i = 0; i< m; i++) dist[i][i] = 0; } } }; node st[4*maxn]; const int ub = 7; priority_queue< pair<int, ii> > pq; vector< vector<int> > tod; void dijk(int s, int r1, int r2, vector<int> &dist) { tod.assign(r2-r1+1, vector<int>(m, 1e9)); tod[0][s] = 0; pq.push(make_pair(0, ii(r1, s))); while(!pq.empty()) { auto f = pq.top(); pq.pop(); int d = -f.X, x = f.Y.X, y = f.Y.Y; if(d> tod[x-r1][y]) continue; if(y && H[x][y-1]+d< tod[x-r1][y-1]) { tod[x-r1][y-1] = H[x][y-1]+d; pq.push(make_pair(-tod[x-r1][y-1], ii(x, y-1))); } if(y+1< m && H[x][y]+d< tod[x-r1][y+1]) { tod[x-r1][y+1] = H[x][y]+d; pq.push(make_pair(-tod[x-r1][y+1], ii(x, y+1))); } if(x+1<= r2 && V[x][y]+d< tod[x+1-r1][y]) { tod[x+1-r1][y] = V[x][y]+d; pq.push(make_pair(-tod[x+1-r1][y], ii(x+1, y))); } } dist = tod.back(); } vector< vector<int> > opt; void merge(vector< vector<int> > &dist, vector< vector<int> > &d1, vector< vector<int> > &d2) { // printf("begun merging\n"); opt.assign(m, vector<int>(m, 0)); for(int diff = -m+1; diff<= m-1; diff++) { for(int i = 0; i< m; i++) { int j = i+diff; if(j< 0 || j>= m) continue; // printf("begun %d %d\n", i, j); dist[i][j] = 1e9; if(diff == -m+1) { for(int k = 0; k< m; k++) { if(d1[i][k]+d2[k][j]< dist[i][j]) { dist[i][j] = d1[i][k] + d2[k][j]; opt[i][j] = k; } } } else { for(int k = max(0, j?opt[i][j-1]:0); k<= min(m-1, i+1< m?opt[i+1][j]:m-1); k++) { //printf("k = %d\n", k); if(d1[i][k]+d2[k][j]< dist[i][j]) { dist[i][j] = d1[i][k] + d2[k][j]; opt[i][j] = k; } } } } } // printf("finished merging\n"); } void build(int p = 1, int L = 0, int R = n-1) { // printf("%d %d %d\n", p, L, R); st[p] = node(true); if(R-L+1<= ub) { for(int i = 0; i< m; i++) { dijk(i, L, R, st[p].dist[i]); } // printf("finished creating\n"); return; } build(p<<1, L, (L+R)>>1); build((p<<1)+1, (L+R)>>1, R); merge(st[p].dist, st[p<<1].dist, st[(p<<1)+1].dist); } void update(int x, int p = 1, int L = 0, int R = n-1) { if(R-L+1<= ub) { for(int i = 0; i< m; i++) { dijk(i, L, R, st[p].dist[i]); } return; } int M = (L+R)>>1; if(x<= M) update(x, p<<1, L, M); if(M<= x) update(x, (p<<1)+1, M, R); merge(st[p].dist, st[p<<1].dist, st[(p<<1)+1].dist); } 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+1< m; j++) { H[i][j] = h[i][j]; } } for(int i = 0; i+1< n; i++) { for(int j = 0; j< m; j++) { V[i][j] = v[i][j]; } } //printf("started initing\n"); build(); } void changeH(int P, int Q, int W) { //printf("changingH\n"); H[P][Q] = W; update(P); } void changeV(int P, int Q, int W) { //printf("changingV\n"); V[P][Q] = W; update(P); } int escape(int V1, int V2) { return st[1].dist[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]
  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...