1. 程式人生 > 其它 >AtCoder Beginner Contest 217 題解

AtCoder Beginner Contest 217 題解

降智了/ll

比賽地址

A~C

略。

D

用一個 set 維護砍掉了哪些點。

查詢時直接 lower_bound 即可。

E

用兩個資料結構維護。這裡可以用 priority_queue 和 queue(當然 multiset 和 vector 之類的也行)。

操作 1:加入 queue。

操作 2:若 priority_queue 不為空,那麼輸出隊頭並彈出;否則輸出 queue 隊頭並彈出;

操作 3:將 queue 中所有元素加入 priority_queue 中,並將 queue 清空。

F

賽時 naive 了,被一種特殊情況限制住了思路 \(\texttt{/kk}\)

\(dp_{i,j}\)

表示將區間 \([i,j]\) 覆蓋完的方案數。

轉移列舉一個點 \(k\),讓 \(k\)\(j\) 配對,那麼就把區間分成了 \([i,k-1]\)\([k+1,j-1]\) 兩段,方案數就是 \(dp_{i,k-1}\times dp_{k+1,j-1}\times\binom{\frac{j-i+1}{2}}{\frac{k-i}{2}}\)。組合數可以這樣理解:區間 \([i,j]\) 總共需要進行 \(\frac{j-i+1}{2}\) 次配對,其中有 \(\frac{k-i}{2}\) 次是在前面一段,之所以不需要再乘階乘是因為兩段內部的順序已經計算過了。

答案即為 \(dp_{1,2n}\)

G

\(dp_{i,j}\) 表示 \(1\sim i\) 分成 \(j\) 段的方案數。

轉移:\(dp_{i,j}=dp_{i-1,j-1}+dp_{i-1,j}\times(j-\lfloor\frac{i-1}{m}\rfloor)\)

前面的是 \(i\) 單獨分一段的貢獻,後面是 \(i\) 加入前面的一組的貢獻。因為前 \(i-1\) 個數中和 \(i\)\(\mod m\) 下同餘的有 \(\lfloor\frac{i-1}{m}\rfloor\) 個,而它們都不在同一個組,所以係數就為 \(j-\lfloor\frac{i-1}{m}\rfloor\)

H

咕咕咕