Submission #623362

#TimeUsernameProblemLanguageResultExecution timeMemory
623362M_WWall (IOI14_wall)C++17
100 / 100
844 ms132132 KiB
#include <bits/stdc++.h> #include "wall.h" #define ii pair<int, int> using namespace std; int t[2000002 << 2][2], lazy[2000002 << 2][2]; // lower, upper void push(int v){ // Do something if(lazy[v][0] == 0 && lazy[v][1] == INT_MAX) return; t[v * 2][0] = max(t[v * 2][0], lazy[v][0]); t[v * 2 + 1][0] = max(t[v * 2 + 1][0], lazy[v][0]); t[v * 2][1] = max(t[v * 2][1], lazy[v][0]); t[v * 2 + 1][1] = max(t[v * 2 + 1][1], lazy[v][0]); lazy[v * 2][0] = max(lazy[v * 2][0], lazy[v][0]); lazy[v * 2 + 1][0] = max(lazy[v * 2 + 1][0], lazy[v][0]); lazy[v * 2][1] = max(lazy[v * 2][1], lazy[v][0]); lazy[v * 2 + 1][1] = max(lazy[v * 2 + 1][1], lazy[v][0]); t[v * 2][0] = min(t[v * 2][0], lazy[v][1]); t[v * 2 + 1][0] = min(t[v * 2 + 1][0], lazy[v][1]); t[v * 2][1] = min(t[v * 2][1], lazy[v][1]); t[v * 2 + 1][1] = min(t[v * 2 + 1][1], lazy[v][1]); lazy[v * 2][0] = min(lazy[v * 2][0], lazy[v][1]); lazy[v * 2 + 1][0] = min(lazy[v * 2 + 1][0], lazy[v][1]); lazy[v * 2][1] = min(lazy[v * 2][1], lazy[v][1]); lazy[v * 2 + 1][1] = min(lazy[v * 2 + 1][1], lazy[v][1]); lazy[v][0] = 0; lazy[v][1] = INT_MAX; } void ins(int v, int tl, int tr, int l, int r, int type, int val){ if(l > r) return; if(tl == l && tr == r){ if(type == 1){ // shift lower t[v][0] = max(t[v][0], val); t[v][1] = max(t[v][1], val); lazy[v][0] = max(lazy[v][0], val); lazy[v][1] = max(lazy[v][1], val); } else{ // shift upper; t[v][0] = min(t[v][0], val); t[v][1] = min(t[v][1], val); lazy[v][0] = min(lazy[v][0], val); lazy[v][1] = min(lazy[v][1], val); } return; } push(v); int tm = (tl + tr) >> 1; ins(v * 2, tl, tm, l, min(r, tm), type, val); ins(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r, type, val); t[v][0] = min(t[v * 2][0], t[v * 2 + 1][0]); t[v][1] = max(t[v * 2][1], t[v * 2 + 1][1]); } int query(int v, int tl, int tr, int pos){ if(tl == pos && tr == pos) return t[v][0]; push(v); int tm = (tl + tr) >> 1; if(pos <= tm) return query(v * 2, tl, tm, pos); else return query(v * 2 + 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 << 2; i++) lazy[i][1] = INT_MAX; for(int i = 0; i < k; i++){ ins(1, 0, n - 1, left[i], right[i], op[i], height[i]); } for(int i = 0; i < n; i++){ finalHeight[i] = query(1, 0, n - 1, 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...