Submission #403332

#TimeUsernameProblemLanguageResultExecution timeMemory
403332danielcm585Wall (IOI14_wall)C++14
100 / 100
1048 ms224648 KiB
#include "wall.h" #include <bits/stdc++.h> using namespace std; const int INF = 1e9; struct ops { int mn, mx; ops(int x = INF, int y = -INF): mn(x), mx(y) {} ops operator + (ops v) { if (mn < v.mx) return ops(v.mx,v.mx); if (mx > v.mn) return ops(v.mn,v.mn); return ops(min(mn,v.mn),max(mx,v.mx)); } }; struct segTree { segTree *lf, *rg; int l, r; ops val; segTree(int x, int y) { l = x, r = y; val = ops(0,0); } void build() { if (l == r) return; int mid = (l+r)/2; lf = new segTree(l,mid); lf->build(); rg = new segTree(mid+1,r); rg->build(); } void prop() { lf->val = lf->val+val; rg->val = rg->val+val; val = ops(); } void update(int x, int y, ops v) { if (l > y || r < x) return; if (l >= x && r <= y) { val = val+v; return; } prop(); lf->update(x,y,v); rg->update(x,y,v); } void solve(int ans[]) { if (l == r) { ans[l] = val.mn; return; } prop(); lf->solve(ans); rg->solve(ans); } } *st; void buildWall(int n, int k, int op[], int l[], int r[], int h[], int ans[]) { st = new segTree(0,n-1); st->build(); for (int i = 0; i < k; i++) { if (op[i] == 1) st->update(l[i],r[i],ops(INF,h[i])); else st->update(l[i],r[i],ops(h[i],-INF)); // st->solve(ans); // for (int j = 0; j < n; j++) cout << ans[j] << ' '; // cout << '\n'; } st->solve(ans); } /* 10 6 1 1 8 4 0 4 9 1 0 3 6 5 1 0 5 3 1 2 2 5 0 6 7 0 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...