bzoj3444 並查集 最後的晚餐

2021-08-17 08:52:58 字數 1704 閱讀 8765

description

【問題背景】

高三的學長們就要離開學校,各奔東西了。某班n人在舉行最後的離別晚餐時,飯店老闆覺得十分糾結。因為有m名學生偷偷找他,要求和自己暗戀的同學坐在一起。

【問題描述】

飯店給這些同學提供了乙個很長的桌子,除了兩頭的同學,每乙個同學都與兩個同學相鄰(即坐成一排)。給出所有資訊,滿足所有人的要求,求安排的方案總數(這個數字可能很大,請輸出方案總數取餘989381的值,也可能為0)。

input

輸入有m+1行,第一行有兩個用空格隔開的正整數n、m,如題所示。接下來的m行,每一行有兩個用空格隔開的正整數,第i行為ai和bi,表示ai的暗戀物件為bi,保證ai互不相等。

output

輸出只有一行,這一行只有乙個數字,如題所示。

sample input

4 2

1 24 3

sample output

hint

【資料範圍】

100%的資料,0<n≤500000,1≤ai,bi≤n,0≤m≤n,保證沒有人自戀。

題解

mmp辣雞題毀我ac率

搞個並查集,暗戀的人就放在乙個並查集裡面。表示這個連通塊裡只能按順序坐或者反過來坐一次

最後出來的一堆連通塊,直接上全排列

那麼對付無解的情況

無解就兩種方案,第一種出現環了,第二種出現乙個人暗戀了三個人

然而還有一種情況,比如a喜歡b同時b也喜歡a。那麼這個環就不是無解的!!!

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const ll mod=989381;

int fa[510000];

int findfa(int x)

ll pow_mod(ll a,int b)

return ans;

}int n,m;

int t[510000],tt[510000];

int h[510000];

bool vis[510000];

int main()

int p=findfa(u),q=findfa(v);

if(p!=q)fa[p]=q;

else

t[u]++;t[v]++;

}memset(h,0,sizeof(h));

if(bk==true)printf("0\n");

else

for(int i=1;i<=n;i++)if(h[i]==1)tmp++;

ll ret=pow_mod(2,cnt-tmp);

for(ll i=1;i<=cnt;i++)ret=ret*i%mod;

printf("%lld\n",ret);

}return

0;}

bzoj 3444 最後的晚餐 並查集

題目 n個人排成一排,有m個條件,第i個條件要求ai和bi相鄰,求方案數。資料範圍 100 的資料,0 n 500000,1 ai,bi n,0 m n,保證沒有人自戀。演算法 並查集 組合數 難度 noip 題解 由於要求排成一排,因此如果關係出現了環則無解 而乙個位置最多挨著兩個,所以deg x...

BZOJ 3444 最後的晚餐

n年沒寫題解於是一時興起就來寫一下 先考慮無解情況 如果有點度數 2那肯定無解 還有 環的情況也會無解 那麼度數為1或2的點 他們肯定是連成一條條的鏈 這些鏈的組合方案只有2種 就是只能翻轉一下 答案就是 度數為0的點數 鏈數 2 鏈數 可能不夠美觀?貌似並不快 include using name...

bzoj 1116(構造 並查集)

time limit 10 sec memory limit 162 mb submit 801 solved 440 submit status discuss byteotia城市有n個 towns m條雙向roads.每條 road 連線 兩個不同的 towns 沒有重複的road.你要把其中...