結果
問題 |
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; }