제출 #290293

#제출 시각아이디문제언어결과실행 시간메모리
290293AaronNaidu벽 (IOI14_wall)C++14
0 / 100
225 ms10236 KiB
#include <bits/stdc++.h> using namespace std; const int pow2 = 131072; int segTree[2*pow2]; //pair<int, int> lazyMin[2*pow2]; //pair<int, int> lazyMax[2*pow2]; int lazyUpdate[2*pow2]; int lazyMin[2*pow2]; set<pair<pair<int, int>, int> > s; void setMax(int node, int nodeStart, int nodeEnd, int rangeStart, int rangeEnd, int amount) { if (nodeStart > rangeEnd or nodeEnd < rangeStart) { return; } /*if (node >= pow2) { if (lazyUpdate[node] != -1) { segTree[node] = max(lazyUpdate[node], segTree[node]); lazyUpdate[node] = -1; } segTree[node] = max(amount, segTree[node]); return; } if (lazyUpdate[node] != -1) { //segTree[node] = max(lazyUpdate[node], segTree[node]); lazyUpdate[2*node] = max(lazyUpdate[2*node], lazyUpdate[node]); lazyUpdate[2*node+1] = max(lazyUpdate[2*node+1], lazyUpdate[node]); }*/ if (nodeStart >= rangeStart and nodeEnd <= rangeEnd) { lazyUpdate[node] = max(lazyUpdate[node], amount); return; } int med = (nodeStart + nodeEnd)/2; setMax(2*node, nodeStart, med, rangeStart, rangeEnd, amount); setMax(2*node+1, med+1, nodeEnd, rangeStart, rangeEnd, amount); } void setMin(int node, int nodeStart, int nodeEnd, int rangeStart, int rangeEnd, int amount) { if (nodeStart > rangeEnd or nodeEnd < rangeStart) { return; } /*if (node >= pow2) { if (lazyUpdate[node] != -1) { segTree[node] = max(lazyUpdate[node], segTree[node]); lazyUpdate[node] = -1; } segTree[node] = max(amount, segTree[node]); return; } if (lazyUpdate[node] != -1) { //segTree[node] = max(lazyUpdate[node], segTree[node]); lazyUpdate[2*node] = max(lazyUpdate[2*node], lazyUpdate[node]); lazyUpdate[2*node+1] = max(lazyUpdate[2*node+1], lazyUpdate[node]); }*/ if (nodeStart >= rangeStart and nodeEnd <= rangeEnd) { lazyMin[node] = min(lazyMin[node], amount); return; } int med = (nodeStart + nodeEnd)/2; setMin(2*node, nodeStart, med, rangeStart, rangeEnd, amount); setMin(2*node+1, med+1, nodeEnd, rangeStart, rangeEnd, amount); } void buildWall(int n, int k, int op[],int left[],int right[],int heights[],int finalHeight[]) { for (int i = 0; i < n; i++) { finalHeight[i] = 0; } int turningPoint = n; for (int i = 0; i < n; i++) { if (op[i] == 2) { turningPoint = i; break; } } for (int i = 0; i < 2*pow2; i++) { lazyUpdate[i] = 0; lazyMin[i] = 1000000007; } for (int i = 0; i < turningPoint; i++) { setMax(1, 0, pow2-1, left[i], right[i], heights[i]); } for (int i = turningPoint; i < n; i++) { setMin(1, 0, pow2-1, left[i], right[i], heights[i]); } for (int i = 1; i < 2*pow2; i++) { lazyUpdate[i] = max(lazyUpdate[i], lazyUpdate[i/2]); lazyMin[i] = min(lazyMin[i], lazyMin[i/2]); } for (int i = 0; i < n; i++) { if (lazyMin[i+pow2] == 1000000007) { finalHeight[i] = lazyUpdate[i+pow2]; } else { finalHeight[i] = min(lazyMin[i+pow2], lazyUpdate[i+pow2]); } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...