dfn求lcaRE10pts
查看原帖
dfn求lcaRE10pts
788951
TLE_AK楼主2024/6/10 01:27
#include<bits/stdc++.h>
using namespace std;



.

namespace acac
{
	
	struct edge
	{
		int to,ne;
	}e[1000010];
	int H[500010];
	int cnt;
	void add(int a,int b)
	{
		e[++cnt].to=b;
		e[cnt].ne=H[a];
		H[a]=cnt;
	}
	
	
	int st[500010][30],dfn[500010];
	int tot;
	
	void dfs(int u,int fa)
	{
	//	cout<<fa<<endl;
	//	if(u==99384)cout<<"NO"; 
		dfn[u]=++tot;
		
		st[dfn[u]][0]=fa;
		
	//	cout<<dfn[u]<<endl;
	//	cout<<u<<endl;
		for(int i=H[u];i;i=e[i].ne)
		{
			int v=e[i].to;
			if(v==fa)continue;
			//cout<<v;
			dfs(v,u);
			
		}
	}
	

	int read()
	{
		int ans=0;
		char ch=getchar();
		while(ch<'0'||ch>'9')
		{
			ch=getchar();
		}
		while(ch>='0'&&ch<='9')
		{
			ans=ans*10+ch-'0';
			ch=getchar();
		}
		return ans;
	}

	int main()
	{
		int n,m,s;
		scanf("%d%d%d",&n,&m,&s);
		for(int i=2;i<=n;i++)
		{
			int a,b;
			scanf("%d%d",&a,&b);
			add(a,b);
			add(b,a);
		}
		dfs(s,0);
		for(int i=1;i<=20;i++)
		{
			for(int j=1;j<=n;j++)
			{
				if(j+(1<<i)-1>n)break;
				
				if(dfn[st[j][i-1]]<dfn[st[j+(1<<i-1)][i-1]])st[j][i]=st[j][i-1];
				else st[j][i]=st[j+(1<<i-1)][i-1];
			//	if(j==3&&i==1)cout<<st[j][i];
			}
		}
	
		
		
		for(int i=1;i<=m;i++)
		{
			int x,y;
			scanf("%d%d",&x,&y);
    	//	cout<<dfn[x]<<' '<<dfn[y]<<endl;
    		if(x==y)cout<<x<<'\n';
    		else 
    		{
    			if(dfn[x]>dfn[y])swap(x,y);
    			int lca,k=__lg(dfn[y]-dfn[x]-1);
    			if(dfn[st[dfn[x]+1][k]]<dfn[st[dfn[y]-(1<<k)+1][k]])lca=st[dfn[x]+1][k];
    			else lca=st[dfn[y]-(1<<k)+1][k];
    			cout<<lca<<'\n';
    		//	cout<<dfn[x]<<' '<<dfn[y]<<endl;
			}
		}
	//	cout<<ans;
	
		
		return 0;
	}
}

int main()
{
//	freopen("P3379_1.in","r",stdin);	
	acac::main();
	return 0;
}

内存溢出,但不知是哪。 在if(u==99394)cout<<v;可以输出,但if(u==99394)cout<<v<<endl;不行。

2024/6/10 01:27
加载中...