結果
| 問題 |
No.1525 Meximum Sum
|
| ユーザー |
|
| 提出日時 | 2025-09-17 21:56:22 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 101 ms / 2,000 ms |
| コード長 | 2,373 bytes |
| コンパイル時間 | 3,334 ms |
| コンパイル使用メモリ | 281,452 KB |
| 実行使用メモリ | 48,188 KB |
| 最終ジャッジ日時 | 2025-09-17 21:56:30 |
| 合計ジャッジ時間 | 7,533 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 |
ソースコード
#include <bits/stdc++.h>
#define int long long
using std::max;
constexpr int N = 1e6;
int n, a[N + 1];
int mx[N << 2], se[N << 2], cn[N << 2], tag[N << 2];
long long sum[N << 2];
void pushup(int u) { // 向上更新标记
const int ls = u << 1, rs = u << 1 | 1;
sum[u] = sum[ls] + sum[rs];
if (mx[ls] == mx[rs]) {
mx[u] = mx[rs];
se[u] = max(se[ls], se[rs]);
cn[u] = cn[ls] + cn[rs];
} else if (mx[ls] > mx[rs]) {
mx[u] = mx[ls];
se[u] = max(se[ls], mx[rs]);
cn[u] = cn[ls];
} else {
mx[u] = mx[rs];
se[u] = max(mx[ls], se[rs]);
cn[u] = cn[rs];
}
}
void pushtag(int u, int tg) { // 单纯地打标记,不暴搜
if (mx[u] <= tg) return;
sum[u] += (1ll * tg - mx[u]) * cn[u];
mx[u] = tag[u] = tg;
}
void pushdown(int u) { // 下传标记
if (tag[u] == -1) return;
pushtag(u << 1, tag[u]), pushtag(u << 1 | 1, tag[u]);
tag[u] = -1;
}
void build(int u = 1, int l = 1, int r = n) { // 建树
tag[u] = -1;
if (l == r) {
sum[u] = mx[u] = n + 1, se[u] = -1, cn[u] = 1;
return;
}
int mid = (l + r) >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
pushup(u);
}
void modify_min(int L, int R, int v, int u = 1, int l = 1, int r = n) {
if (L > R || mx[u] <= v) return;
if (L <= l && r <= R && se[u] < v) return pushtag(u, v);
int mid = (l + r) >> 1;
pushdown(u);
if (L <= mid) modify_min(L, R, v, u << 1, l, mid);
if (mid < R) modify_min(L, R, v, u << 1 | 1, mid + 1, r);
pushup(u);
}
long long query_sum(int L, int R, int u = 1, int l = 1, int r = n) {
if (L <= l && r <= R) return sum[u];
int mid = (l + r) >> 1;
long long res = 0;
pushdown(u);
if (L <= mid) res += query_sum(L, R, u << 1, l, mid);
if (mid < R) res += query_sum(L, R, u << 1 | 1, mid + 1, r);
return res;
}
void solve() {
std::cin >> n;
std::vector<std::vector<int>> pos(n + 2);
for (int i = 1; i <= n; i++) {
std::cin >> a[i];
pos[a[i]].push_back(i);
}
build();
int ans = 0;
for (int x = 0; x <= n + 1; x++) {
int pre = 0;
for (int i : pos[x]) {
modify_min(std::max(pre, 1ll), i - 1, pre);
pre = i;
}
modify_min(pre, n, pre);
ans += sum[1];
}
std::cout << ans << '\n';
}
int32_t main() {
std::cin.tie(nullptr)->sync_with_stdio(false);
int t = 1;
// std::cin >> t;
while (t--) {
solve();
}
return 0;
}