Submission #545507

#TimeUsernameProblemLanguageResultExecution timeMemory
545507benson1029벽 (IOI14_wall)C++14
100 / 100
719 ms114968 KiB
#include "wall.h" #include<bits/stdc++.h> using namespace std; int seg1[8000005], seg2[8000005]; // min, max int inf = 1e9; int mn[2000005], mx[2000005]; void push(int x, int l, int r) { if(l==r) return; seg1[x*2] = min(seg1[x*2], seg1[x]); seg2[x*2] = min(seg2[x*2], seg1[x]); seg1[x*2] = max(seg1[x*2], seg2[x]); seg2[x*2] = max(seg2[x*2], seg2[x]); seg1[x*2+1] = min(seg1[x*2+1], seg1[x]); seg2[x*2+1] = min(seg2[x*2+1], seg1[x]); seg1[x*2+1] = max(seg1[x*2+1], seg2[x]); seg2[x*2+1] = max(seg2[x*2+1], seg2[x]); seg1[x] = inf; seg2[x] = -inf; } void upd(int x, int l, int r, int ll, int rr, int tp, int val) { if(l > rr || r < ll) return; push(x, l, r); if(ll <= l && r <= rr) { if(tp==1) { // max operation seg1[x] = max(seg1[x], val); seg2[x] = max(seg2[x], val); } else { seg1[x] = min(seg1[x], val); seg2[x] = min(seg2[x], val); } } else { upd(x*2, l, (l+r)/2, ll, rr, tp, val); upd(x*2+1, (l+r)/2+1, r, ll, rr, tp, val); } } void qry(int x, int l, int r) { push(x, l, r); if(l==r) { mn[l] = seg1[x]; mx[l] = seg2[x]; } else { qry(x*2, l, (l+r)/2); qry(x*2+1, (l+r)/2+1, r); } } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){ memset(seg1, inf, sizeof(seg1)); memset(seg2, -inf, sizeof(seg2)); for(int i=0; i<k; i++) { upd(1, 0, n-1, left[i], right[i], op[i], height[i]); } qry(1, 0, n-1); for(int i=0; i<n; i++) { finalHeight[i] = max(min(0, mn[i]), mx[i]); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...