有三類動物\(a,b,c\),這三類動物的食物鏈構成環形。\(a\)吃\(b\), \(b\)吃\(c\),\(c\)吃\(a\)。現有\(n\)個動物,以\(1\sim n\)編號。
每個動物都是\(a,b,c\)中的一種,但是我們並不知道它到底是哪一種。有人用兩種說法對這n個動物所構成的食物鏈關係進行描述:
當一句話滿足下列三條之一時,這句話就是假話,否則就是真話。
根據給定的\(n\)和\(k\)句話,輸出假話的總數。
\(\begin1 \leq n \leq 50000 \\ 0 \leq k \leq 100000\end\)
將每個動物拆成\(3\)個點,同類\(x_\),捕食\(x_\)和天敵\(x_\),\(x\)和\(y\)是同類即\(x\)和\(y\)的捕食一樣,天敵一樣,同類一樣
合併\(x_\)和\(y_\),\(x_\)和\(y_\),\(x_\)和\(y_\)
若\(x\)吃\(y\)則,\(x\)的天敵是\(y\)的捕食,\(x\)捕食\(y\)的同類,\(x\)同類是\(y\)天敵
合併\(x_\)和\(y_\),合併\(x_\)和\(y_\),合併\(x_\)和\(y_\)
判斷矛盾:
若\(x\)和\(y\)是同類
\(x\)吃\(y\):
可以不進行離散化,離散化的話因為表示關係的可能大於\(n\)需要離散化到更大的
#includeusing namespace std;
#define rep(i,a,n) for(int i=a;i=a;i--)
const int n=5e4+10;
int fa[n*3];
int n,m,cnt;
unordered_maprec;
int find(int x)
void merge(int a,int b)
int disperse(int x)
int main()
if(op==2 && x==y)
x=disperse(x),y=disperse(y);
int xeat=disperse(x+n),xenemy=disperse(x+2*n);
int yeat=disperse(y+n),yenemy=disperse(y+2*n);
if(op==1) // 同類
merge(x,y);merge(xeat,yeat);merge(xenemy,yenemy);
}else
merge(x,yenemy);merge(y,xeat);merge(xenemy,yeat);}}
cout<}
食物鏈 並查集擴充套件域
食物鏈 2001年noi全國競賽 時間限制 3 s 空間限制 64000 kb 題目描述 description 動物王國中有三類動物 a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。...
NOI2001 食物鏈 擴充套件域並查集
動物王國中有三類動物 a,b,c,這三類動物的食物鏈構成了有趣的環形。a 吃 b,b 吃 c,c 吃 a。現有 n 個動物,以 1 n 編號。每個動物都是 a,b,c 中的一種,但是我們並不知道 它到底是哪一種。有人用兩種說法對這 n 個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示...
球隊「食物鏈」
某國的足球聯賽中有n支參賽球隊,編號從1至n。聯賽採用主客場雙迴圈賽制,參賽球隊兩兩之間在雙方主場各賽一場。聯賽戰罷,結果已經塵埃落定。此時,聯賽主席突發奇想,希望從中找出一條包含所有球隊的 食物鏈 來說明聯賽的精彩程度。食物鏈 為乙個1至nnn的排列,滿足 球隊t1戰勝過球隊t2t 2t 2 球隊...