WC 2018 州區劃分 題解

2021-10-25 14:14:30 字數 2849 閱讀 2226

題目傳送門

題目大意:有一張 n

nn 個點 m

mm 條邊的圖,你要將所有點劃分為若干組,每組內的點不能形成尤拉迴路,第 i

ii 組的貢獻為:這組內 w

ww 之和佔前 i

ii 組的 w

ww 之和的百分比的 p

pp 次冪,乙個劃分方案的貢獻問所有組的貢獻之積,求所有劃分方案的貢獻和。

判斷尤拉迴路只需要看度數是否都為偶數即可,這個相信大家都會。

然後 p

pp 是沒什麼用的。

不難得出dp方程:fsf_

fs​ 表示 s

ss 集合內的點的所有劃分方案下的貢獻和,則有 fs=

∑s′∈

sfs′

gs⊕s

′∑i∈

sw

if_s=\dfrac f_g_} w_i}

fs​=∑i

∈s​w

i​∑s

′∈s​

fs′​

gs⊕s

′​​,其中 gs=

∑i∈s

wi

g_s=\sum_w_i

gs​=∑i

∈s​w

i​,如果 s

ss 這種劃分存在尤拉迴路,那麼 gs=

0g_s=0

gs​=0。

然後一開始的我就比較菜,不太懂如何處理 f

sf_s

fs​ 在轉移完後要除以 ∑i∈

sw

i\sum_w_i

∑i∈s​w

i​,結果最後類似分治fft寫了個分治子集卷積,千辛萬苦調出來,一測極限資料,跑得比 3

n3^n

3n的dp還慢……當然真在考場上是不敢打這種操作的,也就平時皮一下。

正解的姿勢就很優秀,直接將 f

ff 與 g

gg 跑子集卷積,設 fi,

sf_

fi,s

​ 表示子集卷積中存 f

ff 的陣列,注意到 f

if_i

fi​ 都是由比 i

ii 小的 f

jf_j

fj​ 貢獻來的,也就是說,當比他小的 f

jf_j

fj​ 處理完了,它逆變換一下之後得出來的值就是正確的了,此時你將其逆變換後令 fi,

sf_

fi,s

​ 除以 ∑p∈

sw

p\sum_w_p

∑p∈s​w

p​,然後正變換回去再貢獻 i

i<

k 的 f

kf_k

fk​ 即可,這樣複雜度就是 o(n

22n)

o(n^22^n)

o(n22n

) 的了。

**如下:

#include

#include

#include

#include

using

namespace std;

#define mod 998244353

#define bin(x) (1<<(x))

int n,m,p,w[30]

;struct edgee[

10010];

int first[30]

,len=0;

void

buildroad

(int x,

int y)

;first[x]

=len;

}void

add(

int&x,

int y)

void

dec(

int&x,

int y)

intksm

(int x,

int y)

namespace b

void

link

(int x,

int y)

void

fmt_or

(int

*f,int lg,

int type=0)

}int ws[

1<<21]

,invws[

1<<21]

,f[22][

1<<21]

,g[22][

1<<21]

;void

main()

for(

int s=

1;s<(1

<;s++

)for

(int i=

0;i(s>>i&1)

}if(sz>

1)v=

true;if

(!v)ws[s]=0

;}for(

int i=

0;i<(1

<;i++

) g[cnt[i]

][i]

=ws[i]

,f[0

][i]=1

;for

(int i=

1;i<=n;i++

)fmt_or

(g[i]

,n);

for(

int i=

1;i<=n;i++

)printf

("%d"

,f[n][(

1<])

;return;}

}int

main()

for(

int i=

0;i)scanf

("%d"

,&w[i]);

b::main()

;return0;

}

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 為這個狀態對應的城市的人口之和...