輸入若干句話,請求我們判斷一共有幾句是假話
• 當前的話與前面的某些真的話衝突,就是假話
• 當前的話中 x 或 y 比 n 大,就是假話
• 當前的話表示 x 吃 x,就是假話
根據如此,我們可以一邊讀入,一邊處理。後面兩個兩個條件是極好判斷的,但難點就在於第一點,這時候,我們就引入乙個全新的並查集概念:補集法,而這個概念的主要實現就是將陣列開到x*n(x為任意一數)的範圍。在這一題中,我們之所以要用到補集法是因為題目中出現了三種關係:a→b→c→a,與其說是乙個食物鏈,倒不如是乙個食物環,將食物鏈轉化到了這一步,我們就不難看出每種動物都有三種關係:同類,獵物以及天敵。而我們使用補集法,就可以將同類儲存到f[i]中,而獵物則放到f[i+n]中,同理,天敵就放到f[i+n*2]中。既然如此,那我們每讀入兩個動物,就看下他們的祖先是否符合當前的描述,如果不符合,那麼累加,進入下一次迴圈,如果符合的話就將這兩種動物進行合併。更具體的操作請看**:
#include
#include
#include
#include
#include
#define ll long long
using
namespace
std;
inline ll read()
while(s>='0'&&s<='9')
return d*f;
}int f[150001];
int father(int i)//找i的祖先
void hb(int x,int y)//合併兩個集合
int main()
//先將兩個簡單的條件判斷了
if(b==c&&a==2)
if(a==1)//當我們可能是同類時:
//如果你是我的獵物或天敵,那你肯定不是我的同類,所以ans+1
hb(b,c);hb(b+n,c+n);hb(b+n*2,c+n*2);//如果真是同類,那麼我的同類就是你的同類,我的獵物就是你的獵物,我的天敵也是你的天敵
} else
if(a==2)//當你可能是我的獵物時:
//如果我們是同類或你是我的天敵,那麼這句話就是假的
hb(b,c+n*2);hb(b+n,c);hb(b+n*2,c+n);//如果你真是我的獵物,那麼我的同類就是你的天敵,我的獵物就是你的同類,我的天敵就是你的獵物
} }printf("%d",ans);//輸出謊話數
return
0;}
洛谷 P2024 食物鏈
題目描述 動物王國中有三類動物 a,b,c,這三類動物的食物鏈構成了有趣的環形。a 吃 b,b 吃 c,c 吃 a。現有 n 個動物,以 1 n 編號。每個動物都是 a,b,c 中的一種,但是我們並不知道 它到底是哪一種。有人用兩種說法對這 n 個動物所構成的食物鏈關係進行描述 第一種說法是 1 x...
洛谷 P2024 食物鏈
題目描述 動物王國中有三類動物 a,b,c,這三類動物的食物鏈構成了有趣的環形。a 吃 b,b 吃 c,c 吃 a。現有 n 個動物,以 1 n 編號。每個動物都是 a,b,c 中的一種,但是我們並不知道 它到底是哪一種。有人用兩種說法對這 n 個動物所構成的食物鏈關係進行描述 第一種說法是 1 x...
洛谷P2024 食物鏈
動物王國中有三類動物 a,b,c,這三類動物的食物鏈構成了有趣的環形。a 吃 b,b 吃 c,c 吃 a。現有 n 個動物,以 1 n 編號。每個動物都是 a,b,c 中的一種,但是我們並不知道 它到底是哪一種。有人用兩種說法對這 n 個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示...