帮我AC他是我爹!!!!(调代码调哭了)
查看原帖
帮我AC他是我爹!!!!(调代码调哭了)
105759
IL杰佣楼主2020/7/21 20:38
#include <bits/stdc++.h>
using namespace std;
int cnt,f[50050][21],head[50050],d[50050];
bool vis[50050];
float lg;
struct edge
{
	int to;
	int nex;
}e[5000100];
inline void add(int a,int b)
{
	++cnt;
	e[cnt].to=b;
	e[cnt].nex=head[a];
	head[a]=cnt;
}
inline void dfs(int u,int fa)
{
	d[u]=d[fa]+1;
    f[u][0]=fa;
    for(register int i=1;i<=lg;i++)
    f[u][i]=f[f[u][i-1]][i-1];
    for(register int i=head[u];i;i=e[i].nex)
    {
        int v=e[i].to;
        if(v!=fa)
        dfs(v,u);
    }
}
inline int l(int x,int y)
{
	if(d[x]>d[y])  swap(x,y);
	for(register int i=lg;i>=0;i--)
    if(d[x]<=d[y]-(1<<i))
    y=f[y][i];
    if(x==y)
    return x;
    for(register int i=lg;i>=0;i--)
    {
        if(f[x][i]==f[y][i])
        continue;
        else
        {
        	x=f[x][i];
			y=f[y][i];
		}
    }
    return f[x][0];
}
int n,m,s,a,gs,b,c,q,root;
int main()
{
	cin>>gs;
	for(int zz=1;zz<=gs;zz++)
	{
		memset(head,0,sizeof(head));
    	memset(vis,0,sizeof(vis));
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			int w;
			cin>>w;
			for(int j=1;j<=w;j++)
			{
				cin>>c;
				add(i,c),add(c,i);
				vis[c]=true;
			}
		}
		for(int i=1;i<=n;i++)
		{
			if(vis[i]==false)
			{
				root=i;
				break;
			}
		}
		lg=log(n)/log(2);
		dfs(root,root);
		scanf("%d",&q);
		cout<<"case "<<zz<<":"<<endl;
		for(int j=1;j<=q;j++)
		{
			scanf("%d%d",&c,&q);
			printf("%d\n",l(c,q));
		}
	}
	return 0;
}
2020/7/21 20:38
加载中...