悬1关 LCA欧拉序模板0pts求调
查看原帖
悬1关 LCA欧拉序模板0pts求调
344847
Rubi_sama楼主2023/4/29 16:45

用的是ST表的方法,准确的来说是样例都没过,没有找出来任何错误也不理解为什么会错

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10,M=5e5+10;
#define fo1(l,r) for(register int i=l;i<=r;i++)
#define fo2(l,r) for(register int j=l;j<=r;j++)
#define fo3(l,r) for(register int k=l;k<=r;k++)
#define fo4(l,r) for(register int tt=l;tt<=r;tt++)
#define re register
#define inf 0x3f3f3f3f
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch))
	{
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(isdigit(ch))
	{
		x=(x<<3)+(x<<1)+ch-48;
		ch=getchar();
	}
	return x*f;
}
int n,m,st;
struct node
{
	int from,to,last;
}x[M*2];
int s,h[N];
int ls1,ls2,ls3,ls4,ls;
int dep[N],now,maxn;
int fi[N];//表示首次遍历到i节点时的遍历次数
int f[M*2][50][2];//f是维护DFS的最小值 ,DFS储dfs序对应节点的dep值,该数组已省略 .0是值,1是下标 
//在dfs中每条边都被"来回"走了两次,所以是2*M 

inline void yadd(int xx)
{
	f[++now][0][0]=dep[xx];
	f[now][0][1]=xx;
	return;
}
inline void dfs(int p)
{
	yadd(p);
	fi[p]=now;
	for(re int i=h[p],go;i;i=x[i].last)
	{
		go=x[i].to;
		if(!dep[go])
		{
			dep[go]=dep[p]+1;
			dfs(go);
			yadd(p);
		}
	}
	return;
}
inline int yRMQ(int xx,int yy)
{
	ls3=log(yy-xx+1)/log(2);
	if(f[xx][ls3][0]<f[yy-(1<<ls3)+1][ls3][0])
	{
		return f[xx][ls3][1];
	}
	else
	{
		return f[yy-(1<<ls3)+1][ls3][1];
	}
}
inline void swap(int &xx,int &yy)
{
	xx^=yy;
	yy^=xx;
	xx^=yy;
	return;
}
int main()
{
	n=read();m=read();st=read();
	fo1(1,n-1)
	{
		ls1=read();ls2=read();
		x[++s].last=h[ls1];
		x[s].from=ls1;
		x[s].to=ls2;
		h[ls1]=s;
		
		x[++s].last=h[ls2];
		x[s].from=ls2;
		x[s].to=ls1;
		h[ls2]=s;
	}
	
	dep[st]=1;
	dfs(st);
	//下面开始ST表的预处理
	maxn=log(now)/log(2);
	fo1(1,maxn)
	{
		ls1=n-((1<<i)-1);
		fo2(1,ls1)
		{
			if(f[j][i-1][0]<f[j+(1<<(i-1))][i-1][0])
			{
				f[j][i][0]=f[j][i-1][0];
				f[j][i][1]=f[j][i-1][1];
			}
			else
			{
				f[j][i][0]=f[j+(1<<(i-1))][i-1][0];
				f[j][i][1]=f[j+(1<<(i-1))][i-1][1];
			}
		}
	}
	fo1(1,m)
	{
		ls1=read();ls2=read();
		ls1=fi[ls1];ls2=fi[ls2];
		if(ls1>ls2)
		{
			swap(ls1,ls2);
		}
		printf("%d\n",yRMQ(ls1,ls2));
	}
	return 0;
}
2023/4/29 16:45
加载中...