bzoj 3444 最後的晚餐 並查集

2021-08-29 14:08:49 字數 1132 閱讀 4655

題目:

n個人排成一排,有m個條件,第i個條件要求ai和bi相鄰,求方案數。

【資料範圍】

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

演算法:並查集+組合數

難度:noip

題解:由於要求排成一排,因此如果關係出現了環則無解;而乙個位置最多挨著兩個,所以deg[x]>3也無解。

那麼剩下的就是若干條鏈和單個點。每一條鏈的排列方式有兩種,而單個點的排列方式只有一種。

方案數=

時間複雜度:

**如下:

注意重邊的問題(a->b,b->a)。由於保證了ai互不相同,因此可以對每乙個ai存乙個bi,

每次只有在bi的暗戀物件不為ai時才更新。

#include #define ll long long 

#define n 500005

using namespace std;

const ll mod=989381;

int fa[n];

int findf(int x)

int w[n],deg[n];

int cnt[n];

/*ll powermod(int x,int y)

y=y/2;

x=(x*x)%mod;

} return ret%mod;

}*/int main()

for(int i = 1;i <= m;i++)

fa[t1]=t2;

deg[a]++,deg[w[a]]++;

} for(int i = 1;i <= n;i++) cnt[findf(i)]++;

ll ans=1;

int ct=0;

int cn=0;

for(int i = 1;i <= n;i++) }

for(int i = 1;i <= cn+ct;i++)

ll anss=1;

for(int i = 1;i <= cn;i++)

ans=((ans%mod)*(anss%mod))%mod;

printf("%lld\n",ans%mod);

return 0 ;

}

bzoj3444 並查集 最後的晚餐

description 問題背景 高三的學長們就要離開學校,各奔東西了。某班n人在舉行最後的離別晚餐時,飯店老闆覺得十分糾結。因為有m名學生偷偷找他,要求和自己暗戀的同學坐在一起。問題描述 飯店給這些同學提供了乙個很長的桌子,除了兩頭的同學,每乙個同學都與兩個同學相鄰 即坐成一排 給出所有資訊,滿足...

BZOJ 3444 最後的晚餐

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

bzoj1202 並查集 狡猾的商人

description 刁奼接到乙個任務,為稅務部門調查一位商人的賬本,看看賬本是不是偽造的。賬本上記錄了n個月以來的收入情況,其中第i 個月的收入額為ai i 1,2,3 n 1,n 當 ai大於0時表示這個月盈利ai 元,當 ai小於0時表示這個月虧損ai 元。所謂一段時間內的總收入,就是這段時...