Submission #173006

#TimeUsernameProblemLanguageResultExecution timeMemory
173006Nightlight벽 (IOI14_wall)C++14
100 / 100
649 ms72884 KiB
#include "wall.h" #include <bits/stdc++.h> #define adds 1 #define remov 2 #define left(n) (n<<1) #define right(n) (n<<1|1) using namespace std; const int last = 1 << 21; const int szt = 5e6; const int maxn = 1<<21; const int inf = 0x3f3f3f3f; int ql, qr, state, val; struct segtree{ int mx[szt], mn[szt]; segtree() { memset(mx, inf, sizeof(mx)); } void go(int node) { if(state == 2) { mx[node] = min(mx[node], val); mn[node] = min(mn[node], val); }else { mx[node] = max(mx[node], val); mn[node] = max(mn[node], val); } } void merge(int par, int kid) { mx[kid] = min(mx[kid], mx[par]); mx[kid] = max(mx[kid], mn[par]); mn[kid] = max(mn[kid], mn[par]); mn[kid] = min(mn[kid], mx[par]); } void unlazy(int node) { merge(node, left(node)); merge(node, right(node)); mx[node] = inf; mn[node] = 0; } void update(int node, int l, int r) { if(ql <= l && r <= qr) { go(node); return; } unlazy(node); int mid = (l + r) >> 1; if(ql <= mid) update(left(node), l, mid); if(qr > mid) update(right(node), mid + 1, r); } void finish() { for(int i = 1; i < last; i++)unlazy(i); } }; segtree tree; void buildWall(int n, int k, int op[], int left[], int right[], int height[], int ans[]){ for(int i = 0; i < k; i++) { state = op[i], ql = left[i] + 1, qr = right[i] + 1, val = height[i]; // cout << state << " " << ql << " " << qr << " " << val << "\n"; tree.update(1, 1, last); } tree.finish(); int cnt = 0; for(int i = last; i < last + n; i++) { // ans[cnt++] = tree.mn[i]; ans[cnt++] = min(tree.mx[i], tree.mn[i]); } return; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...