Submission #538364

#TimeUsernameProblemLanguageResultExecution timeMemory
538364timreizinWall (IOI14_wall)C++17
100 / 100
1658 ms151740 KiB
#include "wall.h" #include <vector> using namespace std; struct SegTree { int n; vector<pair<int, int>> tree; vector<pair<int, int>> mod; SegTree(int _n) : n(_n) { tree.resize(4 * n + 5, {0, 1e5}); mod.resize(4 * n + 5, {0, 1e5}); } void push(int v) { tree[v << 1].first = max(tree[v << 1].first, mod[v].first); tree[v << 1].second = max(tree[v << 1].second, mod[v].first); tree[v << 1 | 1].first = max(tree[v << 1 | 1].first, mod[v].first); tree[v << 1 | 1].second = max(tree[v << 1 | 1].second, mod[v].first); tree[v << 1].first = min(tree[v << 1].first, mod[v].second); tree[v << 1].second = min(tree[v << 1].second, mod[v].second); tree[v << 1 | 1].first = min(tree[v << 1 | 1].first, mod[v].second); tree[v << 1 | 1].second = min(tree[v << 1 | 1].second, mod[v].second); mod[v << 1].first = max(mod[v << 1].first, mod[v].first); mod[v << 1].second = max(mod[v << 1].second, mod[v].first); mod[v << 1 | 1].first = max(mod[v << 1 | 1].first, mod[v].first); mod[v << 1 | 1].second = max(mod[v << 1 | 1].second, mod[v].first); mod[v << 1].first = min(mod[v << 1].first, mod[v].second); mod[v << 1].second = min(mod[v << 1].second, mod[v].second); mod[v << 1 | 1].first = min(mod[v << 1 | 1].first, mod[v].second); mod[v << 1 | 1].second = min(mod[v << 1 | 1].second, mod[v].second); mod[v] = {0, 1e5}; } void updateMax(int a, int b, int val, int v, int l, int r) { if (a > r || b < l) return; if (a == l && b == r) { //make >= val tree[v].first = max(tree[v].first, val); tree[v].second = max(tree[v].second, val); mod[v].first = max(mod[v].first, val); mod[v].second = max(mod[v].second, val); return; } push(v); int m = (l + r) >> 1; updateMax(a, min(b, m), val, v << 1, l, m); updateMax(max(a, m + 1), b, val, v << 1 | 1, m + 1, r); } void updateMax(int a, int b, int val) { updateMax(a, b, val, 1, 0, n - 1); } void updateMin(int a, int b, int val, int v, int l, int r) { if (a > r || b < l) return; if (a == l && b == r) { //make <= val tree[v].first = min(tree[v].first, val); tree[v].second = min(tree[v].second, val); mod[v].first = min(mod[v].first, val); mod[v].second = min(mod[v].second, val); return; } push(v); int m = (l + r) >> 1; updateMin(a, min(b, m), val, v << 1, l, m); updateMin(max(a, m + 1), b, val, v << 1 | 1, m + 1, r); } void updateMin(int a, int b, int val) { updateMin(a, b, val, 1, 0, n - 1); } pair<int, int> get(int p, int v, int l, int r) { if (l == r) return tree[v]; push(v); int m = (l + r) >> 1; if (p <= m) return get(p, v << 1, l, m); return get(p, v << 1 | 1, m + 1, r); } int get(int p) { auto [l, r] = get(p, 1, 0, n - 1); return l; } }; void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]) { SegTree st(n); for (int i = 0; i < k; ++i) { if (op[i] == 1) st.updateMax(left[i], right[i], height[i]); else st.updateMin(left[i], right[i], height[i]); } for (int i = 0; i < n; ++i) finalHeight[i] = st.get(i); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...