Skip to content

Commit 210d8cd

Browse files
authored
[20251129] BOJ / P4 / 츠바메가에시 / 권혁준
1 parent 4e94397 commit 210d8cd

File tree

1 file changed

+90
-0
lines changed

1 file changed

+90
-0
lines changed
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
```cpp
2+
#include <bits/stdc++.h>
3+
using namespace std;
4+
5+
struct SegmentTree {
6+
vector<pair<int, int>> tree;
7+
8+
pair<int, int> mrg(pair<int, int> &a, pair<int, int> &b) {
9+
int mx1 = 0, mx2 = 0;
10+
mx1 = max(a.first, b.first);
11+
if (mx1 == a.first) mx2 = max(a.second, b.first);
12+
else mx2 = max(a.first, b.second);
13+
return { mx1, mx2 };
14+
}
15+
public:
16+
SegmentTree(int sz) {
17+
tree.resize(sz * 4);
18+
}
19+
20+
void upt(int s, int e, int i, int v, int n) {
21+
if (s == e) {
22+
tree[n].first += v;
23+
return;
24+
}
25+
int m = (s + e) >> 1;
26+
if (i <= m) upt(s, m, i, v, n << 1);
27+
else upt(m + 1, e, i, v, n << 1 | 1);
28+
tree[n] = mrg(tree[n << 1], tree[n << 1 | 1]);
29+
}
30+
};
31+
32+
int N;
33+
SegmentTree* segX = new SegmentTree(1000001);
34+
SegmentTree* segY = new SegmentTree(1000001);
35+
vector<pair<int, int>> X[1000001];
36+
vector<pair<int, int>> Y[1000001];
37+
38+
int main() {
39+
cin.tie(0)->sync_with_stdio(0);
40+
41+
cin >> N;
42+
for (int i = 0, x, y, v; i < N; i++) {
43+
cin >> x >> y >> v;
44+
X[x].emplace_back(y, v);
45+
Y[y].emplace_back(x, v);
46+
segX->upt(0, 1000000, x, v, 1);
47+
segY->upt(0, 1000000, y, v, 1);
48+
}
49+
50+
int ans = 0;
51+
int xmx1 = 0, xmx2 = 0, xmx3 = 0;
52+
for (int x = 0; x <= 1000000; x++) {
53+
int sum = 0;
54+
for (auto [y, v] : X[x]) {
55+
segY->upt(0, 1000000, y, -v, 1);
56+
sum += v;
57+
}
58+
auto [a, b] = segY->tree[1];
59+
ans = max(ans, sum + a + b);
60+
for (auto [y, v] : X[x]) {
61+
segY->upt(0, 1000000, y, v, 1);
62+
}
63+
if (sum > xmx1) xmx3 = xmx2, xmx2 = xmx1, xmx1 = sum;
64+
else if (sum > xmx2) xmx3 = xmx2, xmx2 = sum;
65+
else if (sum > xmx3) xmx3 = sum;
66+
}
67+
ans = max(ans, xmx1 + xmx2 + xmx3);
68+
69+
int ymx1 = 0, ymx2 = 0, ymx3 = 0;
70+
for (int y = 0; y <= 1000000; y++) {
71+
int sum = 0;
72+
for (auto [x, v] : Y[y]) {
73+
segX->upt(0, 1000000, x, -v, 1);
74+
sum += v;
75+
}
76+
auto [a, b] = segX->tree[1];
77+
ans = max(ans, sum + a + b);
78+
for (auto [x, v] : Y[y]) {
79+
segX->upt(0, 1000000, x, v, 1);
80+
}
81+
if (sum > ymx1) ymx3 = ymx2, ymx2 = ymx1, ymx1 = sum;
82+
else if (sum > ymx2) ymx3 = ymx2, ymx2 = sum;
83+
else if (sum > ymx3) ymx3 = sum;
84+
}
85+
ans = max(ans, ymx1 + ymx2 + ymx3);
86+
87+
cout << ans;
88+
89+
}
90+
```

0 commit comments

Comments
 (0)