A
有 \(n\) 個木塊和一個擋板,他們的初始位置分別為 \(a_1,a_2,\dots, a_n, P\),滿足這 \(n + 1\) 個數嚴格單調遞增。有 \(q\) 次操作,每次:
-
給定 \(x\),加入或刪除位於 \(x\) 處的木塊。
-
對於 \(i = 1...n - 1\),把第 \(i\) 個木塊推到第 \(i + 1\) 個木塊前一個位置,最後把第 \(n\) 個木塊推到 \(P - 1\) 處。
\(1\le n, q\le 2\times 10^5\)
考慮每次進行 2 操作,會使得 \(a_1' \gets a_2 - 1, \ a_2' \gets a_3 - 1, \dots, a_{n - 1}' \gets a_n - 1, a_n \gets P - 1\)。
維護一個位置集合 \(S\),相當於令 \(S\) 中所有數 \(-1\),然後刪除最小值,加入 \(P - 1\)。
用 set 維護,記錄全域性 \(-1\) 標記即可。
B
三個變數 \(P,S,D\) 初始為 \(0\)。有 \(n\) 次操作,第 \(i\) 次給出 \(x_i, y_i, z_i\),可以執行三個之一:\(P \gets P + x_i + S\);\(S\gets S + y_i\);\(D\gets D + z_i\)。每次操作完後,令 \(S \gets S + D\)。
求最終 \(P\) 的最大值。
\(1\le n\le 80\)
直接算肯定不行,考慮拆貢獻。
對於一次操作 \(i\),其中第 \(i\) 次操作為 \(S \gets S + y_i\),令 \(c\) 為後續 \(P\) 操作的次數,那麼對答案的貢獻為 \(c\cdot y_i\)。
對於一次操作 \(i\),其中第 \(i\) 次操作為 \(D \gets D + z_i\),令 \(c_{1\dots m}\) 為後續 \(P\) 操作的時刻,那麼對答案的貢獻為 \(z_i\sum\limits_{j = 1} ^ m (c_j - i)\)。
從後往前 DP,設 \(f[i, j, k]\) 表示考慮了操作 \(i\sim n\),滿足 \(P\) 操作的次數為 \(j\),每次 \(P\) 操作的位置減去 \(i - 1\) 的總和為 \(k\),最大的總貢獻。
時間複雜度 \(\mathcal O(n^4)\)。
C
有很多盒子,編號為 \(1\sim 10^{115} - 1\)。你按編號從小到大開啟所有盒子,開啟每個盒子裡有 \(A\) 根火柴並收入口袋中。開啟第 \(i\) 個盒子後,你需要用口袋裡的火柴拼出數字 \(i\)。拼出數碼 \(j(0\le j\le 9)\) 需要花費 \(a_j\) 根火柴,求第一個不能拼出的數字,或者輸出 \(-1\)。
\(0\le A, a_i\le 100\)
設 \(b_i\) 為拼出盒子 \(i\) 的所需要的火柴數,設 \(s_i = \sum\limits_{j = 1} ^ i (b_j - A)\),那麼我們相當於求出第一個滿足 \(s_i > 0\) 的位置 \(i\)。
考慮處理出 \(f[i,j]\) 表示對於 \([0, 10^i - 1]\) 中的盒子,每個盒子中火柴數為 \(A - j\) 時的 \(s_{10^i - 1}\),\(g[i, j]\) 表示對於 \([0, 10^i - 1]\) 中的盒子,每個盒子中的火柴數為 \(A - j\) 時的 \(\max\limits_{k = 0} ^ {10^i - 1} s_k\)。
每次合併兩對 \((f,g)\) 時,就和線段樹維護字首最大值一樣。
考慮貪心填寫答案,先列舉答案位數 \(bit\)。接下來從大到小列舉每一位,列舉這一位填寫的數碼,然後利用 \((f, g)\) 判斷合法性,需要使用高精度。
D
一張無向圖,你需要給每條邊賦一個 \(0/1/2\) 的權值,滿足任意一個簡單環的邊權之和為奇數,且每個點連線的任意兩條邊權值和 \(\bmod 3 \not = 1\)。
\(1\le n, m\le 10^5\)
當兩個環有交時,一定不合法,所以每個連通塊必須是一個邊仙人掌。
考慮建立園方樹,第二個條件相當於 \(0\) 和 \(1\) 不能同時在一個點出現,且 \(2\) 在一個點至多出現一次,簡單 dp 即可。