제출 #1247955

#제출 시각아이디문제언어결과실행 시간메모리
1247955gs12117웜뱃 (IOI13_wombats)C++20
76 / 100
3257 ms176956 KiB
#include "wombats.h" int n, m; int ph[5130][210]; int pv[5130][210]; const int itsz = 512; int tarr[210]; struct stnode { int arr[200][200]; stnode operator+(const stnode& r)const { stnode res; for (int i = 0; i < m; i++) { tarr[i] = m - 1; } for (int i = m - 1; i >= 0; i--) { int larr = 0; for (int j = 0; j < m; j++) { int carr = -1; int cres = 2e9; for (int k = larr; k <= tarr[j]; k++) { int sres = arr[i][k] + r.arr[k][j]; if (cres > sres) { cres = sres; carr = k; } } res.arr[i][j] = cres; tarr[j] = carr; } } return res; } }; stnode st[1030]; int dp[210][210]; void buildnode(int x) { for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { dp[i][j] = 2e9; } dp[i][i] = 0; } for (int lv = x * 10; lv < x * 10 + 10; lv++) { for (int i = 0; i < m; i++) { for (int j = 0; j < m - 1; j++) { if (dp[i][j + 1] > dp[i][j] + ph[lv][j])dp[i][j + 1] = dp[i][j] + ph[lv][j]; } for (int j = m - 2; j >= 0; j--) { if (dp[i][j] > dp[i][j + 1] + ph[lv][j])dp[i][j] = dp[i][j + 1] + ph[lv][j]; } for (int j = 0; j < m; j++) { dp[i][j] += pv[lv][j]; } } } for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { st[x + itsz].arr[i][j] = dp[i][j]; } } } void refreshnode(int x) { buildnode(x); x += itsz; x /= 2; while (x >= 1) { st[x] = st[x * 2] + st[x * 2 + 1]; x /= 2; } } 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++) { ph[i][j] = H[i][j]; } } for (int i = n; i <= 5120; i++) { for (int j = 0; j < m - 1; j++) { ph[i][j] = 6e6; } } for (int i = 0; i < n - 1; i++) { for (int j = 0; j < m; j++) { pv[i][j] = V[i][j]; } } for (int i = n - 1; i <= 5120; i++) { for (int j = 0; j < m; j++) { pv[i][j] = 0; } } for (int i = 0; i < itsz; i++) { buildnode(i); } for (int i = itsz - 1; i >= 1; i--) { st[i] = st[i * 2] + st[i * 2 + 1]; } } void changeH(int P, int Q, int W) { ph[P][Q] = W; refreshnode(P / 10); } void changeV(int P, int Q, int W) { pv[P][Q] = W; refreshnode(P / 10); } int escape(int V1, int V2) { return st[1].arr[V1][V2]; }
#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...