记录编号 617998 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 T4 最终得分 100
用户昵称 GravatarRpUtl 是否通过 通过
代码语言 C++ 运行时间 1.591 s
提交时间 2026-08-25 16:52:11 内存使用 18.04 MiB
显示代码纯文本
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
const int M = (N << 2);
const ll V = 1e9;
const ll inf = 1e18;
/* ---------------------------------- */ 
int n, ver[N], to[N << 1], nxt[N << 1], idx;
ll C, val[N << 1], s[N], f[N], h[N], g[N];
/* ----------------------------------*/
ll k[M], b[M], tag[M];
int rt[N], lc[M], rc[M], cnt, mx[M];
ll calc(int i, ll x) {
    return k[i] * x + b[i];
}
void maketag(int p, ll v) {
    b[mx[p]] += v;
    tag[p] += v;
}
void pushdown(int p) {
    if (!tag[p]) return;
    if (lc[p]) maketag(lc[p], tag[p]);
    if (rc[p]) maketag(rc[p], tag[p]);
    tag[p] = 0; return;
}
void upd(int &p, ll l, ll r, int x) {
    if (!p) p = ++cnt;
    if (!mx[p]) { mx[p] = x; return; }
    pushdown(p); ll mid = (l + r) >> 1;
    if (calc(mx[p], mid) > calc(x, mid)) swap(mx[p], x);
    if (calc(mx[p], l) > calc(x, l)) upd(lc[p], l, mid, x);
    if (calc(mx[p], r) > calc(x, r)) upd(rc[p], mid + 1, r, x);
}
ll ask(int p, ll l, ll r, ll x) {
    if (!p || !mx[p]) return inf;
    pushdown(p); ll mid = (l + r) >> 1;
    ll cnt = calc(mx[p], x);
    if (l == r) return cnt;
    if (x <= mid) cnt = min(cnt, ask(lc[p], l, mid, x));
    if (x > mid) cnt = min(cnt, ask(rc[p], mid + 1, r, x));
    return cnt; 
}
int merge(int p, int q, ll l, ll r) {
    if (!p || !q) return p + q;
    if (mx[q]) upd(p, l, r, mx[q]);
    if (l == r) return 0;
    ll mid = (l + r) >> 1; 
    pushdown(p); pushdown(q);
    lc[p] = merge(lc[p], lc[q], l, mid);
    rc[p] = merge(rc[p], rc[q], mid + 1, r);
    return p;
}
/* ----------------------------------*/ 
void add(int x, int y, int z) {
    to[++idx] = y, nxt[idx] = ver[x], ver[x] = idx, val[idx] = z;
}
void dfs(int x) {
    for (int i = ver[x], y; i; i = nxt[i]) {
        y = to[i];
        s[y] = s[x] + val[i];
        dfs(y);
        h[x] += f[y];
    }
    for (int i = ver[x], y; i; i = nxt[i]) {
        y = to[i];
        g[y] = h[x] - f[y];
        maketag(rt[y], g[y]); 
        rt[x] = merge(rt[x], rt[y], -V, V);
    }
    f[x] = min(h[x] + C, ask(rt[x], -V, V, 2 * s[x]) + s[x] * s[x] + C);
    k[x] = -s[x], b[x] = s[x] * s[x] + h[x];
    upd(rt[x], -V, V, x);
    return;
}
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> n >> C;
    memset(f, 0x3f, sizeof(f));
    for (int i = 2, fa, dis; i <= n; i++) {
        cin >> fa >> dis;
        add(fa, i, dis);
    }
    dfs(1);
    cout << f[1] << '\n';
    return 0;
}