1. 程式人生 > >Codeforces 補題記錄

Codeforces 補題記錄

n-1 col 內部 就是 所有 problem 成了 round 留下

首先總結一下前段時間遇到過的一些有意思的題。

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 補題記錄