2436. Milk Visits

2436. Milk Visits

题目描述

Farmer John 计划建造 N(1≤N≤10^5)个农场,用 N−1 条道路连接,构成一棵树(也就是说,所有农场之间都互相可以到达,并且没有环)。每个农场有一头奶牛,品种为更赛牛或荷斯坦牛之一。
Farmer John 的 M 个朋友(1≤M≤10^5)经常前来拜访他。在朋友 i 拜访之时,Farmer John 会与他的朋友沿着从农场 Ai 到农场 Bi 之间的唯一路径行走(可能有 Ai=Bi)。除此之外,他们还可以品尝他们经过的路径上任意一头奶牛的牛奶。由于 Farmer John 的朋友们大多数也是农场主,他们对牛奶有着极强的偏好。他的有些朋友只喝更赛牛的牛奶,其余的只喝荷斯坦牛的牛奶。任何 Farmer John 的朋友只有在他们访问时能喝到他们偏好的牛奶才会高兴。
请求出每个朋友在拜访过后是否会高兴。

输入

输入的第一行包含两个整数 N 和 M。
第二行包含一个长为 N 的字符串。如果第 i 个农场中的奶牛是更赛牛,则字符串中第 i 个字符为 ‘G’,如果第 i 个农场中的奶牛是荷斯坦牛则为 ‘H’。
接下来下 N−1 行,每行包含两个不同的整数 X 和 Y(1≤X,Y≤N),表示农场 X 与 Y 之间有一条道路。
接下来下 M 行,每行包含整数 Ai,Bi,以及一个字符 Ci。Ai 和 Bi 表示朋友 i 拜访时行走的路径的端点,Ci 是 ‘G’ 或 ‘H’ 之一,表示第 i 个朋友喜欢更赛牛的牛奶或是荷斯坦牛的牛奶。

输出

输出一个长为 M 的二进制字符串。如果第 i 个朋友会感到高兴,则字符串的第 i 个字符为 ‘1’,否则为 ‘0’。

样例输入

5 5
HHGHG
1 2
2 3
2 4
1 5
1 4 H
1 4 G
1 3 G
1 3 H
5 5 H

样例输出

10110

数据范围限制
测试点 2-5 满足 N≤103,M≤2⋅103。
全部测试点满足 N≤105,M≤105。

提示
在这里,从农场 1 到农场 4 的路径包括农场 1、2 和 4。所有这些农场里都是荷斯坦牛,所以第一个朋友会感到满意,而第二个朋友不会。

思路:
可以把两种牛奶看成两种颜色。
我们可以把同一种颜色合并,然后询问是判断一下一条路的情况就行了:

  1. 路上只有一种,那就看看它的颜色与目标一致?1:0;
  2. 如果路上有两种,就直接1了。

学过并查集的就没有然后了。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int MAX=2147483647;
const int N=1e6;
int n,m,f[N],tot,ans[N];
string str;
int find(int x) {return x==f[x]?x:f[x]=find(f[x]);}
void input()
{
	cin>>n>>m;
	cin>>str;
	for(int i=1;i<=n;i++) f[i]=i;
	for(int i=1;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		if(str[x-1]==str[y-1]) f[find(x)]=find(y); 
	}		
	for(int i=1;i<=m;i++)
	{
		int a,b;
		char z;
		cin>>a>>b>>z;
		if(find(a)==find(b)&&str[find(a)-1]==z) ans[++tot]=1;
		if(find(a)==find(b)&&str[find(a)-1]!=z) ans[++tot]=0;
		if(find(a)!=find(b)) ans[++tot]=1;
	}
	for(int i=1;i<=tot;i++) cout<<ans[i];
}
int main()
{
	//fre(milkvisits);
	input();
	return 0;
}
原创文章 157 获赞 148 访问量 8305

猜你喜欢

转载自blog.csdn.net/bigwinner888/article/details/105869822