Submission #540250

#TimeUsernameProblemLanguageResultExecution timeMemory
540250dxz05Wall (IOI14_wall)C++14
100 / 100
1179 ms88992 KiB
#include "wall.h" #include <bits/stdc++.h> using namespace std; struct node{ int mn; int mx; node(){ mn = 1e9; mx = -1e9; } }; const int N = 2e6 + 3e2; node t[4 * N]; void chmin(node &var, int val){ var.mn = min(var.mn, val); var.mx = min(var.mx, val); } void chmax(node &var, int val){ var.mn = max(var.mn, val); var.mx = max(var.mx, val); } void push(int v){ if (t[v].mn != 1e9){ chmin(t[v + v], t[v].mn); chmin(t[v + v + 1], t[v].mn); t[v].mn = 1e9; } if (t[v].mx != -1e9){ chmax(t[v + v], t[v].mx); chmax(t[v + v + 1], t[v].mx); t[v].mx = -1e9; } } void update(int v, int tl, int tr, int l, int r, int val, char type){ if (l <= tl && tr <= r){ if (type == '+'){ chmax(t[v], val); } else { chmin(t[v], val); } return; } if (tl > r || tr < l) return; push(v); int tm = (tl + tr) >> 1; update(v + v, tl, tm, l, r, val, type); update(v + v + 1, tm + 1, tr, l, r, val, type); } node get(int v, int tl, int tr, int pos){ if (tl == tr) return t[v]; push(v); int tm = (tl + tr) >> 1; if (pos <= tm) return get(v + v, tl, tm, pos); else return get(v + v + 1, tm + 1, tr, pos); } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){ for (int i = 0; i < n; i++){ update(1, 0, n - 1, i, i, 0, '+'); } for (int i = 0; i < k; i++){ update(1, 0, n - 1, left[i], right[i], height[i], op[i] == 1 ? '+' : '-'); } for (int i = 0; i < n; i++){ finalHeight[i] = get(1, 0, n - 1, i).mx; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...