求助求助!76分倍增LCA求帮改
查看原帖
求助求助!76分倍增LCA求帮改
631052
ysw0521nb楼主2022/12/2 20:50
#include<bits/stdc++.h>
using namespace std;
const int N=100050;
int n,m;
struct Edge{
	int to,nxt;
}e[N*2];
struct F{
	int a,w;
}f[N][19];
string s;
int h[N],cnt=1;
void add(int u,int v)
{
	e[cnt]={v,h[u]};
	h[u]=cnt++;
}
int dh[N],mp[N];
void dd(int st)
{
	memset(dh,-1,sizeof dh);
	dh[st]=1;
	queue<int>q;
	q.push(st);
	dh[0]=0;
	while(q.size())
	{
		int t=q.front();
		q.pop();
		for(int i=h[t];i;i=e[i].nxt)
		{
			int j=e[i].to;
			if(dh[j]==-1)
			{
				dh[j]=dh[t]+1;
				q.push(j);
				f[j][0].a=t;
				f[j][0].w=mp[j]|mp[t];
				for(int k=1;k<=log2(dh[j])+1;k++)
				{
					f[j][k].a=f[f[j][k-1].a][k-1].a;
					f[j][k].w=f[j][k-1].w|f[f[j][k-1].a][k-1].w;
				}
			}
		}
	}
}
bool lca(int a,int b,string s)
{
	int u,v=0;
	if(s[0]=='H')
		u=1;
	else
		u=2;
	if(dh[a]<dh[b])
		swap(a,b);
	for(int k=log2(dh[a])+1;k>=0;k--)
		if(dh[f[a][k].a]>=dh[b])
		{
			v|=f[a][k].w;
			a=f[a][k].a;
		}
	if(a==b)
		return u&v;
	for(int k=log2(dh[a])+1;k>=0;k--)
	{
		if(f[a][k].a!=f[b][k].a)
		{
			v|=f[a][k].w;
			v|=f[b][k].w;
			a=f[a][k].a;
			b=f[b][k].a;
		}
	}
	v|=f[a][0].w;
	v|=f[b][0].w;
	return u&v;
}
int main()
{
	cin>>n>>m;
	cin>>s;;
	int u,v;
	for(int i=1;i<n;i++)
	{
		scanf("%d%d",&u,&v);
		add(u,v);
		add(v,u);
	}
	for(int i=0;i<n;i++)
		if(s[i]=='H')
			mp[i+1]=1;
		else
			mp[i+1]=2;
	dd(1);
	string a,b="";
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&u,&v);
		cin>>a;
		if(lca(u,v,a))
			b+='1';
		else
			b+='0';
	}
	cout<<b;
	return 0;
}
2022/12/2 20:50
加载中...