Codeforces 補題記錄
首先總結一下前段時間遇到過的一些有意思的題。
Round #474 (Div. 1 + Div. 2, combined) Problem G
其實關鍵就是n這個數在排列中的位置。
這樣對於一個排列,設$f[pos] = p$, 那麽從位置$1$到位置$pos$最大值被刷新了$a$次,從位置$n$到位置$pos$最大值被刷新了$b$次。
去掉$n$之後,剩下$n-1$個數被分成了兩個部分。
假設把這$n-1$個數分成$a+b-2$個組,分配給左邊$a-1$個組,給右邊$b-1$個組。
對於$n$左邊的數,每個組內部一定滿足第一個數最大,對於$n$右邊的數,每個組內部一定滿足最後一個數最大。
這樣就滿足了題意。
這樣其實就是一個環排列計數,具體一點,就是求$n-1$個數劃分成$a+b-2$個集合,每個集合內部再按特定順序圍圈分組的方法的數目。
這剛好是第一類斯特林數。那麽答案為$C(a + b - 2, a - 1) * S(n - 1, a + b - 2)$。
Round #480 Div2 Problem E
去掉$k$個點,相當於保留$n - k$個點,需要滿足剩下的$n - k$個點連通。轉化為保留$m$個點,求留下的點的權值和最大。
以$n$為根(必選),從$n - 1$開始往前選,假設當前已經選了$x$個點,如果當前點往上爬,爬到第一個已經被選的點時的移動距離大於$m - x$,
那麽不能選這個點(因為選了一個點就必須選他的祖先),否則就選入這個點,然後選擇所有的他的祖先中未被選擇的點
(也是一步步往上爬,到發現了被選中的點為止),到選了$m$個點為止結束即可。
Round #482 (Div. 2) Problem D
預處理出所有數的因子。加入一個數的時候在以他的所有倍數為編號的字典樹中插入這個數,(字典樹編號最大為$100$)
查詢的時候如果$k$小等於$100$,那麽在字典樹裏查詢,否則直接暴力找。
Codeforces 補題記錄