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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章