RT,样例没过,但是真的不知道哪里出错了/kk
#include <bits/stdc++.h>
#define int long long
#define Genshin_Impact_start cout << "Genshin_Impact_start!\n";
using namespace std;
inline int read()
{
register int x = 0, f = 1;
register char c = getchar();
while(c < '0' || c > '9')
{
if(c == '-')f = -1;
c = getchar();
}
while(c <= '9' && c >= '0')
{
x = x * 10 + c - '0';
c = getchar();
}
return x * f;
}
struct edge
{
int v, nxt;
}e[2000100];
int cnt;
int h[1000010];
void addedge(int u, int v)
{
cnt++;
e[cnt].v = v, e[cnt].nxt= h[u];
h[u] = cnt;
return;
}
struct node
{
int c, ls, rs, s, l, sum, size;
}t[1000010];
int n, m;
void update(int q)
{
t[q].s = t[t[q].rs].s + 1;
t[q].sum = t[t[q].ls].sum + t[t[q].rs].sum + t[q].c;
t[q].size = t[t[q].ls].size + t[t[q].rs].size + 1;
return;
}
int merge(int x, int y)
{
if(!x || !y)
{
return x + y;
}
if(t[x].c < t[y].c)
{
swap(x, y);
}
t[x].rs = merge(t[x].rs, y);
if(t[t[x].ls].s < t[t[x].rs].s)swap(t[x].ls, t[x].rs);
update(x);
return x;
}
int pop(int x)
{
return merge(t[x].ls, t[x].rs);
}
int fa[1000010], f[1000010];
int rt[1001000];
int getfa(int x)
{
return fa[x] == x ? x : fa[x] = getfa(fa[x]);
}
int ans = 0;
void dfs(int x)
{
if(!x)return;
for(int i = h[x];i;i = e[i].nxt)
{
int v = e[i].v;
if(v == f[x])continue;
dfs(v);
rt[x] = rt[v] = merge(rt[x], rt[v]);
}
while(t[rt[x]].sum > m && t[rt[x]].size > 0)
{
rt[x] = pop(rt[x]);
}
ans = max(ans, t[rt[x]].size * t[rt[x]].l);
return;
}
signed main()
{
cin >> n >> m;
t[0].s = -1;
for(int i = 1;i <= n;i++)
{
int a = read(), b = read(), c = read();
f[i] = a;
t[i].c = t[i].sum = b, t[i].l = c, t[i].size = 1;
fa[i] = i;
rt[i] = i;
addedge(a, i);
addedge(i, a);
}
dfs(1);
cout << ans;
return 0;
}