07-25 題解

Bubble_e發表於2024-07-27

07-25 題解

原題出處(按順序):

CF1556E

CF1234F

P9746

CF1316E

P3651

CF17C

CF1842H

A

轉化: 括號序列

  1. 如果 \(a_i\ > b_i\) , 則有 \(a_i - b_i\) 個左括號

  2. 如果 \(a_i\ < b_i\) , 則有 \(b_i - a_i\) 個右括號

(第一個 +1 的位置一定在第一個 -1 的位置的左側,所以情況一用左括號表示)

問題轉化為判斷括號序列是否匹配:

  1. 左右括號和為 0
  2. 字首和中左括號數量 \(\ge\) 右括號

按照 1/-1 的套路做字首和, 用區間資料結構維護(線段樹/st 表)

如何統計操作步數?

每次只能讓該位置的數 +1 一次, 即每次只能刪除一段連續左/右括號中的一個

所以答案就是字首和陣列的最大值

B

觀察:

  1. 只有 20 個小寫字母
  2. 反轉子串是一種偽操作, 實際上就是選任意兩個不相交的子串拼在一起

列舉以每個位置為起點/終點能貢獻的 unique 子串(一共最多 20n 個)

對於每一個 unique 子串, 考慮找一個最大的不相交串使得拼起來長度最大

設當前子串的字符集為 \(S\) , 實際上就是找 \(max(T)\ (T\ \in C_{\sum}S)\) (T 在 S 的補集中)

因為兩個相交子串的字符集肯定有交集, 所以直接對字符集做高維字首 max 即可

C

鴿

D

我們想要在選 p 的同時保證選的 a 也是最大的

小技巧 : \(a_i\) 降序排序

設當前考慮到了第 \(i\) 個人, \(p\) 個人中選了\(p_0\) 個, 如果 \(i - p_0 < k\) 那麼這第 \(i\) 個人是必須選的

然後就做完了

E

本題中的圖實際上是多棵基環樹, 並且是內向樹

基環樹:具有N個點N條邊的連通圖。

內向樹:每個點有且只有一條出邊。也就是這棵樹給人的大體感覺是向內的。

外向樹:每個點有且只有一條入邊。也就是這棵樹給人的大題感覺是外向的。

Trick:對於基環樹, 把環和鏈分開考慮

首先, 所有點最後構成一個環, 每個點的出度、 入度均為 1

然而目前每個點可能有多個入度

  1. 如果沒有環的話, 直接貪心地保留每個點修改代價最大的入度即可

  2. 如果有環, 並且環的大小不為 n (否則修改的代價為 0), 一定要斷開環上的一條邊, 列舉環上節點, 斷掉與該節點的最大出度差最小的那條即可

F

一眼 dp

狀態

\(n \le 150\), 這意味著 \(a, b, c\) 的個數均 \(\le 51\)

那麼就可以寫到狀態裡

\(dp(i, a, b, c)\) 表示考慮到了第 \(i\) 位, 整個串 \(a, b, c\) 分別有這些個

再考慮轉移

為了不算重, 如果該位置字元為 s, 我們規定他只能轉移到 \(pos \ge i\) 的、 \(s\) 第一次出現的位置

(因為如果轉移到一個更靠後的位置, 說明 i 到該位置直接的字元全為 s, 與轉移到上述位置是等價的)

記這個位置為 \(nxt[i]\)

則:

(dp[nxt[i][0]][a + 1][b][c] += dp[i][a][b][c]) %= MOD;
(dp[nxt[i][1]][a][b + 1][c] += dp[i][a][b][c]) %= MOD;
(dp[nxt[i][2]][a][b][c + 1] += dp[i][a][b][c]) %= MOD;

為什麼直接列舉整個串的 \(a, b, c\) 的個數是正確的?

很簡單, 如果這種狀態不合法, 那麼 dp 值為 0, 不用擔心

G

鴿