Submission #763446

#TimeUsernameProblemLanguageResultExecution timeMemory
763446SanguineChameleonWombats (IOI13_wombats)C++17
100 / 100
3256 ms122504 KiB
#include "wombats.h" #include <bits/stdc++.h> using namespace std; const int inf = 1e9 + 20; const int maxN = 5e3 + 20; const int maxM = 2e2 + 20; const int block = 20; int hor[maxN][maxM]; int ver[maxN][maxM]; int tmp[maxN][maxM]; int dp[maxN][maxM]; int opt[maxM][maxM]; int tree[maxN / block * 4][maxM][maxM]; int N, M; void calc(int id, int lt, int rt) { for (int X = 0; X < M; X++) { dp[lt][X] = 0; for (int i = X - 1; i >= 0; i--) { dp[lt][i] = dp[lt][i + 1] + hor[lt][i]; } for (int i = X + 1; i < M; i++) { dp[lt][i] = dp[lt][i - 1] + hor[lt][i - 1]; } for (int i = lt + 1; i <= rt; i++) { for (int j = 0; j < M; j++) { tmp[i][j] = dp[i - 1][j] + ver[i - 1][j]; dp[i][j] = tmp[i][j]; } int best = tmp[i][0]; for (int j = 1; j < M; j++) { best = min(best + hor[i][j - 1], tmp[i][j]); dp[i][j] = min(dp[i][j], best); } best = tmp[i][M - 1]; for (int j = M - 2; j >= 0; j--) { best = min(best + hor[i][j], tmp[i][j]); dp[i][j] = min(dp[i][j], best); } } for (int Y = 0; Y < M; Y++) { tree[id][X][Y] = dp[rt][Y]; } } } void merge(int id, int mt) { for (int X = 0; X < M; X++) { for (int Y = 0; Y < M; Y++) { tree[id][X][Y] = inf; } } for (int X = 0; X < M; X++) { for (int Z = (X > 0 ? opt[X - 1][X - 1] : 0); Z < M; Z++) { int cur = tree[id * 2][X][Z] + ver[mt][Z] + tree[id * 2 + 1][Z][X]; if (cur < tree[id][X][X]) { tree[id][X][X] = cur; opt[X][X] = Z; } } } for (int diff = 1; diff < M; diff++) { for (int X = 0, Y = diff; Y < M; X++, Y++) { for (int Z = opt[X][Y - 1]; Z <= opt[X + 1][Y]; Z++) { int cur = tree[id * 2][X][Z] + ver[mt][Z] + tree[id * 2 + 1][Z][Y]; if (cur < tree[id][X][Y]) { tree[id][X][Y] = cur; opt[X][Y] = Z; } } } for (int X = diff, Y = 0; X < M; X++, Y++) { for (int Z = opt[X - 1][Y]; Z <= opt[X][Y + 1]; Z++) { int cur = tree[id * 2][X][Z] + ver[mt][Z] + tree[id * 2 + 1][Z][Y]; if (cur < tree[id][X][Y]) { tree[id][X][Y] = cur; opt[X][Y] = Z; } } } } } void build(int id, int lt, int rt) { if (lt == rt) { calc(id, lt * block, min(N - 1, lt * block + block - 1)); return; } int mt = (lt + rt) / 2; build(id * 2, lt, mt); build(id * 2 + 1, mt + 1, rt); merge(id, mt * block + block - 1); } void update(int id, int lt, int rt, int pos) { if (lt == rt) { calc(id, lt * block, min(N - 1, lt * block + block - 1)); return; } int mt = (lt + rt) / 2; if (pos <= mt) { update(id * 2, lt, mt, pos); } else { update(id * 2 + 1, mt + 1, rt, pos); } merge(id, mt * block + block - 1); } 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++) { hor[i][j] = H[i][j]; } } for (int i = 0; i < N - 1; i++) { for (int j = 0; j < M; j++) { ver[i][j] = V[i][j]; } } build(1, 0, (N - 1) / block); } void changeH(int P, int Q, int W) { hor[P][Q] = W; update(1, 0, (N - 1) / block, P / block); } void changeV(int P, int Q, int W) { ver[P][Q] = W; update(1, 0, (N - 1) / block, P / block); } int escape(int X, int Y) { return tree[1][X][Y]; }

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...