題目描述
動物王國中有三類動物 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 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
我們要判斷那些話是假話,就要看哪些話與之前說的不符
動物之間有吃,被吃,同類三種關係,我們只要把每一對x,y的關係記錄好,等到下一對時和前面的對比一下
看是否符合前面的關係就可以了,不符合的一定是假話,而且,對於任意三種動物xyz,我們只要知道xy,yz
這兩條關係,就可以知道這三種動物之間的所有關係了,是不是有點團夥,關押罪犯的影子,只不過這次敵人的
敵人有可能還是敵人,所以就用到了並查集,因為要維護吃,被吃,同類三種關係,所以開三倍fa陣列
(關押罪犯開了兩倍陣列),開三個也行,別弄混了(話說我就弄混了各個陣列的意思)來維護,具體看**
//可以先看一下關押罪犯再做這道題✿✿ヽ(°▽°)ノ✿
//開三倍陣列版本
#include
#include
using
namespace
std;
int n,k,tot=0;
int num,x,y;
int fa[300010];
//n:同類 2*n:自己吃 3*n:吃自己
int find(int x)
int main()
else
}else
if(num==2)
else
if(x1==y1||y2==x1||x2==y3)//之前判斷為同類或是y吃x(直接吃/間接吃)
else
} }}
printf("%d\n",tot);
return0;}
//其實多開幾倍陣列就是乙個中轉站的作用,通過變為某種動物的x1,x2,x3來更新自己的fa陣列
//加權並查集不會啊,聽說,還要用向量,推公式,待補充...
//剛知道多開幾倍陣列的並查集就是無意中看到的那個覺得高大上的擴充套件域並查集omg
上圖是個遞迴啊,哇哇哇!
洛谷 P1074 靶形數獨
p1074 靶形數獨 小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨遊戲,好勝的他 們想用數獨來一比高低。但普通的數獨對他們來說都過於簡單了,於是他們向 z 博士請教,z 博士拿出了他最近發明的 靶形數獨 作為這兩個孩子比試的題目。靶形數獨的方格同普通數獨一樣,在 9 格寬 9 格高...
洛谷P1074 靶形數獨
小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨遊戲,好勝的他 們想用數獨來一比高低。但普通的數獨對他們來說都過於簡單了,於是他們向 z 博士請教,z 博士拿出了他最近發明的 靶形數獨 作為這兩個孩子比試的題目。靶形數獨的方格同普通數獨一樣,在 9 格寬 9 格高的大九宮格中有 9 個...
洛谷P1074 靶形數獨
這道題單獨以每個位置遞迴純暴力搜尋的話,複雜度9 81,考慮剪枝,和八皇后類似,在同一行同一列同一宮則不能放。另外,想象解答樹,先搜尋情況少的位置和先搜尋情況多的位置總結點數是一樣的,不一樣的地方在於先搜情況少的的話,靠近樹根的分叉少,靠近枝葉稠密,若先搜情況多的,則樹根處稠密,枝葉稀疏。考慮剪枝,...