Skip to content

Commit 96c7aa2

Browse files
authored
Merge pull request #1207 from AlgorithmWithGod/khj20006
[20251023] BOJ / D4 / 수열과 쿼리 0 / 권혁준
2 parents fcb73fd + 94260a7 commit 96c7aa2

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
```cpp
2+
#include <bits/stdc++.h>
3+
using namespace std;
4+
5+
int N, Q, sq, s[100001]{};
6+
deque<int> v[200001]{};
7+
int c[200001]{}, cc[801]{}, ans[100000]{};
8+
tuple<int, int, int> qs[100000]{};
9+
10+
int main() {
11+
cin.tie(0)->sync_with_stdio(0);
12+
13+
cin >> N;
14+
sq = sqrt(N);
15+
for (int i = 1; i <= N; i++) {
16+
cin >> s[i];
17+
s[i] += s[i - 1];
18+
}
19+
20+
cin >> Q;
21+
for (int i = 0; i < Q; i++) {
22+
auto& [l, r, x] = qs[i];
23+
cin >> l >> r;
24+
x = i;
25+
l--;
26+
}
27+
28+
sort(qs, qs + Q, [](auto a, auto b) -> bool {
29+
auto [al, ar, ax] = a;
30+
auto [bl, br, bx] = b;
31+
if (al / sq == bl / sq) return ar < br;
32+
return al / sq < bl / sq;
33+
});
34+
35+
int l = 0, r = 0;
36+
v[100000].push_back(0);
37+
c[100000]++, cc[100000 / sq]++;
38+
for (int i = 0; i < Q; i++) {
39+
auto [pl, pr, x] = qs[i];
40+
while (r < pr) {
41+
int z = s[++r] + 100000;
42+
if (!v[z].empty()) {
43+
c[v[z].back() - v[z].front()]--;
44+
cc[(v[z].back() - v[z].front()) / sq]--;
45+
}
46+
v[z].push_back(r);
47+
c[v[z].back() - v[z].front()]++;
48+
cc[(v[z].back() - v[z].front()) / sq]++;
49+
}
50+
while (pr < r) {
51+
int z = s[r--] + 100000;
52+
c[v[z].back() - v[z].front()]--;
53+
cc[(v[z].back() - v[z].front()) / sq]--;
54+
v[z].pop_back();
55+
if (!v[z].empty()) {
56+
c[v[z].back() - v[z].front()]++;
57+
cc[(v[z].back() - v[z].front()) / sq]++;
58+
}
59+
}
60+
while (l < pl) {
61+
int z = s[l++] + 100000;
62+
c[v[z].back() - v[z].front()]--;
63+
cc[(v[z].back() - v[z].front()) / sq]--;
64+
v[z].pop_front();
65+
if (!v[z].empty()) {
66+
c[v[z].back() - v[z].front()]++;
67+
cc[(v[z].back() - v[z].front()) / sq]++;
68+
}
69+
}
70+
while (pl < l) {
71+
int z = s[--l] + 100000;
72+
if (!v[z].empty()) {
73+
c[v[z].back() - v[z].front()]--;
74+
cc[(v[z].back() - v[z].front()) / sq]--;
75+
}
76+
v[z].push_front(l);
77+
c[v[z].back() - v[z].front()]++;
78+
cc[(v[z].back() - v[z].front()) / sq]++;
79+
}
80+
81+
for (int i = 800; i >= 0; i--) if (cc[i]) {
82+
for (int j = sq * (i + 1) - 1; j >= sq * i; j--) if (c[j]) {
83+
ans[x] = j;
84+
break;
85+
}
86+
break;
87+
}
88+
}
89+
90+
for (int i = 0; i < Q; i++) cout << ans[i] << '\n';
91+
92+
}
93+
```

0 commit comments

Comments
 (0)