日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AC日记——食物链 codevs 1047

發布時間:2025/5/22 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AC日记——食物链 codevs 1047 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1074 食物鏈

?

2001年NOI全國競賽

?時間限制: 3 s ?空間限制: 64000 KB ?題目等級 : 鉆石 Diamond 題解 題目描述?Description

動物王國中有三類動物 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句話有的是真的,有的是假的。當一句話滿足下列三條之一時,這句話就是假話,否則就是真話。   

1) 當前的話與前面的某些真的話沖突,就是假話;   

2) 當前的話中X或Y比N大,就是假話;   

3) 當前的話表示X吃X,就是假話。   

你的任務是根據給定的N(1<=N<=50,000)和K句話(0<=K<=100,000),輸出假話的總數。

輸入描述?Input Description

第一行是兩個整數N和K,以一個空格分隔。   

以下K行每行是三個正整數D,X,Y,兩數之間用一個空格隔開,其中 D 表示說法的種類。   

若D=1,則表示X和Y是同類。   

若D=2,則表示X吃Y。

輸出描述?Output Description

只有一個整數,表示假話的數目。

樣例輸入?Sample Input

100 7

1 101 1

2 1 2

2 2 3

2 3 3

1 1 3

2 3 1

1 5 5

樣例輸出?Sample Output

3

數據范圍及提示?Data Size & Hint

輸入文件??

?對7句話的分析 100 7

1 101 1  假話

2 1 2  ? 真話

2 2 3  ? 真話

2 3 3  ? 假話

1 1 3  ? 假話

2 3 1  ? 真話

?1 5 5  ? 真話

NOI 2001 食物鏈(eat)

?

思路:

  并查集;

  怎么做呢?

  有人說要用帶權并查集

  然而我是蒟蒻我不會

  我們要開三倍的n的father數組

  i表示與i同類的集合

  i+n表示i可以吃的集合

  i+n+n表示i+n可以吃且可以吃i的集合

  然后每次判斷是否是符合已有的真話

  不符合ans++

  符合就作為一條新的真話

?

來,上代碼:

#include <cstdio>#define maxn 50001 #define maxm 100001using namespace std;class Finding {private:int n,m,f[maxn*3],if_z,ans;char Cget;inline void read_int(int &now_){now_=0,if_z=1,Cget=getchar();while(Cget>'9'||Cget<'0'){if(Cget=='-') if_z=-1;Cget=getchar();}while(Cget>='0'&&Cget<='9'){now_=now_*10+Cget-'0';Cget=getchar();}now_*=if_z;}public:Finding(){read_int(n),read_int(m);for(int i=1;i<=n*3;i++) f[i]=i;int type,x,y;for(int i=1;i<=m;i++){read_int(type),read_int(x),read_int(y);if(x>n||y>n){ans++;continue;}if(type==1){if(If_same(x,y+n)||If_same(x,y+n+n)){ans++;continue;}else{Merge(x,y);Merge(x+n,y+n);Merge(x+n+n,y+n+n);}}else{if(If_same(x,y)||If_same(x+n+n,y)){ans++;continue;}else{Merge(x+n,y);Merge(x+n+n,y+n);Merge(x,y+n+n);}}}printf("%d\n",ans);}int Find(int x){if(x==f[x]) return x;f[x]=Find(f[x]);return f[x];}bool If_same(int x,int y){if(Find(x)==Find(y)) return true;else return false;}void Merge(int x,int y){x=Find(x),y=Find(y);if(x!=y) f[x]=y;} }; class Finding do_;int main() {return 0; }

?

轉載于:https://www.cnblogs.com/IUUUUUUUskyyy/p/6296597.html

總結

以上是生活随笔為你收集整理的AC日记——食物链 codevs 1047的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。