제출 #222283

#제출 시각아이디문제언어결과실행 시간메모리
222283MODDI벽 (IOI14_wall)C++14
100 / 100
1062 ms69648 KiB
#include "wall.h" #include <cstdio> #include <algorithm> using namespace std; const int OFF = (1 << 21); const int INF = 0x3f3f3f3f; int mx[2 * OFF ], mi[2 * OFF]; void spoji(int j,int i){ int olmi = mi[i]; mx[i] = min(mx[i], mx[j]); mi[i] = max(mi[i], mi[j]); if(mi[i] > mx[i]){ if(olmi < mi[j]) mx[i] = mi[i]; else mi[i] = mx[i]; } } void prop(int i){ if(i < OFF){ spoji(i, 2 * i); spoji(i, 2 * i + 1); mx[i] = INF, mi[i] = 0; } } void update(int i,int a,int b,int lo,int hi){ prop(i); if(lo <= a && b <= hi){ spoji(0, i); prop(i); return; } if(a > hi || b < lo) return; update(2 * i, a, (a + b) / 2, lo, hi); update(2 * i + 1, (a + b) / 2 + 1, b, lo, hi); } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){ for(int i = 0;i < k;i++){ mi[0] = 0, mx[0] = INF; if(op[i] == 2) mx[0] = height[i]; else mi[0] = height[i]; update(1, 0, OFF - 1, left[i], right[i]); } for(int i = 1;i < OFF;i++) prop(i); for(int i = 0;i < n;i++) finalHeight[i] = mi[OFF + 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...