左偏树求调
查看原帖
左偏树求调
377842
liuxy1234楼主2023/8/29 11:26

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;
}
2023/8/29 11:26
加载中...