WC2018 州區劃分

2021-10-07 02:59:05 字數 2302 閱讀 5209

點此看題

設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

ww總和的p

pp次方,g[s

]g[s]

g[s]

是w

ww總和的p

pp次方 乘上 這個狀態是否合法。

顯然這個柿子可以用快速子集卷積,然鵝我t

tt了,不說了,盡量不要看我大常數的** 。

upd 2020-6-12:補充一點卡常的知識,如果這樣寫的話,就掛了:

for

(int i=

1;i<=n;i++

)

如果這樣寫的話,就快很多

for

(int i=

1;i<=n;i++

)

發現了嗎,其實是j

jj要在內層列舉,這樣呼叫空間會快很多,現在我過了,開心。

#include

const

int n =

405;

const

int m =

1<<21;

const

int mod =

998244353

;int

read()

int n,m,p,lim,a[n]

,b[n]

,w[n]

,f[m]

,inv[m]

;int deg[n]

,fa[n]

,bit[m]

,g[22

][m]

,dp[22]

[m];

intchk

(int s,

int i)

intqkpow

(int a,

int b)

return r;

}int

find

(int x)

void

fwt(

int*a,

int n,

int op)

}signed

main()

}for

(int j=

1;j<=m;j++)if

(chk

(i,a[j])&&

chk(i,b[j]))

for(

int j=

1;j<=n;j++

) z+

=(deg[j]&1

);if(z || y!=

1) g[x]

[i]=f[i]

; g[x]

[i]=

qkpow

(g[x]

[i],p)

; f[i]

=qkpow

(inv[f[i]

],p)

; bit[i]

=x;}

for(

int i=

0;i<=n;i++

)fwt

(g[i]

,lim,1)

; dp[0]

[0]=

1;fwt(dp[0]

,lim,1)

;int ans=0;

for(

int i=

1;i<=n;i++

)fwt

(dp[i]

,lim,-1

);for(

int j=

0;j) dp[i]

[j]=bit[j]

==i?

1ll*dp[i]

[j]*f[j]

%mod:0;

if(i!=n)

fwt(dp[i]

,lim,1)

;}printf

("%d\n"

,dp[n]

[lim-1]

);}

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

WC2018 州區劃分

題面給一張帶點權的無向圖 要求對其劃分為聯通且不存在尤拉迴路的多個子圖 定義乙個子圖的貢獻是 第 i 個子圖的點權和佔前 i 個子圖的點權和的比例的 p 次冪 定義乙個劃分的貢獻是 該劃分下所有子圖的貢獻的乘積 求所有劃分的貢獻之和 設 f s 為選取點集為 s 時所有劃分的貢獻和 有 f s fr...