CSP模拟赛 #39
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 即可。