1. 程式人生 > >codeforces Round#332Div2 題解

codeforces Round#332Div2 題解

roo 復制 包含 狀壓 != 計數問題 前綴和 判斷 如果

codeforces Round#332Div2

AB

簽到題

比較激動,紛紛WA了一發。

C

  • 把數組h復制給a,然後對a數組排序。
  • ha數組,求前綴和,有多少個位置滿足\(\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,如果unewmask中,v不在newmask中,則不合法。
  • root相連的,且在newmask中的點,至多只有一個【root最多只能和newmask中的一個點相連】。如果恰有一個,那麽這個點就是newroot, 如果沒有,那我們就枚舉newroot

對於一組已知的LCAlca(a,b)=c

  • 如果c=root,a,b都在newmask中,不合法。
  • 如果cnewmask
    中,a,b有一個不在newmask中就GG了。因為這樣的話,cnewmask對應的子樹裏面,a,b至少有一個在newmask子樹外面。

對於合法的newroot,newmask

\(dp[mask][root] = \sum dp[newmask][newroot]*dp[mask-newmask][root]\)

codeforces Round#332Div2 題解