Codechef March Challenge 2018 DIV 1 題解

Mix the Colors

顯然每次選最大的數加到一個數上是最優的,那麼答案就是 n
代碼

Chef and Easy Problem

預處理出每個二進制位的前綴和,詢問時枚舉每一位貪心選就好了。
代碼

Minions and Voting

枚舉每個點,二分出他會投給誰,正反各做一遍就好了。
代碼

Chef and Gcd Queries

ans=i=LRt|ai,t|Gμ(t)=t|Gμ(t)i=LR[t|ai]

對於每個值開個動態線段樹,複雜度 O(nmaxlogn)
代碼

Pishty and Triangles

一種比較顯然的做法是從大到小枚舉最大的 3 個數作爲 3 條邊,判斷是否合法,如果合法就輸出,否則去掉最大的數繼續找。發現最多隻會判斷 O(log32max) 次,用線段樹維護前 50 大就好了。
代碼

Chef and Interval Painting

打表,然後放到oeis上找一下可以得到:

ans=i=0k1(k1i)sn+1,ni

其中 sn+1,ni 表示第一類斯特林數。
可以用分治FFT預處理出第一類斯特林數。
代碼

Chef Cuts Tree

一個連通塊 S 的權值可以表示爲 i,j[iS,jS] ,即連通的點對數。
顯然一對點連通的概率只取決於它們的距離。
toti 表示樹中長度爲 i 的路徑條數。假設我們已經求出了 tot 數組,那麼刪去 k 條邊的答案就是

ansk=i=0n1ktoti(n1ik)(n1k)

(n1k)k!ansk=i=0n1ktoti(n1i)!(n1ik)!

ck=i=0ktoti(n1i)!(ki)! ,那麼 (n1k)k!ansk=cn1k
ai=toti(n1i)!,bi=1i! ,於是 ck=i=0kaibki ,是個卷積的形式,可以FFT求出。
現在的問題就是如何求出 tot 數組。
考慮點分治,發現合併的時候是一個卷積的形式,用FFT優化就好啦。
由於模數不是NTT模數,要用三模數NTT。
還要卡卡常。。。
代碼
發佈了288 篇原創文章 · 獲贊 104 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章