Submission #786833

#TimeUsernameProblemLanguageResultExecution timeMemory
786833drdilyorWombats (IOI13_wombats)C++17
55 / 100
20027 ms16716 KiB
#pragma GCC optimize("Ofast") #pragma GCC target("avx,avx2,fma") #include<bits/stdc++.h> #include "wombats.h" using namespace std; using ll = long long; const int inf = 1e9 + 1000; struct SegmentTree { using T = int; using S = int; const T id = inf; inline T single(S v) { return v; } T merge(const T& l, const T& r) { return min(l, r); } int n; vector<T> tree; SegmentTree(int n) : n(n) { tree.resize(n * 2, id); build(); } SegmentTree(vector<S> arr) : n(arr.size()) { tree.resize(n * 2, id); for (int i = 0; i < n; i++) { tree[i + n] = single(arr[i]); } build(); } void build() { for (int i = n-1; i >= 1; i--) { tree[i] = merge(tree[i*2], tree[i*2 + 1]); } } void update(int i, S v) { tree[i+=n] = single(v); for (i /= 2; i >= 1; i/= 2) tree[i] = merge(tree[i*2], tree[i*2+1]); } T query(int l, int r) { T left = id, right = id; l += n; r += n; while (l <= r) { if (l % 2 == 1) left = merge(left, tree[l++]); if (r % 2 == 0) right = merge(right, tree[r--]); l /= 2; r /= 2; } return merge(left, right); } int find_first(function<bool(T&)> predicate, int last = 0) { int v = 1; while (v < n) { if (predicate(tree[v*2 + last])) v = v*2 + last; else if (predicate(tree[v*2 + !last])) v = v*2 + !last; else return -1; } return v; } }; struct Fenwick { int n; vector<int> tree; Fenwick() = default; Fenwick(int n) : n(n) { tree.assign(n, 0); } void inc(int pos, ll val) { for (; pos < n; pos |= (pos + 1)) { tree[pos] += val; } } int sum(int r) { // [0, r] ll ans = 0; for (; r >= 0; r = (r & (r + 1)) - 1) { ans += tree[r]; } return ans; } int sum(int l, int r) { // [l, r] return sum(r) - sum(l - 1); } int operator[](int index) { return sum(index) - sum(index-1); }; }; int r, c; vector<Fenwick> level; vector<Fenwick> pass; vector<vector<ll>> dist; vector<int> dirty; void update(int v2) { if (!dirty[v2]) return; dirty[v2] = 0; vector<int> dp(c, inf); dp[v2] = 0; SegmentTree st(c); for (int i = r-1; i >= 0; i--) { auto sum = [&](int r) { return level[i].sum(r); }; vector<int> ndp(dp); for (int j = 0; j < c; j++) { int mn = st.query(0, j-1); ndp[j] = min(ndp[j], mn + sum(j-1)); st.update(j, dp[j] - sum(j - 1)); } for (int j = c-1; j >= 0; j--) { int mn = st.query(j+1, c-1); ndp[j] = min(ndp[j], mn - sum(j-1)); st.update(j, dp[j] + sum(j-1)); } for (int j = 0; j < c; j++) { if (i) ndp[j] += pass[i-1][j]; } dp.swap(ndp); } for (int v1 = 0; v1 < c; v1++) dist[v1][v2] = dp[v1]; } void init(int32_t r, int32_t c, int32_t h[5000][200], int32_t v[5000][200]) { ::r = r; ::c = c; level.resize(r); for (int i = 0; i < r; i++) { level[i] = Fenwick(c); for (int j = 0; j < c-1; j++) { level[i].inc(j, h[i][j]); } } pass.resize(r-1); for (int i = 0; i < r-1; i++) { pass[i] = Fenwick(c); for (int j = 0; j < c; j++) { pass[i].inc(j, v[i][j]); } } dirty.assign(c, 1); dist = vector(c, vector(c, 0ll)); } void changeH(int32_t p, int32_t q, int32_t w) { level[p].inc(q, w - level[p][q]); dirty.assign(c, 1); } void changeV(int32_t p, int32_t q, int32_t w) { pass[p].inc(q, w - pass[p][q]); dirty.assign(c, 1); } int32_t escape(int32_t v1, int32_t v2) { update(v2); return dist[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...