【洛谷P2024】食物链
題目描述
動物王國中有三類動物 A,B,C,這三類動物的食物鏈構(gòu)成了有趣的環(huán)形。A 吃 B,B
吃 C,C 吃 A。
現(xiàn)有 N 個動物,以 1 - N 編號。每個動物都是 A,B,C 中的一種,但是我們并不知道
它到底是哪一種。
有人用兩種說法對這 N 個動物所構(gòu)成的食物鏈關(guān)系進行描述:
第一種說法是“1 X Y”,表示 X 和 Y 是同類。
第二種說法是“2 X Y”,表示 X 吃 Y 。
此人對 N 個動物,用上述兩種說法,一句接一句地說出 K 句話,這 K 句話有的是真
的,有的是假的。當一句話滿足下列三條之一時,這句話就是假話,否則就是真話。
? 當前的話與前面的某些真的話沖突,就是假話
? 當前的話中 X 或 Y 比 N 大,就是假話
? 當前的話表示 X 吃 X,就是假話
你的任務(wù)是根據(jù)給定的 N 和 K 句話,輸出假話的總數(shù)。
輸入輸出格式
輸入格式:
從 eat.in 中輸入數(shù)據(jù)
第一行兩個整數(shù),N,K,表示有 N 個動物,K 句話。
第二行開始每行一句話(按照題目要求,見樣例)
輸出格式:
輸出到 eat.out 中
一行,一個整數(shù),表示假話的總數(shù)。
輸入輸出樣例
輸入樣例#1:100 7 1 101 1 2 1 2 2 2 3 2 3 3 1 1 3 2 3 1 1 5 5輸出樣例#1:
3
說明
1 ≤ N ≤ 5 ? 10^4
1 ≤ K ≤ 10^5
分析
知識點:并查集。
由關(guān)押罪犯的2個集合變成了3個集合。不會做的話可以先去做關(guān)押罪犯。
代碼
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; const int maxn=50000+5; inline int read() {int x=0,f=1; char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}return x*f; } int n,k,ans; int father[maxn*3]; inline int find(int x) {if(x!=father[x]) father[x]=find(father[x]);return father[x]; } inline void merge(int x,int y) {int r1=find(x);int r2=find(y);father[r1]=r2; } int main() {n=read();k=read();for(int i=1;i<=n*3;i++) father[i]=i;for(int i=1;i<=k;i++){int p,x,y;p=read();x=read();y=read();if(x>n||y>n){ans++; continue;}if(p==1){if(find(x+n)==find(y)||find(x+n*2)==find(y)){ans++; continue;}merge(x,y);merge(x+n,y+n);merge(x+n*2,y+n*2);}else if(p==2){if(find(x+2*n)==find(y)||find(x)==find(y)){ans++; continue;}merge(x+n,y);merge(y+2*n,x);merge(y+n,x+2*n);}}printf("%d\n",ans);return 0; }
?
轉(zhuǎn)載于:https://www.cnblogs.com/huihao/p/7618123.html
總結(jié)
以上是生活随笔為你收集整理的【洛谷P2024】食物链的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 予谓菊下一句是什么呢?
- 下一篇: 风之画员里的画是谁画的啊?