題目:
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 元。所謂一段時間內的總收入,就是這段時...