Submission #116128

#TimeUsernameProblemLanguageResultExecution timeMemory
116128BruteforcemanWombats (IOI13_wombats)C++11
100 / 100
8511 ms194828 KiB
#include "wombats.h" #include "bits/stdc++.h" using namespace std; #define left lft #define right ryt #define div damn int t[505 * 2][205][205]; int R, C; int H[5005][205]; int V[5005][205]; int dp[105][205][205]; const int inf = 1e9; const int leaf = 10; int start, div, node, left, right; void solver(int b, int e, int from, int to) { if(b > e) return ; int mid = (b + e) >> 1; int opt = -1; int cost = inf; for(int i = from; i <= to; i++) { int sum = t[left][start][i] + V[div][i] + t[right][i][mid]; if(sum < cost) { cost = sum; opt = i; } } t[node][start][mid] = cost; solver(b, mid - 1, from, opt); solver(mid + 1, e, opt, to); } void transition(int c, int b, int e) { left = c << 1; right = left + 1; div = (b + e) >> 1; node = c; for(int i = 0; i < C; i++) { start = i; solver(0, C - 1, 0, C - 1); } } void solve(int c, int b, int e) { for(int x = 0; x < C; x++) { for(int j = 0; j < C; j++) { dp[0][x][j] = 0; for(int k = min(x, j); k < max(x, j); k++) { dp[0][x][j] += H[b][k]; } } } for(int i = b + 1; i <= e; i++) { for(int x = 0; x < C; x++) { for(int j = 0; j < C; j++) { dp[i - b][x][j] = inf; } int sum = 0; int opt = inf; for(int j = 0; j < C; j++) { opt = min(opt, -sum + dp[i - b - 1][x][j] + V[i - 1][j]); dp[i - b][x][j] = min(dp[i - b][x][j], opt + sum); sum += H[i][j]; } sum = 0; opt = inf; for(int j = C - 1; j >= 0; j--) { sum += H[i][j]; opt = min(opt, -sum + dp[i - b - 1][x][j] + V[i - 1][j]); dp[i - b][x][j] = min(dp[i - b][x][j], opt + sum); } } } for(int i = 0; i < C; i++) { for(int j = 0; j < C; j++) { t[c][i][j] = dp[e - b][i][j]; } } } void build(int c = 1, int b = 0, int e = R - 1) { if(b == e || ((c << 1) + 1) >= 1000) { solve(c, b, e); return ; } int m = (b + e) >> 1; int l = c << 1; int r = l + 1; build(l, b, m); build(r, m+1, e); transition(c, b, e); } void update(int x, int c = 1, int b = 0, int e = R - 1) { if(b == e || ((c << 1) + 1) >= 1000) { solve(c, b, e); return ; } int m = (b + e) >> 1; int l = c << 1; int r = l + 1; if(x <= m) update(x, l, b, m); else update(x, r, m+1, e); transition(c, b, e); } 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]; } } build(); } void changeH(int x, int y, int p) { H[x][y] = p; update(x); } void changeV(int x, int y, int p) { V[x][y] = p; update(x + 1); } int escape(int x, int y) { return t[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]
  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...