求大佬查错!
查看原帖
求大佬查错!
212365
Pioneerwyp楼主2020/10/22 14:20
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N=1e5+10,M=2e5+10;
int n,m,tot,Sg[N],Sh[N],ans[N];
int fa[N],ver[M],nex[M],head[N],vis[N];
vector<int> query[N],query_id[N];
char cow[N],Q[N];

int Find(int x) {return fa[x]==x?x:fa[x]=Find(fa[x]);}
void add(int x,int y){ver[++tot]=y,nex[tot]=head[x],head[x]=tot;}
void add_query(int x,int y,int id)
{
	query[x].push_back(y);query_id[x].push_back(id);
	query[y].push_back(x);query_id[y].push_back(id);
}

void dfs(int x,int fa,int sh,int sg)
{
	for(int i=head[x];i;i=nex[i])
	{
		int y=ver[i];
		if(y==fa) continue;
		if(cow[y]=='H') Sh[y]=sh+1,Sg[y]=sg,dfs(y,x,sh+1,sg);
		else Sh[y]=sh,Sg[y]=sg+1,dfs(y,x,sh,sg+1);
	}
}

void tarjan(int x)
{
	vis[x]=1;
	for(int i=head[x];i;i=nex[i])
	{
		int y=ver[i];
		if(vis[y]) continue;
		tarjan(y);
		fa[y]=x;
	}
	for(int i=0;i<query[x].size();i++)
	{
		int y=query[x][i],id=query_id[x][i];
		if(vis[y]==2)
		{
			int lca=Find(y);
			if(Q[id]=='H')
			{
				int plus=(cow[lca]=='H'?1:0);
				int Hsum=Sh[x]+Sh[y]-2*Sh[lca]+plus;
				if(Hsum) ans[id]=1;
			}
			else if(Q[id]=='G')
			{
				int plus=(cow[lca]=='G'?1:0);
				int Gsum=Sg[x]+Sg[y]-2*Sg[lca]+plus;
				if(Gsum) ans[id]=1;
			}
		}
	}
	vis[x]=2;
}

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) cin>>cow[i];
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<n;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);add(y,x);
	}
	if(cow[1]=='H') Sh[1]=1,dfs(1,0,1,0);
	else Sg[1]=1,dfs(1,0,0,1);
	//for(int i=1;i<=n;i++){printf("%d %d\n",Sh[i],Sg[i]);}
	for(int i=1;i<=m;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		add_query(x,y,i);
		cin>>Q[i];
	}
	tarjan(1);
	for(int i=1;i<=m;i++) printf("%d",ans[i]);
	return 0;
}

WA掉了2,8,9三个点,dalao能帮忙看下吗555...

2020/10/22 14:20
加载中...