Submission #591027

#TimeUsernameProblemLanguageResultExecution timeMemory
591027TemmieWombats (IOI13_wombats)C++17
76 / 100
20063 ms81832 KiB
#include "wombats.h" #include <bits/stdc++.h> constexpr const int BS = 30; int r, c; std::vector <std::vector <int>> h, v; struct Block { int sc = -1, ec = -1; std::vector <std::vector <int>> con; Block(bool empty = false) : con(!empty * c, std::vector <int> (c, 1 << 30)) { } void update(int _sc, int _ec) { sc = _sc; ec = _ec; for (int i = 0; i < c; i++) { for (int j = 0; j < c; j++) { con[i][j] = 1 << 30; } } for (int j = 0; j < c; j++) { con[j][j] = 0; } for (int i = ec; i >= sc; i--) { std::vector <std::vector <int>> nxt(c, std::vector <int> (c, 1 << 30)); if (i == ec) { for (int j = 0; j < c; j++) { nxt[j][j] = 0; } } for (int j = 0; j < c; j++) { if (i != ec) { for (int k = 0; k < c; k++) { nxt[j][k] = std::min(nxt[j][k], con[j][k] + v[i][j]); } } if (j) { for (int k = 0; k < c; k++) { nxt[j][k] = std::min(nxt[j][k], nxt[j - 1][k] + h[i][j - 1]); } } } for (int j = c - 1; j >= 0; j--) { if (j + 1 < c) { for (int k = 0; k < c; k++) { nxt[j][k] = std::min(nxt[j][k], nxt[j + 1][k] + h[i][j]); } } } std::swap(con, nxt); } } friend Block merge(const Block& upper, const Block& lower) { if (!upper.con.empty() && lower.con.empty()) { return upper; } if (upper.con.empty()) { assert(lower.con.empty()); return Block(true); } Block res; res.sc = upper.sc; res.ec = lower.ec; std::vector <std::vector <int>> ine(c, std::vector <int> (c, 1 << 30)); { for (int j = 0; j < c; j++) { for (int k = 0; k < c; k++) { ine[j][k] = std::min(ine[j][k], lower.con[j][k] + v[upper.ec][j]); } if (j) { for (int k = 0; k < c; k++) { ine[j][k] = std::min(ine[j][k], ine[j - 1][k] + h[upper.ec][j - 1]); } } } for (int j = c - 1; j >= 0; j--) { if (j + 1 < c) { for (int k = 0; k < c; k++) { ine[j][k] = std::min(ine[j][k], ine[j + 1][k] + h[upper.ec][j]); } } } } for (int i = 0; i < c; i++) { for (int j = 0; j < c; j++) { for (int k = 0; k < c; k++) { res.con[i][k] = std::min(res.con[i][k], upper.con[i][j] + ine[j][k]); } } } return res; } }; struct Seg { int size; std::vector <Block> v; Seg(int s) { size = 1; while (size < s) { size <<= 1; } v.resize(size << 1, Block(true)); build(0, 0, size); } void build(int now, int li, int ri) { if (!(ri - li - 1)) { if (li * BS < r) { v[now] = Block(); v[now].update(li * BS, std::min(r - 1, (li + 1) * BS - 1)); } return; } int mid = (li + ri) >> 1; build(now * 2 + 1, li, mid); build(now * 2 + 2, mid, ri); v[now] = merge(v[now * 2 + 1], v[now * 2 + 2]); } void update(int ind) { update(ind, 0, 0, size); } void update(int ind, int now, int li, int ri) { if (!(ri - li - 1)) { v[now].update(ind * BS, std::min(r - 1, (ind + 1) * BS - 1)); return; } int mid = (li + ri) >> 1; if (ind < mid) { update(ind, now * 2 + 1, li, mid); } else { update(ind, now * 2 + 2, mid, ri); } v[now] = merge(v[now * 2 + 1], v[now * 2 + 2]); } }; Seg* seg; void init(int R, int C, int H[5000][200], int V[5000][200]) { r = R; c = C; h.resize(r, std::vector <int> (c - 1)); v.resize(r - 1, std::vector <int> (c)); for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { if (j < c - 1) { h[i][j] = H[i][j]; } if (i < r - 1) { v[i][j] = V[i][j]; } } } seg = new Seg((r + BS - 1) / BS); } void changeH(int p, int q, int w) { h[p][q] = w; seg->update(p / BS); } void changeV(int p, int q, int w) { v[p][q] = w; seg->update(p / BS); } int escape(int v1, int v2) { return seg->v[0].con[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]
   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...