Loading

CSP模拟赛 #39

A

\(n\) 个木块和一个挡板,他们的初始位置分别为 \(a_1,a_2,\dots, a_n, P\),满足这 \(n + 1\) 个数严格单调递增。有 \(q\) 次操作,每次:

  1. 给定 \(x\),加入或删除位于 \(x\) 处的木块。

  2. 对于 \(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 即可。

posted @ 2024-10-18 21:17  Lgx_Q  阅读(9)  评论(0编辑  收藏  举报