我的左偏树怎么这么慢
查看原帖
我的左偏树怎么这么慢
167279
Danno0v0楼主2022/8/12 08:55

最大点不带O2999ms极限卡过

难道是哪里写假了吗

#include<bits/stdc++.h>
#define Max 1000001
#define int long long
#define rt fa
#define pushdown spread
#define ls l
#define rs r
#define tim Times
#define add Add
#define s tot
#define a typ
using namespace std;
int l[Max],r[Max],tot[Max],dis[Max],fa[Max],born[Max];
int Add[Max],Times[Max];
bool typ[Max];int v[Max];
int die[Max],fin[Max],h[Max];
int depth[Max],father[Max];
int n,m;
void spread(int x)
{
	if(Add[x]==0&&Times[x]==1)
		return;
	if(l[x])
	{
		Times[l[x]]*=Times[x];
		Add[l[x]]*=Times[x];
		Add[l[x]]+=Add[x];
		tot[l[x]]*=Times[x];
		tot[l[x]]+=Add[x];
	}
	if(r[x])
	{
		Times[r[x]]*=Times[x];
		Add[r[x]]*=Times[x];
		Add[r[x]]+=Add[x];
		tot[r[x]]*=Times[x];
		tot[r[x]]+=Add[x];
	}	
	Times[x]=1,Add[x]=0;
}
int merge(int x,int y)
{	

	if(!x||!y) 
		return x+y;	
	spread(x),spread(y);
	if(tot[y]<tot[x]) swap(x,y);
	r[x]=merge(r[x],y);
	if(dis[l[x]]<dis[r[x]]) swap(l[x],r[x]);
	dis[x]=dis[l[x]]+1;
	return x;
}

signed main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
		cin>>h[i],fa[i]=-1;
	depth[1]=1,dis[0]=-1;
	for(int i=2;i<=n;i++)
	{
		cin>>father[i]>>typ[i]>>v[i];
		depth[i]=depth[father[i]]+1;
	}
	for(int i=1;i<=m;i++)
	{
		cin>>tot[i]>>born[i];
		Times[i]=1;
		if(fa[born[i]]==-1) fa[born[i]]=i;
		else fa[born[i]]=merge(fa[born[i]],i);
	}
	for(int i=n;i>=1;i--)
	{
		while(fa[i]!=-1)
		{
			if(tot[fa[i]]<h[i])
			{
				fin[fa[i]]=i;
				spread(fa[i]);
				if(!l[fa[i]]) fa[i]=-1;
				else fa[i]=merge(l[fa[i]],r[fa[i]]);
			}
			else
				break;
		}
		if(i==1) break;
		if(fa[i]==-1) continue;
		else
		{
			if(!typ[i])	tot[fa[i]]+=v[i],Add[fa[i]]+=v[i];
			else tot[fa[i]]*=v[i],Times[fa[i]]*=v[i],Add[fa[i]]*=v[i];
			spread(fa[i]);
			if(fa[father[i]]==-1) fa[father[i]]=fa[i];
			else fa[father[i]]=merge(fa[father[i]],fa[i]);
		}
	}
	for(int i=1;i<=m;i++)
		die[fin[i]]++;
	for(int i=1;i<=n;i++)
		cout<<die[i]<<endl;
	for(int i=1;i<=m;i++)
		cout<<depth[born[i]]-depth[fin[i]]<<endl;
}
/*
5 5
100
90 80 30 5
1 1 2
2 0 10
3 0 30
1 0 25
30 5
20 3
10 5
15 4
5 2

0
0
5
0
0
2
2
2
2
2

7 7
120 60 70 55 99 25 30
1 1 2
1 0 -10
1 0 15
2 0 25
3 1 2
3 0 30
100 1
45 2
55 3
60 4
35 5
30 6
30 7
*/
2022/8/12 08:55
加载中...