擴充套件域 迴圈關係 食物鏈

2022-05-04 01:54:09 字數 1312 閱讀 8897

有三類動物\(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 球隊...