#include "wall.h"
#include<bits/stdc++.h>
using namespace std;
const int inf = 1e9 + 10;
struct node
{
int max1, max2;
int min1, min2;
node()
{
max1 = 0;
max2 = -inf;
min1 = 0;
min2 = inf;
}
};
node merge_node(node lf, node rf)
{
node nd;
if (lf.max1 == rf.max1)
{
nd.max1 = lf.max1;
nd.max2 = max(lf.max2, rf.max2);
}
else if (lf.max1 > rf.max1)
{
nd.max1 = lf.max1;
nd.max2 = max(lf.max2, rf.max1);
}
else if (lf.max1 < rf.max1)
{
nd.max1 = rf.max1;
nd.max2 = max(lf.max1, rf.max2);
}
if (lf.min1 == rf.min1)
{
nd.min1 = lf.min1;
nd.min2 = min(lf.min2, rf.min2);
}
else if (lf.min1 < rf.min1)
{
nd.min1 = lf.min1;
nd.min2 = min(lf.min2, rf.min1);
}
else if (lf.min1 > rf.min1)
{
nd.min1 = rf.min1;
nd.min2 = min(lf.min1, rf.min2);
}
return nd;
}
const int maxn = 2e6 + 10;
node tree[4 * maxn];
/**void push_min(int root, int val)
{
if (val >= tree[root].max1)
return;
tree[root].max1 = val;
if (tree[root].min1 >= val)
{
tree[root].min1 = val;
tree[root].min2 = inf;
}
else if (tree[root].min2 > val)
{
tree[root].min2 = val;
}
}*/
void push_min(int root, int val)
{
//if (tree[root].max1 <= val)
// return;
tree[root].max1 = min(tree[root].max1, val);
if (tree[root].min1 >= val)
{
tree[root].min1 = val;
tree[root].min2 = inf;
}
else if (tree[root].min2 > val && tree[root].min2 != inf)
{
tree[root].min2 = val;
}
}
void push_max(int root, int val)
{
if (val <= tree[root].min1)
return;
tree[root].min1 = val;
if (tree[root].max1 <= val)
{
tree[root].max1 = val;
tree[root].max2 = -inf;
}
else if (tree[root].max2 < val)
{
tree[root].max2 = val;
}
}
void propagate(int root, int left, int right)
{
if (left != right)
{
push_max(root * 2, tree[root].min1);
push_max(root * 2 + 1, tree[root].min1);
push_min(root * 2, tree[root].max1);
push_min(root * 2 + 1, tree[root].max1);
}
}
void update_min(int root, int left, int right, int qleft, int qright, int val)
{
if (left > qright || right < qleft || tree[root].max1 <= val)
return;
if (left >= qleft && right <= qright && tree[root].max2 < val)
{
///cout << "left " << left << " " << right << " " << tree[root].max1 << " " << tree[root].max2 << endl;
push_min(root, val);
return;
}
propagate(root, left, right);
int mid = (left + right) / 2;
update_min(root * 2, left, mid, qleft, qright, val);
update_min(root * 2 + 1, mid + 1, right, qleft, qright, val);
tree[root] = merge_node(tree[root * 2], tree[root * 2 + 1]);
}
void update_max(int root, int left, int right, int qleft, int qright, int val)
{
if (left > qright || right < qleft || tree[root].min1 >= val)
return;
if (left >= qleft && right <= qright && tree[root].min2 > val)
{
push_max(root, val);
///cout << root << " : " << left << " : " << right << endl;
///cout << tree[root].min1 << endl;
//cout << tree[root].max1 << endl;
return;
}
propagate(root, left, right);
int mid = (left + right) / 2;
update_max(root * 2, left, mid, qleft, qright, val);
update_max(root * 2 + 1, mid + 1, right, qleft, qright, val);
tree[root] = merge_node(tree[root * 2], tree[root * 2 + 1]);
}
int arr[maxn];
void dfs(int root, int left, int right)
{
///cout << "dfs " << root << " " << left << " " << right << " " << tree[root].min1 << " " << tree[root].max1 << endl;
if (left == right)
{
arr[left] = tree[root].max1;
return;
}
propagate(root, left, right);
int mid = (left + right) / 2;
dfs(root * 2, left, mid);
dfs(root * 2 + 1, mid + 1, right);
}
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[])
{
for (int i = 0; i < k; i ++)
{
if (op[i] == 1)
{
update_max(1, 0, n - 1, left[i], right[i], height[i]);
}
else
{
update_min(1, 0, n - 1, left[i], right[i], height[i]);
}
}
dfs(1, 0, n - 1);
for (int i = 0; i < n; i ++)
finalHeight[i] = arr[i];
return;
}
Compilation message
wall.cpp: In function 'void push_max(int, int)':
wall.cpp:99:5: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
99 | if (val <= tree[root].min1)
| ^~
wall.cpp:102:9: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
102 | tree[root].min1 = val;
| ^~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
48 ms |
125452 KB |
Output is correct |
2 |
Correct |
52 ms |
125552 KB |
Output is correct |
3 |
Correct |
49 ms |
125516 KB |
Output is correct |
4 |
Correct |
57 ms |
125620 KB |
Output is correct |
5 |
Correct |
52 ms |
125632 KB |
Output is correct |
6 |
Correct |
52 ms |
125708 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
55 ms |
125436 KB |
Output is correct |
2 |
Correct |
160 ms |
133264 KB |
Output is correct |
3 |
Correct |
107 ms |
128968 KB |
Output is correct |
4 |
Correct |
185 ms |
134340 KB |
Output is correct |
5 |
Correct |
190 ms |
134772 KB |
Output is correct |
6 |
Correct |
233 ms |
134784 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
54 ms |
125420 KB |
Output is correct |
2 |
Correct |
57 ms |
125544 KB |
Output is correct |
3 |
Correct |
56 ms |
125536 KB |
Output is correct |
4 |
Correct |
54 ms |
125696 KB |
Output is correct |
5 |
Correct |
66 ms |
125664 KB |
Output is correct |
6 |
Correct |
51 ms |
125680 KB |
Output is correct |
7 |
Correct |
47 ms |
125528 KB |
Output is correct |
8 |
Correct |
170 ms |
133272 KB |
Output is correct |
9 |
Correct |
123 ms |
128988 KB |
Output is correct |
10 |
Correct |
197 ms |
134276 KB |
Output is correct |
11 |
Correct |
225 ms |
134860 KB |
Output is correct |
12 |
Correct |
244 ms |
134868 KB |
Output is correct |
13 |
Correct |
49 ms |
125464 KB |
Output is correct |
14 |
Correct |
152 ms |
133252 KB |
Output is correct |
15 |
Correct |
102 ms |
126152 KB |
Output is correct |
16 |
Correct |
705 ms |
134536 KB |
Output is correct |
17 |
Correct |
361 ms |
134596 KB |
Output is correct |
18 |
Correct |
432 ms |
134536 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
48 ms |
125516 KB |
Output is correct |
2 |
Correct |
58 ms |
125568 KB |
Output is correct |
3 |
Correct |
50 ms |
125472 KB |
Output is correct |
4 |
Correct |
60 ms |
125644 KB |
Output is correct |
5 |
Correct |
60 ms |
125644 KB |
Output is correct |
6 |
Correct |
59 ms |
125688 KB |
Output is correct |
7 |
Correct |
54 ms |
125528 KB |
Output is correct |
8 |
Correct |
149 ms |
133292 KB |
Output is correct |
9 |
Correct |
117 ms |
128984 KB |
Output is correct |
10 |
Correct |
189 ms |
134284 KB |
Output is correct |
11 |
Correct |
216 ms |
134856 KB |
Output is correct |
12 |
Correct |
242 ms |
134876 KB |
Output is correct |
13 |
Correct |
55 ms |
125424 KB |
Output is correct |
14 |
Correct |
173 ms |
133332 KB |
Output is correct |
15 |
Correct |
98 ms |
126156 KB |
Output is correct |
16 |
Correct |
657 ms |
134540 KB |
Output is correct |
17 |
Correct |
359 ms |
134536 KB |
Output is correct |
18 |
Correct |
373 ms |
134536 KB |
Output is correct |
19 |
Correct |
803 ms |
159240 KB |
Output is correct |
20 |
Correct |
902 ms |
156728 KB |
Output is correct |
21 |
Correct |
793 ms |
159220 KB |
Output is correct |
22 |
Correct |
821 ms |
156796 KB |
Output is correct |
23 |
Correct |
824 ms |
156808 KB |
Output is correct |
24 |
Correct |
794 ms |
156812 KB |
Output is correct |
25 |
Correct |
817 ms |
156764 KB |
Output is correct |
26 |
Correct |
829 ms |
159244 KB |
Output is correct |
27 |
Correct |
789 ms |
159244 KB |
Output is correct |
28 |
Correct |
850 ms |
156768 KB |
Output is correct |
29 |
Correct |
796 ms |
156772 KB |
Output is correct |
30 |
Correct |
799 ms |
156792 KB |
Output is correct |