(玄关)求调

P1552 [APIO2012] 派遣

```cpp #include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 5; struct Node { int s[2], c, sz, dis; long long sum; Node() {}; Node(int _c) { s[0] = s[1] = 0; dis = sz = 1; sum = c = _c; } } tr[maxn]; int n, f[maxn], b[maxn], L[maxn]; long long m, ans; void init() { for (int i = 1; i <= n; i++) f[i] = i; } void push_up(int x) { int l = tr[x].s[0], r = tr[x].s[1]; tr[x].dis = tr[r].dis + 1; tr[x].sz = tr[l].sz + tr[r].sz + 1; tr[x].sum = tr[l].sum + tr[r].sum + tr[x].c; } int merge(int x, int y) { if (!x || !y) return x + y; if (tr[x].c < tr[y].c) swap(x, y); int &l = tr[x].s[0], &r = tr[x].s[1]; r = merge(r, y); if (tr[l].dis < tr[r].dis) swap(l, r); push_up(x); return x; } void pop(int x) { int l = tr[f[x]].s[0], r = tr[f[x]].s[1]; f[x] = merge(l, r); } int main() { scanf("%d%lld", &n, &m); init(); for (int i = 1; i <= n; i++) { int c; scanf("%d%d%d", b+i, &c, L+i); tr[i] = Node(c); } for (int i = n; i >= 1; i--) { while (tr[f[i]].sum > m) pop(i); long long tmp = (long long) tr[f[i]].sz * L[i]; ans = max(ans, tmp); if (b[i]) f[b[i]] = merge(f[b[i]], f[i]); } printf("%lld\n", ans); return 0; }
by AlexSong @ 2023-08-29 18:29:44


@[AlexSong](/user/1004299) thx,已关
by liuxy1234 @ 2023-08-29 18:31:00


|