Codeforces 專區

Alexande發表於2024-03-07

Codeforces Round #932(Div.2)

怎麼只會 A 啊。

\(\text{Problem A}\)

題目大意

對於一個字串 \(s\),可以進行 \(n\) 次操作(\(n\) 為偶數),每次操作有兩種形式:

  1. \(t\)\(s\) 的反串,\(s = s + t\)
  2. \(t\)\(s\) 的反串,\(s = t\)

要求操作完後 \(s\) 的字典序最小,並輸出 \(s\)

\(1 \le n \le 10^9, 1 \le |s| \le 100\)

題目思路

考慮到一個字串越短越好,所以我們儘量是用第二種形式的,發現如果 \(s\)\(s\) 的反串的字典序要小,那麼進行 \(n\) 次操作 \(2\) 後必然還是 \(s\),顯然是字典序最小的。

但是如果 \(s\)\(s\) 的反串的字典序要大,那麼顯然最優的做法是第一次進行操作 \(1\),後面進行操作 \(2\),否則到最後就反不到字典序最小的串了,具體來說,答案就是 \(s\) 的反串拼上 \(s\)

\(\text{Problem B}\)

題目大意

給你一個長度為 \(n\) 的序列 \(a\),要求分成若干段(段數不為 \(1\)),使得每段的 \(\text{mex}\) 相同。

\(1 \le n \le 10^5, 0 \le a \le n\)

題目思路

對於區間仔細分析後發現是可以合併的,具體來說:

  • 對於 \(\text{mex}(i, k) = \text{mex}(k + 1, j) = x\),可以得出 \(\text{mex}(i, j) = x\)

簡單證明一下就是考慮 \([i, k]\) 中沒有出現 \(x\)\([k + 1, j]\) 中也沒有出現 \(x\),那麼 \([i, j]\) 中也沒有出現 \(x\),因此得 \(\text{mex}(i, j) = x\)

那麼問題就變得很簡單了,因為劃分 \(k\) 段合法是劃分 \(2\) 段合法的充分條件,所以只要能劃分出 \(2\) 段就可以了,預處理字首/字尾 \(\text{mex}\) 就好了。

\(\text{Problem C}\)

題目大意

給你 \(n\) 個二元組 \((a_i, b_i)\),要求從中選出 \(k\) 個二元組並任意打亂,設其下標集合 \(S = \{p_1, p_2, ..., p_k\}\),要求在 \(\sum\limits_{i = 1}^k a_i + \sum\limits_{i = 2}^k |b_{p_i} - b_{p_{i - 1}}| \le l\) 的情況下將 \(k\) 最大化。

\(1 \le n \le 2000\)

題目思路

我們考慮一個事情,如果選出了 \(k\) 個且下標集合 \(S = \{p_1, p_2, ..., p_k\}\),那麼當 \(p_1 \le p_2 \le ... \le p_k\) 的時候是這個集合所有順序排列中值最小的,此時的代價是 \(\sum\limits_{i = 1}^k a_i + b_{p_k} - b_{p_1}\)

因此我們考慮列舉這個集合中的下標最小值和下標最大值,在這中間,很明顯元素是按照 \(a\) 的大小從小往大放,直到放到不能放為止,這可以用堆來做,發現是三方的,然後我們在列舉最大值的時候順便加進去計算,時間複雜度就是 \(O(n^2 \log_2 n)\)

\(\text{Problem D}\)

題目大意

給定一個大小為 \(n\) 的集合 \(S\),其中元素大小 \(\le c\),問滿足以下條件的數對 \((x, y)\) 的個數有多少對:

  1. \(x, y \in \mathbb{Z}, 0 \le x \le y \le c\)
  2. \(x + y \notin S, y - x \notin S\)

\(1 \le n \le 3 \times 10^5, 0 \le c \le 10^9\)

題目思路

首先發現這個一看就很容斥的樣子,考慮容斥完我們要計算什麼:

\[ans = \sum_{i = 0}^c \sum_{j = i}^c 1 - \sum_{i = 0}^c \sum_{j = i}^c [i + j \in S] - \sum_{i = 0}^c \sum_{j = i}^c [j - i \in S] + \sum_{i = 0}^c \sum_{j = i}^c [i + j \in S] \times [j - i \in S] \]

考慮第一項的值,就是 \(\frac{(c + 1)(c + 2)}{2}\)

考慮第二項的值,發現對於每一個 \(i \le \frac{s_i}{2}\),都有一個與之對應的 \(j\) 形成單射,就是 \(\sum\limits_{i = 1}^n \left(\frac{s_i}{2} + 1\right)\)

考慮第三項的值,發現對於每一個 \(s_i \le i \le c\),都有一個與之對應的 \(j\) 形成單射,就是 \(\sum\limits_{i = 1}^n \left(c - s_i + 1\right)\)

考慮第四項的值,在此之前,我們要想明白一個事情,對於一對 \((i, j)\) 如果產生貢獻,那麼只會對應到一組 \((s_x, s_y)\) 上,換句話說,\(i = \frac{s_x - s_y}{2}, j = \frac{s_x + s_y}{2}\)當且僅當滿足這個條件,才會對答案產生貢獻,不難發現就是奇數的 \(s\) 兩兩組合,偶數的 \(s\) 兩兩組合。

相關文章