제출 #794765

#제출 시각아이디문제언어결과실행 시간메모리
794765idiotcomputerWall (IOI14_wall)C++11
0 / 100
119 ms13912 KiB
#include "wall.h" const int MAX_N = 20000; const int NINF = -1 * (1 << 30); const int INF = (1<<30); struct node { int tmin = -1; int tmax = -1; int opmin = INF; int opmax = NINF; }; node segt[4*MAX_N+1]; void upd(int l, int r, int idx, int tl, int tr, int w, int h, int t){ if (l > tr || r < tl){ return; } if (l >= tl && r <= tr){ //mini if (w == 1){ if (h <= segt[idx].opmin || segt[idx].tmin == -1){ segt[idx].opmin = h; segt[idx].tmin = t; } if (h <= segt[idx].opmax || segt[idx].tmax == -1){ segt[idx].opmax = h; segt[idx].tmax = t; } } else { if (h >= segt[idx].opmax || segt[idx].tmin == -1){ segt[idx].opmax = h; segt[idx].tmax = t; } if (h >= segt[idx].opmin || segt[idx].tmax == -1){ segt[idx].opmin = h; segt[idx].tmin = t; } } return; } int m = (l+r)/2; upd(l,m,2*idx+1,tl,tr,w,h,t); upd(m+1,r,2*idx+2,tl,tr,w,h,t); return; } void solve(int l, int r, int idx, int finalHeight[], node a){ if (segt[idx].opmin <= a.opmax && segt[idx].tmin > a.tmax){ a.opmax = segt[idx].opmin; a.tmax = segt[idx].tmin; } if (segt[idx].opmin <= a.opmin && segt[idx].tmin > a.tmin){ a.tmin = segt[idx].tmin; a.opmin = segt[idx].opmin; } if (segt[idx].opmax >= a.opmax && segt[idx].tmax > a.tmax){ a.opmax = segt[idx].opmax; a.tmax = segt[idx].tmax; } if (segt[idx].opmax >= a.opmin && segt[idx].tmax > a.tmin){ a.opmin = segt[idx].opmax; a.tmin = segt[idx].tmax; } if (l == r){ /* if (a.opmin != a.opmax){ cout << "UHOHSPAGHETIIO " << l << ' ' << r << " " << idx << " " << a.opmin << " " << a.opmax << '\n'; }*/ if (a.opmin == INF && a.opmax == NINF){ finalHeight[l] = 0; } else if (a.opmin == INF){ finalHeight[l] = a.opmax; } else if (a.opmax == INF){ finalHeight[l] = a.opmin; } else { finalHeight[l] = a.opmin; } return; } int m = (l+r)/2; solve(l,m,2*idx+1,finalHeight,a); solve(m+1,r,2*idx+2,finalHeight,a); return; } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){ int l,r,w,h,idx; for (int i =0; i < k; i++){ w = op[i]-1; h = height[i]; idx = i; l = left[i]; r = right[i]; upd(0,n-1,0,l,r,w,h,idx); } node a; solve(0,n-1,0,finalHeight,a); 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...