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