題目描述:
動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a**, b吃c,c吃a。 現有n個動物,以1-n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。 有人用兩種說法對這n個動物所構成的食物鏈關係進行描述:
第一種說法是「1 x y」,表示x和y是同類。
第二種說法是「2 x y」,表示x吃y。
此人對n個動物,用上述兩種說法,一句接一句地說出k句話,這k句話有的是真的,有的是假的。當一句話滿足下列三條之一時,這句話就是假話,否則就是真話。
1) 當前的話與前面的某些真的話衝突,就是假話;
2) 當前的話中x或y比n大,就是假話;
3) 當前的話表示x吃x,就是假話。
你的任務是根據給定的n(1<=n<=50,000)和k句話(0<=k<=100,000),輸出假話的總數。
輸入格式
第一行是兩個整數n和k,以乙個空格分隔。 以下k行每行是三個正整數 d,x,y,兩數之間用乙個空格隔開,其中d表示說法的種類。 若d=1,則表示x和y是同類。 若d=2,則表示x吃y。
輸出格式
只有乙個整數,表示假話的數目。
分析:這道題經過題意轉化後其實就是乙個比較複雜的關係處理。
因為這道題需要同時處理同類食物天敵之間的關係。
想到關係處理,我們可能會想到兩種方式: 圖
圖圖 和 並查集
並查集並查
集這道題用圖不是不能做,不過顯然比用並查集麻煩。
所以這道題就是一道並查集的題目。
所以我們根據題意,發現可以定三個並查集,也就是將並查集的長度擴充套件到三倍長。
注:最好不要用多個並查集來儲存關係,因為他們之間並沒有共同點,對於關係的處理也就會出錯(就是這麼錯過來的…………)
我們設:
f a[
i]表示
以i為編
號的父親
fa[i]表示以i為編號的父親
fa[i]表
示以i為
編號的父親1、
處理i的
同類的關
系(
1<=i
<=n
)1、處理i的同類的關係 \ (1<=i<=n)
1、處理i的
同類的關
系(1<=i
<=n)2、
處理i的
天敵的關
系(n+
1<=i
<=2
∗n
)2、處理i的天敵的關係\ (n+1<=i<=2*n)
2、處理i的
天敵的關
系(n+
1<=i
<=2
∗n)3、處
理i的食
物的關係
(2∗n
+1
<=i
<=3
∗n
)3、處理i的食物的關係 (2*n+1<=i<=3*n)
3、處理i的
食物的關
系(2∗
n+1<=i
<=3
∗n)
那麼題目中說的假話也就是與之前話衝突的話,那麼怎麼樣算與之前衝突的呢?
有四種情況:
1 、同
類吃同類
1、同類吃同類
1、同類吃同類2、
同類吃天
敵2、同類吃天敵
2、同類吃天敵3、
和天敵是
同類
3、和天敵是同類
3、和天敵是
同類4 、和
食物是同
類4、 和食物是同類
4、和食物是
同類那麼只要按照以上四中關係處理即可。
/*
1、同類吃同類
2、同類吃天敵
3、和天敵是同類
4、 和食物是同類
1-n 同類
n+1-2*n 天敵
2*n+1-3*n 食物
*/#include
using
namespace std;
int fa[
1000001];
int n,m;
int ans=0;
intgetfa
(int k)
intmain()
if(z==
2&&x==y)
if(z==1)
//3if
(getfa
(x+2
*n)==
getfa
(y)&&x!=y)
//4 fa[
getfa
(x)]
=getfa
(y);
fa[getfa
(x+n)]=
getfa
(y+n)
; fa[
getfa
(x+2
*n)]
=getfa
(y+2
*n);}if
(z==2)
//1if
(getfa
(x+n)
==getfa
(y))
//2 fa[
getfa
(x)]
=getfa
(y+n)
; fa[
getfa
(x+n)]=
getfa
(y+2
*n);
fa[getfa
(x+2
*n)]
=getfa
(y);}}
printf
("%d"
,ans)
;fclose
(stdin);
fclose
(stdout);
return0;
}
並查集 食物鏈
noi2001,水題,但是我調了很久。食物鏈time limit 1000ms memory limit 10000k total submissions 27766 accepted 8066 description 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃...
並查集 食物鏈
食物鏈 description 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。有人用兩種說法對這n個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示...
並查集 食物鏈
動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。有人用兩種說法對這n個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示x和y是同類。第二種說法是 2 ...