蒟蒻想尝试LCA+倍增,54分求助大佬改错orz
查看原帖
蒟蒻想尝试LCA+倍增,54分求助大佬改错orz
282259
W1nNy_楼主2021/2/22 15:08
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstring>
using namespace std;
const int N=100005;
int head[N],net[N*2],edge[N*2],in[N],d[N],fa[N],f[N][18];
int n,m,idx;
bool  cow[N],g[N][18][2];
void add(int x,int y)
{
	in[y]++;
	edge[idx]=y;
	net[idx]=head[x];head[x]=idx++;
}
void prework(int u)
{
	g[u][0][cow[u]]=1;
	f[u][0]=fa[u];
	for(int i=1;i<=17;i++)
	{
		f[u][i]=f[f[u][i-1]][i-1];
		g[u][i][0]|=(g[u][i-1][0]|g[f[u][i-1]][i-1][0]);
		g[u][i][1]|=(g[u][i-1][1]|g[f[u][i-1]][i-1][1]);
	}
	for(int i=head[u];i!=-1;i=net[i])
	{
		int j=edge[i];
		if(fa[u]==j)	continue;
		fa[j]=u;
		d[j]=d[u]+1;
		prework(j);
	}
	return ;
}
bool lca(int x,int y,bool z)
{
	if(x==y)	return cow[x]==z;
	bool ans=false;
	if(d[x]<d[y])	swap(x,y);
	for(int i=17;i>=0;i--)
		if(d[f[x][i]]>=d[y])
		{
	//		printf("%d %d %d\n",x,i,z);
	//		printf("Test:%d\n",g[x][i][z]);
			ans|=g[x][i][z];		
			x=f[x][i];
		}
	if(x==y)		return ans;	
	for(int i=17;i>=0;i--)
		if(f[x][i]!=f[y][i])
		{
			ans|=g[x][i][z];
			ans|=g[y][i][z];	
			x=f[x][i];y=f[y][i];
		}
	ans|=g[x][0][z];ans|=g[y][0][z];
	return ans;
}
int main()
{	
//	freopen("P5836_2.in","r",stdin);
//	freopen("P5836test.out","w",stdout);
	memset(head,-1,sizeof head);
	scanf("%d%d",&n,&m);
	char c;
	getchar();
	for(int i=1;i<=n;i++)
	{
		scanf("%c",&c);
		if(c=='H')	cow[i]=true;
	}
	for(int i=1;i<n;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);add(y,x);
	}
	fa[1]=1;prework(1);
	for(int i=1;i<=m;i++)
	{
		int x,y;
		bool flag;
		char space;
		scanf("%d%d%c%c",&x,&y,&space,&c);
		if(c=='H')	flag=lca(x,y,true);
		if(c=='G')	flag=lca(x,y,false);
		if(flag)	printf("1");
		else		printf("0");
	//	if(i%8==0)printf("\n");
	}
	return 0;
 } 
2021/2/22 15:08
加载中...