Codeforces Round 943 (Div. 3)(C-G1)

Lu_xZ發表於2024-05-03

C

題意:對於 \(i \in [2, n]\),給定 \(x_i = a_i \bmod a_{i - 1}\),構造一種符合條件的 \(a\)\(1 \le a_i \le 10^9\)

分析 \(a_{i}\)\(a_{i -1}\) 的大小關係。

  • \(x_i < a_i \longrightarrow a_{i - 1} < a_i\)

  • \(x_i = a_i \longrightarrow a_{i - 1} > a_i\)

為了不越界,\(a_i\)\(a_{i - 1}\) 都要儘可能大。

於是可以從 \(n\) 往前構造。

  • \(a_n = 10^9\)
  • \(x_i < a_i\)\(a_{i - 1} = a_i - x_i\)
  • \(x_i = a_i\)\(a_{i - 1} = 10^9\)

submission

D

最後一定是停在某個點不動,列舉最後停留的點即可。

submission

E

\((i, j)\) 表示第 \(i\) 行第 \(j\) 列。

  • \(j = 1\)\(j = 2\),填 \((1, j)\)

  • 否則填 \((j, j)\)

這樣 \(2n - 2\) 種長度都有了,從結論反推正確性很簡單。

submission

F

題意:給定序列 \(a\),每次詢問一對 \([l, r]\) 是否能劃分成大於 \(1\) 段使得各段異或值相等。

區間問題先轉化為字首異或。

  1. \(s_r \oplus s_{l - 1} = 0\)

    題目保證了 \(l < r\),所以一定有解。

  2. \(s_r \oplus s_{l - 1} = v\)

    • 一定劃分為奇數段。

    • 如果能劃分成奇數段,則一定能劃分成 \(3\) 段。

    • 最終劃分的異或值一定是 \(v\)

    於是問題轉變為是否能把 \([l, r]\) 分成三段,使得每段異或值都為 \(v\)

    找到最大的 \(i < r\) 使得 \(s_r \oplus s_i = v\),如果找不到則無解。

    找到最大的 \(j < i\) 使得 \(s_i \oplus s_j = v\),如果找不到或 \(j < l - 1\) 則無解。

    具體實現可以維護一個 map<int, vector<int>>

submission

G1

題意:將字串 \(s\) 劃分成 \(k\) 段,問每段的最長公共字首(\(\text{LCP}\))。

如果存在劃分使得 \(\text{LCP}\)\(v\) ,則任意 \(v' < v\) 都存在劃分。

單調性存在,二分字首長度。

令字首字串為 \(t\)\(s\) 種最多有 \(tmp\) 個不相交的子串 \(t\)

如果 \(tmp \ge k\),則存在劃分使得 \(\text{LCP}\)\(t\)

可以用 \(\text{kmp}\) 或字串雜湊求出 \(tmp\)

submission

相關文章