树链剖分写炸求调
查看原帖
树链剖分写炸求调
263414
Sktic楼主2022/9/11 23:06

RT,刚接触树剖,写个模板心态炸了。。。这个vector存图到底哪里出了问题啊()一直不对

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
typedef long long ll;
struct node
{
	int fa,deep,size,top,son,dfn;
}t[maxn];
int rnk[maxn];
vector<int>c[maxn];
void dfs1(int x)
{
//	cout<<x<<endl;
	t[x].size=1;
	t[x].deep=t[t[x].fa].deep+1;
	for(int i=0;i<c[x].size();i++)
	{
//		cout<<"size:"<<c[x].size()<<endl;
		if(c[x][i]=t[x].fa)
			continue;
		t[c[x][i]].fa=x;
		dfs1(c[x][i]);
		t[x].size+=t[c[x][i]].size;
		if(!t[x].son||t[c[x][i]].size>t[t[x].son].size)
			t[x].son=c[x][i];
	}
	return;
}
int cnt=0;
void dfs2(int x,int tp)
{
	t[x].top=tp;
	cnt++;
	t[x].dfn=cnt;
	rnk[cnt]=x;
	if(t[x].son)
		dfs2(t[x].son,tp);
	for(int i=0;i<c[x].size();i++)
	{
//		cout<<x<<" "<<c[x][i]<<" "<<endl;
		if(c[x][i]==t[x].son||c[x][i]==t[x].fa)
			continue;
		dfs2(c[x][i],c[x][i]);
	}
	return;
}
int lca(int x,int y)
{
	while(t[x].top!=t[y].top)
	{
		if(t[t[x].top].deep>=t[t[y].top].deep)
			x=t[t[x].top].fa;
		else
			y=t[t[y].top].fa; 
	}
	return (t[x].deep<t[y].deep?x:y);
}
inline int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')
			f=-1; 
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=x*10+int(c-'0');
		c=getchar();
	}
	return x*f;
}
int main()
{
//	ios::sync_with_stdio(false);
	int n,m,s;
//	n=read();m=read();s=read();
	cin>>n>>m>>s; 
	for(int i=1;i<=n-1;i++)
	{
		int uk,vv;
		cin>>uk>>vv;
		c[uk].push_back(vv);
//		cout<<c[u][c[u].size()-1]<<"x"<<c[u].size()<<endl;
		c[vv].push_back(uk);
	}
//	cout<<endl<<endl;
	t[s].deep=0;
	dfs1(s);
	dfs2(s,s);
	for(int i=1;i<=m;i++)
	{
		int x,y;
		cin>>x>>y;
		printf("%d\n",lca(x,y));
	}
	return 0;
}
2022/9/11 23:06
加载中...