原題鏈結
食物鏈time limit: 1000ms memory limit: 10000k
total submissions: 64244 accepted: 18870
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
第一行是兩個整數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 output
3這個題的解釋在《挑戰程式設計競賽》上其實解釋的很詳細,大概意思是這樣的:
由於n和k很大,所以必須高效地維護動物之間的關係,並快速判斷是否產生了矛盾。並查集是維護 「屬於同一組」 的資料結構,但是在本題中,並不只有屬於同一類的資訊,還有捕食關係的存在。因此需要開動腦筋維護這些關係。
對於每只動物i建立3個元素i-a, i-b, i-c, 並用這3*n個元素建立並查集。這個並查集維護如下資訊:
① i-x 表示 「i屬於種類x」。
②並查集裡的每乙個組表示組內所有元素代表的情況都同時發生或不發生。
例如,如果i-a和j-b在同乙個組裡,就表示如果i屬於種類a那麼j一定屬於種類b,如果j屬於種類b那麼i一定屬於種類a。因此,對於每一條資訊,只需要按照下面進行操作就可以了。
1)第一種,x和y屬於同一種類———合併x-a和y-a、x-b和y-b、x-c和y-c。
2)第二種,x吃y—————————合併x-a和y-b、x-b和y-c、x-c和y-a。
不過在合併之前需要先判斷合併是否會產生矛盾。例如在第一種資訊的情況下,需要檢查比如x-a和y-b或者y-c是否在同一組等資訊。
有某一種關係就合併那兩部分,並且把他們所有的情況都合併,這樣以後在判斷的時候無論是從x的角度還是y的角度,只要發現他們祖先相同的情況不是想要的,那麼那一定是乙個錯誤的關係。
而初始化的時候每個元素的祖先都是自己,剛好跳過了
if(same(x,y+n) || same(x,y+2*n))
和
if(same(x,y) || same(x,y+2*n))
的情況,所以初始化後這個判斷條件依然也是正確的,但是這個判斷的順序若是換了的話那麼久肯定會出錯了
//
#include #include #include #include #include #include using namespace std;
const int mod = int(1e9) + 7;
//int mod = 99990001;
const int inf = 0x3f3f3f3f;
//const ll inff = 0x3f3f3f3f3f3f3f3fll;
//const db eps = 1e-9;
//const db oo = 1e20;
//const db pi = acos(-1.0); //m_pi;
const int fx = ;
const int fy = ;
const int maxn=1000000 + 10;
int n,k;
int cmd[maxn],x[maxn],y[maxn];
int f[maxn],deep[maxn];
//初始化父親與深度
void init(int sum)
else
}void solve()
if(c==1)
else
}else
else}}
printf("%d\n",ans);
}int main()
並查集 食物鏈
noi2001,水題,但是我調了很久。食物鏈time limit 1000ms memory limit 10000k total submissions 27766 accepted 8066 description 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃...
並查集 食物鏈
食物鏈 description 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。有人用兩種說法對這n個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示...
並查集 食物鏈
動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。有人用兩種說法對這n個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示x和y是同類。第二種說法是 2 ...