이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "wall.h"
#include <bits/stdc++.h>
using namespace std;
const int mxN = 2e6 + 5;
struct Node {
int mx = -1e9, mn = 1e9;
Node() { }
Node(int a, int b) { mn = a, mx = b; }
} t[4 * mxN];
void push(int x, Node v) {
if (t[x].mn >= v.mn && v.mn >= t[x].mx) {
t[x].mn = v.mn;
} else if (v.mn < t[x].mx) {
t[x] = Node(v.mn, v.mn);
}
if (t[x].mn >= v.mx && v.mx >= t[x].mx) {
t[x].mx = v.mx;
} else if (v.mx > t[x].mn) {
t[x] = Node(v.mx, v.mx);
}
}
void propagate(int x, int lx, int rx) {
if (lx == rx) return;
push(x << 1, t[x]);
push(x << 1 | 1, t[x]);
t[x] = Node(1e9, -1e9);
}
void update(int x, int lx, int rx, int l, int r, Node v) {
if (t[x].mx != -1e9 || t[x].mn != 1e9) propagate(x, lx, rx);
if (l > rx || lx > r) return;
if (l <= lx && r >= rx) {
push(x, v);
return;
}
int mx = (lx + rx) >> 1;
update(x << 1, lx, mx, l, r, v);
update(x << 1 | 1, mx + 1, rx, l, r, v);
}
int query(int x, int lx, int rx, int i) {
if (t[x].mx != -1e9 || t[x].mn != 1e9) propagate(x, lx, rx);
if (lx == rx) {
return max(t[x].mx, min(t[x].mn, 0));
}
int mx = (lx + rx) >> 1;
if (i <= mx) return query(x << 1, lx, mx, i);
return query(x << 1 | 1, mx + 1, rx, i);
}
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
for (int i = 0; i < k; i++) {
Node v = Node(1e9, height[i]);
if (op[i] == 2) v = Node(height[i], -1e9);
update(1, 1, n, left[i] + 1, right[i] + 1, v);
}
for (int i = 0; i < n; i++) {
finalHeight[i] = query(1, 1, n, i + 1);
}
return;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |