10 月 CSP 模拟赛瞎记
啊呀呀别催更了。
10.2
T1
枚举矩形上下边,中间前缀和优化。
T2
拆绝对值,数据结构维护。
T3
两种类分别赋 \(-1,+1\) 的权值,前缀和一下,转移时合法的前驱点将是一段区间,数据结构维护。
T4
模式串不超过 \(5\) 位,那么 DP 状态中直接记。
对于判不合法的情况,可以预处理每个结尾的五位数前面合法的分界点位置集合,是一个后缀。
注意模式串可能有前导 \(0\)。
10.4
T1
没思路,打表找规律!
T2
经典连通图计数,从 \(0\) 次和推到 \(1\) 次和再推到 \(2\) 次和。
T3
不想写四维偏序。一个三角形差分成两个无上界三角形和两个无上界右界矩形,就是三维偏序了。
T4
斐波那契数列相加还是斐波那契数列,那么分块,每一块只要维护第一项和第二项的标记。\(\mathcal O(n\sqrt n)\)。
线段树也可以做,也是维护第一项和第二项的标记,下放的时候需要矩阵快速幂,预处理然后改成光速幂即可 \(\mathcal O(n\log n)\)。
10.6
T1
ODT 裸题。
T2
也就是求每个格子到网格图外的所有路径中,路径最大值的最小值。
一个坑会由边界中最小的格子决定水位,可以视为坑里的格子通过这个格子与外界连通。
那么建虚点代表“网格图外”,与边缘格子连边,边权为 \(0\),图中每对相邻格子相连,边权为较大格子权值,然后做最小生成树。那么每个格子的答案就是 MST 上虚点到它路径最大值。
T3
状压每个数出现次数,用变进制数存,状态量上界是 \((2+1)^{10}\)。
T4
怎么又是同余最短路。
10.11
T1
因为是排列,可以发现可能的答案是 \(\mathcal O(n)\) 级别的,每次 \(\mathcal O(n\log n)\) 判定。
T2
同种字符之间的相对顺序不会改变,那么可以直接 DP,逐位放字符,状态上记录三种字符的已放个数,\(\mathcal O(n^3)\)。
T3
首先有一个性质,至少有一个人转移球的个数为 \(0\)(均分纸牌)。
从 \(0\) 为起点 DP,\(f(i,j)\gets \sum_k f(i-1,k)\times(a_i-j+k)\)。
只需要 \(\sum_j f(i,j)\) 和 \(\sum_j j\times f(i,j)\),可以改为矩阵转移,就可以前后缀和优化。
为了不算重,需要枚举第一个为 \(0\) 的点为起点,需要处理两类矩阵。
T4
好家伙,搬 JOI Final 压轴题。
loj 和 S2 数据怎么都这么水啊,最坏 \(\mathcal O(n^2\log n+q\log n)\) 的暴力跑得比正解快多了。
取 \(\max\) 的操作其实是告诉你,在 \(t\) 时刻 \(i\) 点的权值为 \(a_{i-t\dots i}\) 的区间 \(\max\)。
先差分询问为两个前缀询问,然后从左到右维护前缀上每个时刻的答案。
维护一个单调栈,那么每加入一个点,其在时间维上的权值按照单调栈里的元素分段。
我们在单调栈弹出一个元素的时候计算它对一个区间内点的贡献,需要区间加等差数列和区间加定值。
然后只要考虑询问右端点 \(r\) 时仍在单调栈中的元素。对于 \(r-i > t\) 的元素贡献是一段区间的等差数列和一段区间的定值,考虑再次离线下来,建出单调栈树,在上面 DFS 时维护点到根的答案;\(r-i\le t\) 的元素应特殊处理,其中只有最靠左的元素有贡献。
有很多细节,注意单调栈开头是缺少一些限制的。
10.13
T1
暴力做,写个 ST 表就可以 \(\mathcal O(n\log n)\)。
T2
每个数的所有可能的方案对应其 DAG 上的一条到终止状态的路径,考虑把所有数的路径进行多重集排列。
多重集排列大概是
我们只关心路径长度 \(r_i\),那么我们首先再值域上做一个 DP,求出 \(f_{i,j}\) 表示 \(i\) 开始到终止状态路径长度为 \(j\) 的路径方案数。因为路径长度理论是 \(\mathcal O(\log a_i)\) 的,实际上至多为 \(4\),所以可以直接做。
然后在序列上对 \(\sum_i r_i\) DP \(\dfrac{1}{\prod_i r_i!}\) 之和即可。
T3
我怎么这种 sb 构造都不会。
假设我们比较笨,只能一格一格地满足。用另外两个操作来抵消一个操作影响的一行一列,那么可以想到用四个操作来造成四个格子 \(\begin{bmatrix}1&-1\\-1&1\end{bmatrix}\) 的效果。
因为一定有解,并且每行每列的和恒不变,那么可以不管最后一行和最后一列,里面的格子满足了外面一定满足。
令一轮操作影响的四个格子为 \((i,j),(i,n),(n,j),(n,n)\) 即可。里面的挨个做,最后一行和最后一列的操作能抵消的合并一下,操作次数就是 \(\mathcal O(n^3)\) 级别的。
T4
首先要能观察规律,结论是:
若从 \((a,b)\) 走到 \((c,d)\),假设 \(a < b,c < d\),那么只有中间的矩形部分每行都存在障碍点 \((i,y_i),i\in [a,c]\),并且 \(y_i < y_{i+1}\) 的时候,路径长度会多出两步。

先算出不考虑障碍点时任意两点的路径长度和,然后加上两倍上面的方案数。
10.16
T1
无聊。
T2
经典题上犯傻。
设 \(f_u\) 表示 \(u\to \mathrm{fa}\) 的期望步数,\(g_u\) 表示 \(\mathrm{fa}\to u\) 的期望步数。
化简一下,
预处理一下,每次询问在 \(\mathrm{LCA}\) 两侧路径求和。
T3
无聊。
T4
还是 ODT,挺难写的,是我想麻烦了。
10.17
打得真烂。
T1
打表发现答案不超过 \(20\),那么只考虑代价很小的边就好了,暴力跑最短路。
不会做的时候还真的得动动歪脑筋。
脚造数据的出题人🐎有点多。
T2
区间 DP 卡卡常就过了,还是正解。
给梦想分的出题人🐎真多。
T3
\(f\) 函数其实是 \(2^i-1\),条件转化一下就是取 \(\mathrm{len}\) 为 \(c-1\) 最低位 \(0\) 的个数,所有 \(\mathrm{highbit}(x)-\mathrm{lowbit}(x)+1\le len\) 的 \(x\) 做前缀 \(\max\),并求和。
那么数位 DP 就好了,需要精细实现,复杂度 \(\mathcal O(|S|)\)。
T4
对于确定的 \((i,j)\),种类数对 \(x\) 有单调性。状压预处理二维 RMQ 查询矩形内数的种类数,每次二分找到合法的 \(x\) 的区间,复杂度 \(\mathcal O(nm\log (n+m))\) 带上很大常数。
教训是虽然状压只有 \(100\) 位,用 \(\texttt{__uint128_t}\) 状压慢得要死,\(\texttt{std::bitset<>}\) 永远都很稳健。
卡常的出题人🐎太多了。
10.19
T2
二分然后判负环和 \(\mathrm{dis}(n)\ge 0\)。
注意先在反图上 dfs 来去掉不可能到达 \(n\) 的点,避免无用负环的影响。
T3
每个点 \(i\) 向 \(i+1\) 连边,那么区间合法的条件为 \(r-l=\text{边数}\)。
从左往右不断加边,查找左边 \(r-l=s_l\) 的合法 \(l\) 数量。线段树维护 \(s_l-(r-l)\),这个值一定是 \(\le 0\) 的,维护区间最大值及其个数即可。
分块撑死 \(70\) 分,好气。
T4
每个点选取一个儿子的子集满足两两互质,然后做最大独立集的 DP。
可以发现真正有用的转移是找到约数 \(d\) 满足 \(\gcd(d,i/d)=1\),就是个多叉转二叉的过程。
预处理约数,然后用一些 \(O(1)\) 的手段判断互质可以做到 \(\mathcal O(n\log n)\)。
判互质可以用 \(\mathcal O(n)-\mathcal O(1)\) 的 \(\gcd\),也可以 \(\texttt{std::bitset<>}\) 状压 \(\sqrt n\) 以内的质数(172 个)。
然后被卡常卡成 \(55\) 分。
其实可以预处理质因子集合,每次枚举子集,两个子集代表的约数就一定互质,再加上枚举约数的转移,复杂度 \(\mathcal O(n\log n+\sum_{i=1}^n2^{\omega(i)})\)。后面的 \(\sum_{i=1}^n2^{\omega(i)}\) 大约是 \(10^7\) 级别,由于省去了判断互质的常数所以能过。
讲真的这个出题人不太行。
10.20
T1
期望的线性性!!!!
考虑每个点的贡献,这个点被操作的次数期望,也就是所有能到达它的点集中选中它的概率。
T2
建 KMP 自动机,DP \(f(i,j)\) 表示 \(s_{1\dots i}\) 匹配到 \(t\) 串自动机 \(j\) 节点的方案数。
T3
就是有点难写。
T4
先拆解答案为若干矩形并的面积,因为这样是好求的。仔细推一下就是 \(f(i)\) 表示 \(i\) 时刻矩形并的面积,答案为 \(T\cdot f(T)-\sum_{i=0}^{T-1}f(i)\)。
求和没什么好的做法,但是如果矩形互不影响的话,\(f(i)\) 可以被表示为关于 \(i\) 的多项式,而且是 \(2\) 次的,那么 \(\sum_i f(i)\) 可以表示为关于 \(i\) 的 \(3\) 次多项式。
按照矩形相互接触的时刻,\(f(i)\) 可以被分为 \(\mathcal O(n^2)\) 段,每一段做拉格朗日插值,每次求点值可以扫描线,复杂度 \(\mathcal O(n^3\log n)\) 或者 \(\mathcal O(n^4)\)。
10.21
T4
首先考虑暴力的搜索过程,逐位确定每个人,即从未确定的中找一个刷子然后枚举和谁匹配。
IDA* 或者剪枝优秀一点的搜索可以过。
由于这样会形成若干个环,一个环的操作次数就是环长 \(-1\),可以子集 DP 这个划分,复杂度 \(\mathcal O(3^n)\)。

浙公网安备 33010602011771号