萌新刚学OI,左偏树求调qwq
查看原帖
萌新刚学OI,左偏树求调qwq
788951
TLE_AK楼主2024/7/14 08:30
#include<bits/stdc++.h>
using namespace std;
#define int long long

namespace acac
{
	struct node
	{
		int ls,rs,v,rt,dis,add,tag,sz;
	}reap[600010];
	
	void pu(int u)
	{
		reap[u].sz=reap[reap[u].ls].sz+reap[reap[u].rs].sz+1;
	}
	
	void cf(int u,int tag)
	{
		reap[u].v*=tag;
		reap[u].add*=tag;
		reap[u].tag*=tag;
	}
	
	void jf(int u,int tag)
	{
		reap[u].v+=tag;
		reap[u].add+=tag;
	}
	
	
	void pd(int u)
	{
		if(reap[u].tag>1)
		{
			cf(reap[u].ls,reap[u].tag),cf(reap[u].rs,reap[u].tag);
			reap[u].tag=1;
		}
		if(reap[u].add)
		{
			jf(reap[u].ls,reap[u].add),jf(reap[u].rs,reap[u].add);
			reap[u].add=0;
		}
	}
	
	int me(int x,int y)
	{
		if(x*y==0)return x+y;
		if(reap[x].v>reap[y].v)swap(x,y);
		pd(x);
		reap[x].rs=me(reap[x].rs,y);
		if(reap[reap[x].ls].dis<reap[reap[x].rs].dis)swap(reap[x].ls,reap[x].rs);
		reap[x].dis=reap[reap[x].rs].dis+1;
		pu(x);
		return x;
	}
	
	void del(int &u)
	{
		u=me(reap[u].ls,reap[u].rs);
	}
	
	int belong(int u)
	{
		if(reap[u].rt!=u)return reap[u].rt=u;
		return u;
	}
	
	int die[300010],st[300010],dep[300010],def[300010],bh[300010][5],ans[300010];
	int n,m;
	struct edge
	{
		int to,ne;
	}e[300010];
	int H[300010];
	int cnt;
	void add(int a,int b)
	{
		e[++cnt].to=b;
		e[cnt].ne=H[a];
		H[a]=cnt;
	}
	
	
	void dfs(int u,int fa)
	{
		dep[u]=dep[fa]+1;
		for(int i=H[u];i;i=e[i].ne)
		{
			int v=e[i].to;
			dfs(v,u);
			reap[u].rt=me(reap[u].rt,reap[v].rt);
		}
//		cout<<u<<' ';
//		for(int i=n+1;i<=n+m;i++)
//		{
//			cout<<reap[i].v<<' ';
//		}
//		cout<<endl;
		while(reap[reap[u].rt].sz&&reap[reap[u].rt].v<def[u])
		{
			ans[u]++;
			die[reap[u].rt-n]=u;
		//	cout<<u<<' '<<reap[u].rt<<' '<<reap[reap[u].rt].v<<endl;
			pd(reap[u].rt);
			del(reap[u].rt);
		}
		if(u==1)return ;
		if(!reap[reap[u].rt].sz)return ;
		if(bh[u][0])cf(reap[u].rt,bh[u][1]);
		else jf(reap[u].rt,bh[u][1]);
		pd(reap[u].rt);
		
	}

	int main()
	{
		
		scanf("%lld%lld",&n,&m);
		for(int i=1;i<=n;i++)
		{
			scanf("%lld",&def[i]);
		}
		for(int i=2;i<=n;i++)
		{
			int f;
			scanf("%lld%lld%lld",&f,&bh[i][0],&bh[i][1]);
			reap[i].tag=1;
			reap[i].rt=i;
			add(f,i);
		}
		reap[0].dis=-1;
		for(int i=1;i<=m;i++)
		{
			scanf("%lld%lld",&reap[i+n].v,&st[i]);
			reap[i+n].tag=1;
			reap[i+n].sz=1;
			reap[i+n].rt=i+n;
			if(!reap[reap[st[i]].rt].sz)reap[st[i]].rt=i+n;
			else reap[st[i]].rt=me(reap[st[i]].rt,i+n);
		}
//		for(int i=1;i<=n+m;i++)
//		{
//			cout<<i<<' '<<reap[i].ls<<' '<<reap[i].rs<<' '<<reap[i].rt<<' '<<reap[i].sz<<endl;
//		}
		dfs(1,0);
		for(int i=1;i<=n;i++)
		{
			cout<<ans[i]<<'\n';
		}
		for(int i=1;i<=n;i++)
		{
			cout<<dep[st[i]]-dep[die[i]]<<'\n';
		}
		return 0;
	}
}
#undef int
int main()
{
	acac::main();
	return 0;
}
2024/7/14 08:30
加载中...