萌 新 求 助
查看原帖
萌 新 求 助
91956
Dreamweaver楼主2021/7/20 10:42
#include<bits/stdc++.h>
using namespace std;
#define mod 998244353
#define inf 0x3f3f3f3f
#define re register
#define maxn 300010
#define int long long
#define Orz cout<<"stO %王队% Orz"<<'\n';
int n,m,f1[maxn],f2[maxn];
string a;
struct node
{
	int s,t,next;
}edge[maxn];
int head[maxn],cnt;
void add(int s,int t)
{
	edge[++cnt].s=s;
	edge[cnt].t=t;
	edge[cnt].next=head[s];
	head[s]=cnt;
}
int f[maxn][25],dep[maxn];
void dfs(int u,int fa)
{
	dep[u]=dep[fa]+1;
	f[u][0]=fa;
	for(re int i=1;i<=23;++i)
		f[u][i]=f[f[u][i-1]][i-1];
	for(re int i=head[u];i;i=edge[i].next)
	{
		int tt=edge[i].next;
		if(tt==fa)	continue;
		dfs(tt,u);
	}
}
int lca(int p1,int p2)
{
	if(dep[p1]<dep[p2])	swap(p1,p2);
	for(re int i=23;i>=0;i--)
		if(dep[f[p1][i]]>=dep[p2])	p1=f[p1][i];
	if(p1==p2)	return p1;
	for(re int i=23;i>=0;--i)
		if(f[p1][i]!=f[p2][i])	
			p1=f[p1][i],p2=f[p2][i];
	return f[p1][0];
}
void kkk(int u,int fa)
{	
//	cout<<u<<' '<<a[u]<<endl;
	if(a[u]=='H')	f1[u]++;
	else
		f2[u]++;
	f1[u]+=f1[fa];
	f2[u]+=f2[fa];
	for(re int i=head[u];i;i=edge[i].next)
	{
		int tt=edge[i].t;
		if(tt==fa)	continue;
		kkk(tt,u);
	}
}
inline int read(){
    int x=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9') {if(ch=='-')f=-1; ch=getchar();}
    while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0'; ch=getchar();}
    return x*f;
}
signed main()
{
//	freopen("a.in","r",stdin);
//	freopen("a.out","w",stdout);
//	printf("%dM\n",(sizeof(dp) >> 20));
	cin>>n>>m;
	cin>>a;
	a=' '+a;

	for(re int i=1;i<n;++i)
	{
		int w,b;
		w=read(),b=read();
		add(w,b),add(b,w);
	}
//		for(re int i=head[1];i;i=edge[i].next)
//	{
//		cout<<edge[i].t<<endl;
//	}
	dfs(1,0);
	kkk(1,0);
//	for(re int i=1;i<=n;++i)
//		cout<<f1[i]<<" "<<f2[i]<<endl;
	for(re int i=1;i<=m;++i)
	{
		int q,b;
		char ch;
		q=read(),b=read(),cin>>ch;
		if(ch=='H')
		{
			if((f1[q]+f1[b]-f1[lca(q,b)]-f1[f[lca(q,b)][0]])>0)
				cout<<1;
			else
				cout<<0;
		}
		else
		{
			if((f2[q]+f2[b]-f2[lca(q,b)]-f2[f[lca(q,b)][0]])>0)
				cout<<1;
			else
				cout<<0;
		}
	}
	return 0;
}
2021/7/20 10:42
加载中...