動物王國中有三類動物 a,b,c,這三類動物的食物鏈構成了有趣的環形。a 吃 b,b
吃 c,c 吃 a。
現有 n 個動物,以 1 - n 編號。每個動物都是 a,b,c 中的一種,但是我們並不知道
它到底是哪一種。
有人用兩種說法對這 n 個動物所構成的食物鏈關係進行描述:
第一種說法是「1 x y」,表示 x 和 y 是同類。
第二種說法是「2 x y」,表示 x 吃 y 。
此人對 n 個動物,用上述兩種說法,一句接一句地說出 k 句話,這 k 句話有的是真
的,有的是假的。當一句話滿足下列三條之一時,這句話就是假話,否則就是真話。
• 當前的話與前面的某些真的話衝突,就是假話
• 當前的話中 x 或 y 比 n 大,就是假話
• 當前的話表示 x 吃 x,就是假話
你的任務是根據給定的 n 和 k 句話,輸出假話的總數。
輸入格式:
從 eat.in 中輸入資料
第一行兩個整數,n,k,表示有 n 個動物,k 句話。
第二行開始每行一句話(按照題目要求,見樣例)
輸出格式:
輸出到 eat.out 中
一行,乙個整數,表示假話的總數。
輸入樣例#1: 複製
100 7輸出樣例#1: 複製1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5
3很明顯是並查集 但是又很難下手 不知道該和同類並還是和敵對關係並。。。
有乙個非常巧妙地方法 將並查集擴為3*n 1-n表示本體 n+1-2*n表示獵物 2*n+1-3*n表示天敵 所有有關係的全部並一下!
一開始的** 一直wa
#includeusingview codenamespace
std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define ri(n) scanf("%d",&(n))
#define rii(n,m) scanf("%d%d",&n,&m)
#define riii(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define rs(s) scanf("%s",s);
#define ll long long
#define rep(i,n) for(int i=0;i
#define clr(a,v) memset(a,v,sizeof a)
/////////////////////////////////
/#define inf 0x3f3f3f3f
#define n 100000+5
int f[3*n];
int find1(int
x)void union1(int a,int
b)int
main()
if(a==1
)
else cnt++;
}else
if(a==2
)
if(find1(3*b)==find1(c)||find1(2*c)==find1(b))
union1(
2*b,c);
union1(
3*c,b);
union1(
2*c,3*b);
//union1()
} }
printf(
"%d\n
",cnt);
return0;
}
+kn 寫成*k 我不wa誰wa。。
還有乙個細節就是當是同類的時候 也要union 3對點
還有乙個容易漏的是 因為是三角迴圈 除xy另外乙個類也要進行操作
#includeusingview codenamespace
std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define ri(n) scanf("%d",&(n))
#define rii(n,m) scanf("%d%d",&n,&m)
#define riii(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define rs(s) scanf("%s",s);
#define ll long long
#define rep(i,n) for(int i=0;i
#define clr(a,v) memset(a,v,sizeof a)
/////////////////////////////////
/#define inf 0x3f3f3f3f
#define n 100000+5
int f[3*n];
int find1(int
x)void union1(int a,int
b)int
main()
if(a==1
)
union1(b,c);
union1(b+n,c+n);
union1(b+2*n,c+2*n);
}else
if(a==2
)
union1(n+b,c);
union1(
2*n+c,b);
union1(n+c,2*n+b);}}
printf(
"%d\n
",cnt);
return0;
}
P2024 NOI2001 食物鏈 題解
動物王國中有三類動物 a,b,c,這三類動物的食物鏈構成了有趣的環形。a 吃 b,b 吃 c,c 吃 a。現有 n 個動物,以 1 n 編號。每個動物都是 a,b,c 中的一種,但是我們並不知道 它到底是哪一種。有人用兩種說法對這 n 個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示...
洛谷P2024 NOI2001 食物鏈
題目描述 動物王國中有三類動物 a,b,c,這三類動物的食物鏈構成了有趣的環形。a 吃 b,b 吃 c,c 吃 a。現有 n 個動物,以 1 n 編號。每個動物都是 a,b,c 中的一種,但是我們並不知道 它到底是哪一種。有人用兩種說法對這 n 個動物所構成的食物鏈關係進行描述 第一種說法是 1 x...
洛谷 P2024 NOI2001 食物鏈
這是一道並查集的題目。我們先來分析一下題目。有三種動物,a 吃 b,b吃 c,c 吃 a。那麼對於乙個動物來說,另乙個動物就有了三種情況 同類,天敵以及獵物。很容易可以想到,僅僅是利用普通的並查集已經無法滿足需要了,因為我們有三種情況需要表示。僅僅表示同類可以只用一倍長度的陣列,那麼如果是用三種關係...