1. 程式人生 > 其它 >Codeforces Global Round 7

Codeforces Global Round 7

Codeforces Global Round 7

E

答案顯然單調不增,那麼初始答案為 \(res=n\),不斷判定並減小答案直到可行。判斷方法:把有刪除操作的地方記上 \(-1\),把 \(p_i\ge n\) 的地方記上 \(+1\),若最大的字尾和 \(>0\),則 \(res\) 可行。這些操作都可以用線段樹完成

F1

\(s\) 折半,每一邊有 \(2^{\frac{n}{2}}\) 種情況,每種用樸素 \(dp\) \(2^nn\)暴力處理,然後合併,總複雜度 \(O(2^{1.5n}n)\)

F2

大致說一下

進行容斥,設 \(res_i\)\(01\)\(i\)

的答案,先計算 \(S_i=\sum\limits_{j|i=j}res_j\),然後再推出 \(res\)\(S_i\) 的意思就是 \(i\)\(1\) 的地方依舊必須是認識的,但為 \(0\) 的地方無所謂,這樣轉化使得限制條件變少了。然後發現,如果 \(A\)\(B\) 的劃分情況相同(長度為 \(1,2,3\dots\) 的連續 \(1\) 段數量均相同),則 \(S_A=S_B\)。那麼只要計算 \(P(n)\) 種情況即可。設劃分成了 \(m\) 段,長度為 \(l_1,l_2,l_3\dots\),也就是要在原圖中找到 \(m\) 條不相交的長度為 \(l_1+1,l_2+1\dots\)
的鏈(長度為 \(L\) 的連線了 \(L+1\) 個人)。“不相交”可以轉化為總共有 \(n\) 個人。先求出 \(f_{i,j}\) 表示走到 \(i\),走過的集合為 \(j\) 的方案數,由此可以得出 \(g_{i,j}\) 表示走了 \(i\) 步,走過的集合為 \(j\) 的方案數,然後對 \(g_{i,*}\) 來一下 \(fwt\),計算 \(t_j=\prod g_{l_i+1,j}\),把 \(t\) 變換回來,\(t_{2^n-1}\) 就是答案。

但是常數大了就過不了,很多題解的程式碼也過不了,應該是 \(CF\) 的評測機變慢了。

G