Submission #1006627

#TimeUsernameProblemLanguageResultExecution timeMemory
1006627The_SamuraiWall (IOI14_wall)C++17
24 / 100
300 ms11412 KiB
#include "wall.h" #include "bits/stdc++.h" using namespace std; const int inf = 2e9; vector<int> mn, mx; int sz; // first mx, then mn void impact(int x, int op, int v) { if (op == 1) { mx[x] = max(mx[x], v); if (mn[x] <= v) { mn[x] = inf; } } else { mn[x] = min(mn[x], v); if (mx[x] >= mn[x]) mx[x] = mn[x]; } } void propagate(int x) { if (mx[x] != 0) { impact(2 * x + 1, 1, mx[x]); impact(2 * x + 2, 1, mx[x]); mx[x] = 0; } if (mn[x] != inf) { impact(2 * x + 1, 2, mn[x]); impact(2 * x + 2, 2, mn[x]); mn[x] = inf; } } void upd(int l, int r, int op, int v, int x, int lx, int rx) { if (l >= rx or lx >= r) return; if (l <= lx and rx <= r) { impact(x, op, v); return; } propagate(x); int mid = (lx + rx) >> 1; upd(l, r, op, v, 2 * x + 1, lx, mid); upd(l, r, op, v, 2 * x + 2, mid, rx); } int get(int i, int x, int lx, int rx) { if (rx - lx == 1) { return min(mx[x], mn[x]); } propagate(x); int mid = (lx + rx) >> 1; if (i < mid) return get(i, 2 * x + 1, lx, mid); return get(i, 2 * x + 2, mid, rx); } void buildWall(int n, int q, int op[], int left[], int right[], int height[], int finalHeight[]) { sz = 1; while (sz < n) sz *= 2; mn.assign(2 * sz, inf); mx.assign(2 * sz, 0); for (int i = 0; i < q; i++) { upd(left[i], right[i] + 1, op[i], height[i], 0, 0, sz); } for (int i = 0; i < n; i++) { finalHeight[i] = get(i, 0, 0, sz); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...