제출 #1036417

#제출 시각아이디문제언어결과실행 시간메모리
1036417hmm789웜뱃 (IOI13_wombats)C++14
100 / 100
2410 ms110488 KiB
#include <bits/stdc++.h> #include "wombats.h" using namespace std; #define INF 2000000000 const int B = 20; int h[5000][200], v[5000][200], bl[5000], br[5000], pos[5000], r, c; struct node { int s, e, m; vector<vector<int>> f; node *l, *r; node(int _s, int _e) { s = _s, e = _e, m = (s+e)/2; for(int i = 0; i < 200; i++) { vector<int> v(200); f.push_back(v); } if(s != e) { l = new node(s, m); r = new node(m+1, e); merge(l->f, r->f, f); } else { build(s); } } void build(int s) { for(int i = 0; i < c; i++) { for(int j = i, res = 0; j < c; j++, res += h[bl[s]][j-1]) f[i][j] = res; for(int j = i, res = 0; j >= 0; j--, res += h[bl[s]][j]) f[i][j] = res; for(int j = 0; j < c; j++) f[i][j] += v[bl[s]][j]; for(int k = bl[s]+1; k <= br[s]; k++) { for(int j = 1; j < c; j++) f[i][j] = min(f[i][j], f[i][j-1] + h[k][j-1]); for(int j = c-2; j >= 0; j--) f[i][j] = min(f[i][j], f[i][j+1] + h[k][j]); for(int j = 0; j < c; j++) f[i][j] += v[k][j]; } } } void merge(vector<vector<int>> &a, vector<vector<int>> &b, vector<vector<int>> &f) { for(int i = 0; i < c; i++) for(int j = 0; j < c; j++) f[i][j] = INF; int p[c][c]; memset(p, -1, sizeof(p)); for(int i = 0; i < c; i++) { for(int j = c-1; j >= 0; j--) { int st = (i && p[i-1][j] != -1 ? p[i-1][j] : 0); int ed = (j != c-1 && p[i][j+1] != -1 ? p[i][j+1] : c-1); for(int k = st; k <= ed; k++) if(f[i][j] > a[i][k] + b[k][j]) { f[i][j] = a[i][k] + b[k][j]; p[i][j] = k; } } } } void update(int x) { if(s == e) {build(s); return;} else if(x > m) r->update(x); else l->update(x); merge(l->f, r->f, f); } } *root; void init(int R, int C, int H[5000][200], int V[5000][200]) { r = R; c = C; for(int i = 0; i < r; i++) for(int j = 0; j < c-1; j++) h[i][j] = H[i][j]; for(int i = 0; i < r-1; i++) for(int j = 0; j < c; j++) v[i][j] = V[i][j]; int cnt = (r-1)/B + 1; for(int i = 0; i < cnt; i++) { bl[i] = i*B; br[i] = min((i+1)*B-1, r-1); } for(int i = 0; i < cnt; i++) { for(int j = bl[i]; j <= br[i]; j++) pos[j] = i; } root = new node(0, cnt-1); } void changeH(int P, int Q, int W) { h[P][Q] = W; root->update(pos[P]); } void changeV(int P, int Q, int W) { v[P][Q] = W; root->update(pos[P]); } int escape(int V1, int V2) { return root->f[V1][V2]; }

컴파일 시 표준 에러 (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...