動物王國中有三類動物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
第一行是兩個整數n和k,以乙個空格分隔。
以下k行每行是三個正整數 d,x,y,兩數之間用乙個空格隔開,其中d表示說法的種類。
若d=1,則表示x和y是同類。
若d=2,則表示x吃y。
output
只有乙個整數,表示假話的數目。
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 output3
題意:
終於可以不用翻譯了。。。。。
題解:這裡給出乙個種不用帶權並查集的方法,由於我們不知道x,y的種類,所以我們開乙個三倍大的陣列,假設每種情況,x為a,x+n為b,x+n+n為c,對於第一種說法,如果,x是a,y是b,c就是錯,既判斷(x,y+n)(x,y+n+n)是否同根。同根為錯,否則,把(x,y),(x+n,y+n),(x+n+n,y+n+n)合併。對於第二種說法,如果(x,y)(x,y+n+n)同根,為錯(x不能等於y,x不能被y吃),否則,合併(x,y+n)(x+n,y+n+n)(x+n+n,y);
**:
#include#include#include#include#include#include #include #define eps 1e-10
#define n 50001
#define inf 1<<20
#define zero(a) (fabs(a)n||y>n)
if(z==1)
}else}}
cout<
我有個疑問,對於說法為錯的理解,除了2和3這種錯誤外,我們判斷乙個說法是否為真,得找出與他矛盾的說法。例如(2,x,y)和(2,y,x),其中至少乙個為錯,我們假設前面的說法是正確的,則對於所有滿足前面的說法的說法都是正確的。但是,這只是假設,有可能後面的說法是正確的,則所有滿足後面說法的說法才是正確的,這樣,錯誤的說法不就是不唯一了嗎。還是說,對於一種說法是否正確,我們可以從後面證明出來,但這是乙個環,並不可能推出來吧。。。。。。不懂。
小弟這還有另乙個思路,求給出錯誤的地方,我用a[n].b[n]實現,a為判斷兩者是否為同類,b為判斷兩者是否是吃與被吃的關係,對於每乙個說法1,如果b[x].count(y)||b[y].count(x),既x,y是吃與被吃的關係,ans++,否則,a[x].insert(y).對於每乙個說法2.如果a[x].count(y)||b[y].count(x),既x,y是同類,或者是y能吃x的關係,ans++,否則,b[x].insert(y);
wa了,想知道為什麼。。。
**:#include#include#include#include#include#include #include #define eps 1e-10
#define n 50001
#define inf 1<<20
#define zero(a) (fabs(a)a[n],b[n];
int main()}}
else}}
}printf("%d\n",ans);
}
並查集 筆記與思路整理
算是非常基礎的內容了,之前寫到kruskal的時候突然想起還沒整理過。其實就想存個板子 並查集是一種樹型的資料結構,用於處理一些集合 只能是不交集 感性理解 一下就是把一堆東西分成若干堆,每個東西都在且僅在其中一堆裡。具體實現的話利用乙個father陣列,指向該元素的父親節點。初始時所有元素的fat...
求連通塊(並查集實現)
連通塊可以理解為無向圖中有幾個連通的點集,那麼這個過程與並查集的原理就極其相似了,將點集看作並查集的祖先和他的後代們,相互連通的點就放在同一祖先下,這樣只需要查詢共有幾個祖先即可。下面來一道例題深入理解下 jsoi2008 星球大戰 當我們加入乙個點時,先假設又加入乙個單獨的連通塊,然後再掃一下與它...
任意點 並查集求聯通塊
任意點時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 平面上有若干個點,從每個點出發,你可以往東南西北任意方向走,直到碰到另乙個點,然後才可以改變方向。請問至少需要加多少個點,使得點對之間互相可以到達。第一行乙個整數...