1. 程式人生 > 其它 >Good Bye 2021: 2022 is NEAR A~E 題解

Good Bye 2021: 2022 is NEAR A~E 題解

Good Bye 2021: 2022 is NEAR A~E 題解

比賽連結

A

如果一個數不是 \(0\),那麼它就有 \(2\) 的貢獻,不然就只能是 \(0\)

Code:https://pastebin.ubuntu.com/p/jFm27VMT8h/

B

選擇的字首肯定是不降的。

如果能選的最長字首都是一個字母,那麼顯然重複一次即可。否則就選擇一個極長的字首。

Code:https://pastebin.ubuntu.com/p/QJ37K352Sj/

C

顯然條件等價於數列要是等差數列。

列舉固定的兩項不動然後暴力判一遍就行了。

Code:https://pastebin.ubuntu.com/p/xTmcpqGw6W/

D

條件等價於將每個數減去 \(x\) 之後,沒有一段連續的 \(\ge 2\)

個數的區間和 \(<0\)

計算出將每個數減去 \(x\) 後的字首和,貪心地能選就選,容易證明這樣是對的。

或者為了穩妥可以暴力跑 DP。

Code:https://pastebin.ubuntu.com/p/5ttsvbXMMY/

E

考慮 fix \(s\) 的一段長度為 \(len\) 的字首與 \(t\) 相同,然後讓 \(s_{len+1}<t_{len+1}\) 並算入答案。

每次將 \(len\) 加一,那麼就是把 \(len+1\) 後第一個與 \(t_{len+1}\) 相同的字元換到 \(s_{len+1}\),這個可以用一個 vector 找到。

注意到我們還需要將一個區間向後移動一位。考慮記一個樹狀陣列 \(\{tr_i\}\)

表示原本 \(s_i\) 上的字元現在的位置與當前 \(len\) 的差。

那麼區間後移的操作在樹狀陣列上就體現為一個字尾 \(-1\),差分之後變成單點修改、區間查詢。有了這個樹狀陣列就可以很好的維護了。

Code:https://pastebin.ubuntu.com/p/SFm62ggbKP/