社区讨论

P5836 84分求助Wa on#6#11

学术版参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lz8bok8b
此快照首次捕获于
2024/07/30 19:16
2 年前
此快照最后确认于
2024/07/30 20:37
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=100010,M=N*2;
int head[N],ver[M],Next[M],edge[M],tot=0;
int f[N][22],t,d[N],dist[N],flag[N];
int n,m;
char s[N];
void add(int x,int y,int z){
	ver[++tot]=y,Next[tot]=head[x],head[x]=tot,edge[tot]=z;
}
void bfs(int root){
	d[root]=1;
	dist[root]=0;
	if(s[root]=='H')
		dist[root]=1;
	queue<int> q;
	q.push(root);
	while(q.size()){
		int x=q.front();
		q.pop();
		for(int i=head[x];i;i=Next[i]){
			int y=ver[i],z=edge[i];
			if(d[y])
				continue;
			d[y]=d[x]+1;
			dist[y]=dist[x]+z;
			q.push(y);
			f[y][0]=x; 
			for(int j=1;j<=t;j++)
				f[y][j]=f[f[y][j-1]][j-1];
		}
	}
}
int lca(int x,int y){
	if(d[x]<d[y])
		swap(x,y);
	for(int i=t;i>=0;i--)
		if(d[f[x][i]]>=d[y])
			x=f[x][i];
	if(x==y)
		return y;
	for(int i=t;i>=0;i--)
		if(f[x][i]!=f[y][i])
			x=f[x][i],y=f[y][i];
	return f[x][0];
}
int main(){
	scanf("%d %d",&n,&m);
	t=(int)log2(n)+1;
	scanf("%s",s+1);
	for(int i=1;i<n;i++){
		int x,y,z=0;
		scanf("%d %d",&x,&y);
		if(s[y]=='H')
			z=1;
		add(x,y,z);
		add(y,x,z);
	}
	bfs(1);
	for(int i=1;i<=m;i++){
		int x,y;
		char c;
		flag[i]=0;
		scanf("%d %d %c",&x,&y,&c);
		if(x==y){
			if(c==s[x])
				flag[i]=1;
			continue;
		}
		int Lca=lca(x,y);
		int distt=dist[x]+dist[y]-2*dist[Lca]+(s[Lca]=='H'),dd=d[x]+d[y]-2*d[Lca];
		if(distt>0&&c=='H')
			flag[i]=1;
		else if(distt<=dd&&c=='G')
			flag[i]=1;
	}
	for(int i=1;i<=m;i++)
		printf("%d",flag[i]);
	return 0;
} 

回复

0 条回复,欢迎继续交流。

正在加载回复...