Submission #997779

#TimeUsernameProblemLanguageResultExecution timeMemory
997779coolboy19521Wall (IOI14_wall)C++17
100 / 100
1002 ms262144 KiB
#include "bits/stdc++.h" #include "wall.h" using namespace std; const int sz = 5e6; struct que { int ad, rm; que() : ad(INT_MIN), rm(INT_MAX) {} que(int le, int ri) : ad(le), rm(ri) {} }; int st[sz * 4]; que lz[sz * 4]; void merge(que& le, que& ri) { // le.ad = max(le.ad, ri.ad); // le.rm = min(le.rm, ri.rm); // le.ad = min(le.ad, le.rm); le.rm = min(le.rm, ri.rm); le.rm = max(le.rm, ri.ad); le.ad = max(le.ad, ri.ad); le.ad = min(le.ad, ri.rm); } void relax(int v, int le, int ri) { if (lz[v].ad != INT_MIN || lz[v].rm != INT_MAX) { if (lz[v].ad != INT_MIN) { st[v] = max(st[v], lz[v].ad); } if (lz[v].rm != INT_MAX) { st[v] = min(st[v], lz[v].rm); } if (le != ri) { merge(lz[v * 2], lz[v]); merge(lz[v * 2 + 1], lz[v]); } lz[v] = que(); } } void update(int le, int ri, int ql, int qr, int v, que q) { relax(v, le, ri); if (le > qr || ri < ql) return; if (ql <= le && ri <= qr) { merge(lz[v], q); relax(v, le, ri); } else { int mi = le + (ri - le) / 2; update(le, mi, ql, qr, v * 2, q); update(mi + 1, ri, ql, qr, v * 2 + 1, q); st[v] = min(st[v * 2], st[v * 2 + 1]); } } int query(int le, int ri, int ix, int v) { relax(v, le, ri); if (le > ix || ri < ix) return 0; if (le == ri) return st[v]; int mi = le + (ri - le) / 2; // if (ix <= mi) return query(le, mi, ix, v * 2); int lq = query(le, mi, ix, v * 2); int rq = query(mi + 1, ri, ix, v * 2 + 1); return lq + rq; } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]) { fill(st, st + sz * 4, 0); fill(lz, lz + sz * 4, que()); for (int i = 0; i < k; i++) { if (1 == op[i]) { que q = {height[i], INT_MAX}; update(1, n, left[i] + 1, right[i] + 1, 1, q); } else { que q = {INT_MIN, height[i]}; update(1, n, left[i] + 1, right[i] + 1, 1, q); } } for (int i = 0; i < n; i++) { finalHeight[i] = query(1, n, i + 1, 1); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...