Submission #1205587

#TimeUsernameProblemLanguageResultExecution timeMemory
1205587andrejikusWall (IOI14_wall)C++20
100 / 100
591 ms89168 KiB
#include <bits/stdc++.h> #include "wall.h" using namespace std; typedef long long ll; void DBG() { cerr << "]" << endl; } template<class H, class... T> void DBG(H h, T... t) { cerr << to_string(h); if(sizeof...(t)) cerr << ", "; DBG(t...); } #define dbg(...) cerr << "[" << #__VA_ARGS__ << "]: [", DBG(__VA_ARGS__) const int N = 2e6 + 3; const int inf = 1e9; struct node { int opmax, opmin; }; struct segtree { vector<node> op; int size_s = 1; void init(int n) { while (size_s <= n) size_s *= 2; op.assign(4*N, {0, inf}); } void propagate(int x, int lx, int rx) { if (rx - lx == 1) return; op[x*2+1] = {min(op[x].opmin, max(op[x*2+1].opmax, op[x].opmax)), max(op[x].opmax, min(op[x*2+1].opmin, op[x].opmin))}; op[x*2+2] = {min(op[x].opmin, max(op[x*2+2].opmax, op[x].opmax)), max(op[x].opmax, min(op[x*2+2].opmin, op[x].opmin))}; op[x] = {0, inf}; } void minimum(int x, int lx, int rx, int l, int r, int v) { if (lx >= r || rx <= l) return; if (lx >= l && rx <= r) { op[x].opmin = min(op[x].opmin, v); op[x].opmax = min(op[x].opmax, v); return; } propagate(x, lx, rx); int m = (lx + rx) / 2; minimum(x * 2 + 1, lx, m, l, r, v); minimum(x * 2 + 2, m, rx, l, r, v); } void minimum(int l, int r, int v) { minimum(0, 0, N, l, r+1, v); } void maksimum(int x, int lx, int rx, int l, int r, int v) { //dbg(size_s, lx, rx, l, r); if (lx >= r || rx <= l) return; if (lx >= l && rx <= r) { op[x].opmin = max(op[x].opmin, v); op[x].opmax = max(op[x].opmax, v); return; } propagate(x, lx, rx); int m = (lx + rx) / 2; maksimum(x * 2 + 1, lx, m, l, r, v); maksimum(x * 2 + 2, m, rx, l, r, v); } void maksimum(int l, int r, int v) { maksimum(0, 0, N, l, r+1, v); } int get(int x, int lx, int rx, int i) { if (rx - lx == 1) return op[x].opmax; propagate(x, lx, rx); int m = (lx + rx) / 2; if (i < m) return get(x * 2 + 1, lx, m, i); else return get(x * 2 + 2, m, rx, i); } int get(int i) { return get(0, 0, N, i); } }; segtree seg; void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]) { seg.init(n); for (int i = 0; i < k; i++) { int l = left[i], r = right[i], h = height[i]; if (op[i] == 1) seg.maksimum(l, r, h); else seg.minimum(l, r, h); } for (int i = 0; i < n; i++) { finalHeight[i] = seg.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...