Skip to content

Commit d3a0bf1

Browse files
committed
Rikka with Maximum Subsegment Sum
1 parent 6e79a96 commit d3a0bf1

File tree

1 file changed

+91
-0
lines changed

1 file changed

+91
-0
lines changed

QOJ/11521.cpp

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/**
2+
* @file 11521.cpp
3+
* @author Macesuted ([email protected])
4+
* @date 2025-09-12
5+
*
6+
* @copyright Copyright (c) 2025
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
#ifndef LOCAL
14+
#define endl '\n'
15+
#endif
16+
17+
bool mem1;
18+
19+
#define maxn 100005
20+
21+
int64_t a[maxn], f[maxn], sl[maxn], sr[maxn];
22+
uint64_t fsum[maxn], slsum[maxn];
23+
24+
uint64_t solve(int l, int r) {
25+
if (l == r) return a[l];
26+
int mid = (l + r) >> 1;
27+
uint64_t ans = solve(l, mid) + solve(mid + 1, r);
28+
29+
int64_t sum = 0, maxv = a[mid];
30+
for (int i = mid; i >= l; i--) f[i] = maxv = max(maxv, sum = max(sum, (int64_t)0) + a[i]);
31+
sum = 0, maxv = a[mid + 1];
32+
for (int i = mid + 1; i <= r; i++) f[i] = maxv = max(maxv, sum = max(sum, (int64_t)0) + a[i]);
33+
34+
sum = 0, maxv = a[mid];
35+
for (int i = mid; i >= l; i--) sr[i] = maxv = max(maxv, sum += a[i]);
36+
sum = 0, maxv = a[mid + 1];
37+
for (int i = mid + 1; i <= r; i++) sl[i] = maxv = max(maxv, sum += a[i]);
38+
39+
slsum[mid] = fsum[mid] = 0;
40+
for (int i = mid + 1; i <= r; i++) slsum[i] = slsum[i - 1] + sl[i], fsum[i] = fsum[i - 1] + f[i];
41+
42+
for (int i = mid; i >= l; i--) {
43+
int p = lower_bound(f + mid + 1, f + r + 1, f[i]) - f;
44+
45+
auto calc = [&](int xl, int xr, int64_t v) -> uint64_t {
46+
int c = lower_bound(sl + xl, sl + xr + 1, v - sr[i]) - sl;
47+
uint64_t ret = 0;
48+
if (xl <= c - 1) ret += (uint64_t)v * ((c - 1) - xl + 1);
49+
if (c <= xr) ret += (uint64_t)sr[i] * (xr - c + 1) + slsum[xr] - slsum[c - 1];
50+
return ret;
51+
};
52+
53+
if (mid + 1 <= p - 1) ans += calc(mid + 1, p - 1, f[i]);
54+
if (p <= r) {
55+
int xl = p - 1, xr = r + 1;
56+
while (xl + 1 < xr) {
57+
int mid = (xl + xr) >> 1;
58+
(sr[i] + sl[mid] >= f[mid] ? xl : xr) = mid;
59+
}
60+
if (p <= xl) ans += (uint64_t)sr[i] * (xl - p + 1) + slsum[xl] - slsum[p - 1];
61+
if (xr <= r) ans += fsum[r] - fsum[xl];
62+
}
63+
}
64+
65+
return ans;
66+
}
67+
68+
void solve(void) {
69+
int n;
70+
cin >> n;
71+
for (int i = 1; i <= n; i++) cin >> a[i];
72+
cout << solve(1, n) << endl;
73+
return;
74+
}
75+
76+
bool mem2;
77+
78+
int main() {
79+
ios::sync_with_stdio(false), cin.tie(nullptr);
80+
#ifdef LOCAL
81+
cerr << "Memory Cost: " << abs(&mem1 - &mem2) / 1024. / 1024. << "MB" << endl;
82+
#endif
83+
84+
int _ = 1;
85+
while (_--) solve();
86+
87+
#ifdef LOCAL
88+
cerr << "Time Cost: " << clock() * 1000. / CLOCKS_PER_SEC << "MS" << endl;
89+
#endif
90+
return 0;
91+
}

0 commit comments

Comments
 (0)