luogu P4221 WC2018 州區劃分

2021-09-27 12:53:10 字數 3792 閱讀 9293

luogu p4221 [wc2018]州區劃分

題意比較複雜,大致就是說

給出n

nn個點,m

mm條邊

把n

nn個點分成若干組,使每組裡面不存在尤拉迴路

每種方案的滿意度為所有州的滿意度的乘積

求所有方案的滿意度的和

大概就是這樣

首先要知道怎麼判斷尤拉迴路

這題當一組的所有點的度數都為偶數時存在尤拉迴路(因為要起點和終點相同)

如果圖不聯通也是合法的

然後就可以用子集dp解決 15』 的問題

code:

#include

#define mod 998244353

#define ll long long

using

namespace std;

struct edgee[

10005];

int p[25]

, eid;

void

init()

void

insert

(int u,

int v)

ll qpow

(ll x,

int y)

int fa[25]

;int

get(

int x)

void

merge

(int x ,

int y)

int n, m, q, a[25]

[25], w[25]

, he[

1<<23]

, ok[

1<<23]

, du[25]

, u[

1000005

], v[

1000005];

ll f[(1

<<23)

];intmain()

for(

int i =

1; i <= m; i ++)}

if(bb !=

1) ok[s]=1

;int cnt =0;

for(

int i =

1; i <= n; i ++

) cnt +

=(du[i]&1

);if(cnt) ok[s]=1

;//處理出當前點是否合法

} f[0]

=1;for

(int s =

0; s <(1

<< n)

; s ++)}

printf

("%lld"

, f[(1

<< n)-1

]);return0;

}

恭喜你獲得了15』的好成績!!!!

看看子集dp的式子

可以轉換為

a ns

[s]=

∑f[s

0]∗g

[s1]

且滿足s

0∩s1

=∅,s

0∪s1

=s

ans[s] = \sum f[s0] * g[s1] 且 滿足s0 ∩ s1 = ∅, s0 ∪s1=s

ans[s]

=∑f[

s0]∗

g[s1

]且滿足

s0∩s

1=∅,

s0∪s

1=s

如果不考慮交集為空的情況那很明顯可以fwt

考慮多加一位表示集合中1的個數

a ns

[i][

s]=∑

f[j]

[s0]

∗g[i

−j][

s1]且

滿足s0

∪s1=

sans[i][s] = \sum f[j][s0] * g[i - j][s1] 且滿足 s0∪s1 = s

ans[i]

[s]=

∑f[j

][s0

]∗g[

i−j]

[s1]

且滿足s

0∪s1

=s然後驚喜的發現就相當於是把f[j

]f[j]

f[j]

和g [i

−j

]g[i-j]

g[i−j]

卷在一起

然後就可以fwt 了

非常容易理解

code:

#include

#define mod 998244353

#define ll long long

using

namespace std;

void

fwt(ll *a,

int len,

int opt)

ll qpow

(ll x,

int y)

int fa[25]

;int

get(

int x)

void

merge

(int x ,

int y)

int n, m, q, a[25]

[25], w[25]

, he[

1<<23]

, ok[

1<<23]

, du[25]

, u[

1000005

], v[

1000005

], bitcount[

1<<23]

;ll f[23]

[1<<22]

, g[23]

[1<<22]

, inv[

1<<22]

;int

main()

bitcount[s]

= bb;

//bitcount(s)表示s中1的個數

for(

int i =

1; i <= m; i ++)}

if(bb !=

1) ok[s]=1

;int cnt =0;

for(

int i =

1; i <= n; i ++

) cnt +

=(du[i]&1

);if(cnt) ok[s]=1

;if(ok[s]

) g[bitcount[s]

][s]

=qpow

(he[s]

, q)

;//g是用來轉移的,表示s劃分成一組的滿意度(分子)

inv[s]

=qpow

(qpow

(he[s]

, mod -2)

, q)

;//分母 —— 逆元

}for

(int i =

0; i <= n; i ++

)fwt

(g[i],1

<< n,1)

; f[0]

[0]=

1;fwt(f[0]

,1<< n,1)

;//fwt

for(

int i =

1; i <= n; i ++

)printf

("%lld"

, f[n]

[len -1]

);return0;

}

這題在wc算是簡單題了吧

好像有點小卡常qwq

WC2018 州區劃分

點此看題 設d p s dp s dp s 為選出來的點狀壓為s ss,所得到的滿意度總和,轉移 d p s 1 f s i s dp i g s i dp s frac sum dp i times g s i dp s f s 1 i s d p i g s i 其中f s f s f s 是w...

WC 2018 州區劃分

給乙個無向圖 g v,e 滿足 v 21 對於某一種將 g v,e 劃分為k個的有序集合方案,若每乙個子集 g i v i,e i e i 都不存在尤拉迴路,則會對答案貢獻為 其中,x 為集合元素,w x 為元素 x 的權值。題解 被題意坑成cu 我還是太菜了 其實很顯然我們會得到乙個 dp 設 f...

WC2018 州區劃分

題目 就當那個判斷乙個州不合法的條件是存在尤拉迴路吧 一張無向圖存在尤拉迴路的條件是 圖連通不存在度數為奇數的點 於是我們列舉每乙個子集,可以在 o 2 nn 2 的時間內判斷乙個集合是否能獨立成為乙個州 之後我們設 dp i 表示選取狀態為 i 的時候的答案,s i 為這個狀態對應的城市的人口之和...