AtCoder Beginner Contest 217 題解
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}\)
轉移列舉一個點 \(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
咕咕咕