codeforces Round#332Div2 題解
阿新 • • 發佈:2018-10-02
roo 復制 包含 狀壓 != 計數問題 前綴和 判斷 如果 的
然後我們可以在
codeforces Round#332Div2
AB
簽到題
比較激動,紛紛WA了一發。
C
- 把數組
h
復制給a
,然後對a
數組排序。 - 對
h
和a
數組,求前綴和,有多少個位置滿足\(\sum a[i] = \sum h[i]\), 就最多能分成多少塊。
D
- 我們枚舉更短的那條邊,這樣的邊不會太多。
- 然後求,更長的那條邊。
E
符合xxx限定條件的圖的計數問題。數據範圍很狀壓。
我們用dp[mask][root]
表示,集合mask
裏的點,以root
為根,不違背限定條件的方案數。
接下來考慮dp[mask][root]
是怎樣轉移而來的。
設x
為集合mask - {root}
中最小的元素。
枚舉包含元素x
mask
的子集newmask
作為root
的一棵子樹。然後我們可以在
newmask
中選擇一個根newroot
.
接下來我們判斷,枚舉的newmask
,newroot
是否合法。
對於一條已知的邊。
u!=root,v!=root
,如果u
在newmask
中,v
不在newmask
中,則不合法。- 與
root
相連的,且在newmask
中的點,至多只有一個【root
最多只能和newmask
中的一個點相連】。如果恰有一個,那麽這個點就是newroot
, 如果沒有,那我們就枚舉newroot
。
對於一組已知的LCAlca(a,b)=c
- 如果
c=root
,a,b
都在newmask
中,不合法。 - 如果
c
在newmask
a,b
有一個不在newmask
中就GG了。因為這樣的話,c
在newmask
對應的子樹裏面,a,b
至少有一個在newmask
子樹外面。
對於合法的newroot
,newmask
\(dp[mask][root] = \sum dp[newmask][newroot]*dp[mask-newmask][root]\)
codeforces Round#332Div2 題解