后5个点re了找不到问题
查看原帖
后5个点re了找不到问题
287297
Lyr_ids楼主2021/10/12 19:26

rt,采用st表优化欧拉 代码部分

//#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
const int MAXN=500005;
int head[MAXN],oula[MAXN*4],numc,num[MAXN*2],fath[MAXN*2],re[MAXN*2],fir_oula[MAXN*2];
int lg[MAXN*2],maxn[MAXN][50];
struct stu{
	int next,to;
}sd[MAXN*2];
int cnt;
void dfs_mk(int x,int fa)
{
	num[x]=++numc;
	re[num[x]]=x;
	fath[x]=fa;
	for(int i=head[x];i;i=sd[i].next)
		if(sd[i].to-fa)
			dfs_mk(sd[i].to,x);
	return;
}
void dfs_bk(int x)
{
	if(fath[x])
		oula[++numc]=num[fath[x]];
	return;
}
void dfs_fr(int x)
{
	oula[++numc]=num[x];
	for(int i=head[x];i;i=sd[i].next)
		if(sd[i].to-fath[x])
		{
			dfs_fr(sd[i].to);
			dfs_bk(sd[i].to);
		}
	return;
}
void get_fir_oula()
{
	for(int i=1;i<=numc;i++)
		if(!fir_oula[oula[i]])
			fir_oula[oula[i]]=i;
	return;
}
signed main()
{
	//freopen("P3379_8.in","r",stdin);
	int n,m,s;
	cin>>n>>m>>s;
	int tmpx,tmpy;
	for(int i=1;i<n;i++)
	{
		scanf("%d%d",&tmpx,&tmpy);
		for(int j=0;j<2;j++)
		{
			sd[++cnt].next=head[tmpx];
			sd[cnt].to=tmpy;
			head[tmpx]=cnt;
			swap(tmpx,tmpy);
		}
	}
	dfs_mk(s,0);
	numc=0;
	dfs_fr(s);
	lg[0]--;
	for(int i=1;i<=numc;i++)
		lg[i]=lg[i>>1]+1;
	for(int i=1;i<=numc;i++)
		maxn[i][0]=oula[i];
	for(int i=1;i<=lg[numc];i++)
        for(int j=1;j+(1<<i)-1<=numc;j++)
            maxn[j][i]=min(maxn[j][i-1],maxn[j+(1<<i-1)][i-1]);
    get_fir_oula();
	for(int i=0;i<m;i++)
	{
		scanf("%d%d",&tmpx,&tmpy);
		int ntmpx=fir_oula[num[tmpx]],ntmpy=fir_oula[num[tmpy]];
		if(ntmpx>ntmpy)
			swap(ntmpx,ntmpy);
		int mid=lg[ntmpy-ntmpx+1];
		printf("%d\n",re[min(maxn[ntmpx][mid],maxn[ntmpy-(1<<(mid))+1][mid])]);
	}
	return 0;
}
2021/10/12 19:26
加载中...