WC2018 州區劃分 FWT DP FST

2022-05-08 03:18:09 字數 1588 閱讀 6192

[wc2018]州區劃分

我們設f[s]為選中點的狀態集合為s時的答案(其中s為二進位制狀態),設t為s集合最後一次劃分出的集合且要保證集合t合法,那麼可以得到轉移方程(其中sum代表集合中點權和):

$f[s]=\sum\limits_^f[s-t]*(\frac)^p$

這個子集dp直接列舉子集的時間複雜度是o(3^n),顯然過不去,但我們發現這個dp相當於列舉兩個集合i,j滿足$i\cap j= \varnothing  ,i\cup j=s$

這個如果只有子集並的條件可以用直接用fwt來優化,但還要求交集為空的條件就不能一維dp優化了。

我們假設乙個點能被劃分到多個部分中,那麼dp狀態就變成了二維:f[i][s]表示選取點集合為s,每部分包含的點數和為i的答案。

設g[i][s]表示集合為s,選取點數為i時sum[s]的p次方,如果s不合法或|s|!=i,那麼g[i][s]就為0。(其中|s|表示s集合中的點數即二進位制狀態中1的個數)

那麼轉移方程就變成了:

$f[i][s]=\sum\limits_^\sum\limits_^\frac$

這樣我們對f陣列和g陣列進行fwt轉化成子集和表示式然後dp,每次乘上sum[s]^p的逆元即可,最後的答案為f[|u|][u],其中u為全集。時間複雜度為o(2^n*n^2)。

再來說一下如何判尤拉迴路:

這個很簡單只要乙個圖聯通且每個點的度數都是偶數,那麼這個圖就是尤拉迴路,對於每個二進位制狀態預處理判斷即可,用bfs或dfs或並查集判斷都可以。預處理時間複雜度同樣是o(2^n*n^2)。

#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

int f[22][2100000];

int g[22][2100000];

int n,m,p;

const int mod=998244353;

int x[10000];

int y[10000];

int s[30];

int fa[30];

int v[22];

int w[2100000];

int cnt;

int mask;

int lg[2100000];

int inv[2100000];

inline int find(int x)

return fa[x]=find(fa[x]);

}inline void fwt(int *f,int opt)

return res;

}int main()

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

mask=(1<1)

}f[0][0]=1;

fwt(f[0],1);

for(int i=0;i<=n;i++)

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

}fwt(f[i],-1);

for(int k=0;k<=mask;k++)

if(i}

printf("%d",f[n][mask]);

}

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