Submission #698149

#TimeUsernameProblemLanguageResultExecution timeMemory
698149Hacv16Wall (IOI14_wall)C++17
8 / 100
3084 ms201760 KiB
#include <bits/stdc++.h> using namespace std; #define fr first #define sc second typedef long long ll; const int MAX = 2e6 + 15; const int INF = 0x3f3f3f3f; struct Node{ ll mn, mx, lzset; Node(ll a = 0, ll b = 0, ll c = -1) : mn(a), mx(b), lzset(c) {} Node operator + (Node other){ ll cmn = min(mn, other.mn); ll cmx = max(mx, other.mx); return Node(cmn, cmx); } }; Node seg[4 * MAX]; void refresh(ll p, ll l, ll r){ if(seg[p].lzset == -1) return; ll st = seg[p].lzset; seg[p].lzset = -1; seg[p].mn = st; seg[p].mx = st; if(l == r) return; ll e = 2 * p, d = e + 1; seg[e].lzset = st; seg[d].lzset = st; } void update(ll a, ll b, ll x, ll p, ll l, ll r, bool type){ refresh(p, l, r); if(a > r || b < l) return; bool change = (type ? (seg[p].mx < x) : (seg[p].mn > x)); if(l == r && !change) return; if(a <= l && r <= b && change){ seg[p].lzset = x; refresh(p, l, r); return; } ll m = (l + r) >> 1, e = 2 * p, d = e + 1; update(a, b, x, e, l, m, type); update(a, b, x, d, m + 1, r, type); seg[p] = seg[e] + seg[d]; } ll getVal(ll i, ll p, ll l, ll r){ refresh(p, l, r); if(l == r) return seg[p].mn; ll m = (l + r) >> 1, e = 2 * p, d = e + 1; refresh(e, l, m); refresh(d, m + 1, r); if(i <= m) return getVal(i, e, l, m); return getVal(i, d, m + 1, r); } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){ for(int i = 0; i < k; i++){ ll l = left[i] + 1, r = right[i] + 1, h = height[i]; if(op[i] == 1) update(l, r, h, 1, 1, n, 1); else update(l, r, h, 1, 1, n, 0); } for(int i = 0; i < n; i++) finalHeight[i] = getVal(i + 1, 1, 1, n); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...