2025.7.1 模拟赛
7.1 模拟赛
count
性质 + 一车分讨题
key:\(f(x)\equiv \theta(x) \pmod {B-1}\)
这其实是很显然的性质,具体参见 \(9\) 的整除规则,但考场上完全没往这方向想,感觉如果没见过的话确实需要一定灵感。
只有 0 和 B-1 的情况需要单独考虑,先不管它。
注意到这样一个区间的答案只与 \(sm\bmod {B-1}\) 以及数字集合 \(S\) 有关,由于增量是 \([-(B-1),B-1]\) 所以总和 \(\in [0,2(B-1)]\) 的需要保留,其他只关注模数即可。
考虑计数这些区间个数,枚举左端点,注意到这样本质不同的集合只有 \(O(B)\) 种,其中 \(sm\in [0,2(B-1)]\) 的也可以用非 0 元素划分成 \(O(B)\) 段,\(sm>2(B-1)\) 的可以预处理前缀和的前缀桶。
知道 \(f(sm,S)\) 后可以枚举增量后位运算推出变成 \(x\) 需要集合 \(T\) 中任意一个数,得到 \(g(x,T)\)。
再用 \(g(x,T)\) 推出答案数组 \(h(x,S)=\sum_{T\cap S\neq \empty}g(x,T)\),这里用高维前缀和+容斥处理即可。
\(0\) 和 \(B-1\) 需要单独计算全零串和只有一个非零元素串的贡献。
maze
神奇 DP 题。
第一步是树上最短路和拆贡献到每条边上,这样只关心子树大小就非常好。
key:子树形态只有三种
- \((i,j)\) 为根,父亲在外面,子树包含 \([l,r]\) 的整段。
- \((i,j)\) 为根,父亲是 \((i,j+1)\),子树包含 \([l,r]\setminus\{i\}\) 的整段和 \((i,1),\dots,(i,j)\)。
- \((i,j)\) 为根,父亲是 \((i,j-1)\),子树包含 \([l,r]\setminus\{i\}\) 的整段和 \((i,j),\dots,(i,a_i)\)。
对这三种情况分别 DP,设 \(f(i,j,l,r),g(i,j,l,r),h(i,j,l,r)\),枚举 \((i,j)\) 连边管辖的子树分别转移即可。
转移顺序比较神秘,所以记忆化搜索。
snow
本质是前后两个单调栈的归并,相同元素只算一次。
注意到这个相同元素就比较烦,很难对每个位置维护这个单调栈的形态和答案,于是拆贡献,考察每种权值对每个位置的贡献(显然同种权值只会对某个位置贡献一次)。
为什么这样好呢?因为这样只需考虑这个权值能否成为这个位置的前缀/后缀最大值,不关心序列的具体形态,只关心一个形如区间 \(\max\) 的东西,贡献是相对独立且容易维护的。
没有相同元素的时候贡献区间显然是 \([L_i+1,R_i-1]\),有相同元素时注意到贡献区间要么相同要么不交,所以对贡献区间相同的只算一次即可(等势点),不同的就不用管了。
发现此时交换相邻元素的影响就非常小了,比如对 \(v<h_x\) 或 \(v\ge h_{x+1}\) 的贡献区间没有任何影响(不妨设 \(h_x<h_{x+1}\))。
对 \(v=h_x\) 的考察左边/右边有没有等势点,修改是对一个区间 \(\plusmn 1\) 的形式。
\(v\in[h_x+1,h_{x+1}-1]\) 的只会改变对位置 \(x\) 或 \(x+1\) 的贡献(区间端点 \(\plusmn 1\))。会改变的位置形如一个区间内起点 \(>h_x\) 的后缀最大值,直接楼房重建即可。
\(h_x>h_{x+1}\) 是高度对称的,可以合在一起写,码量大约 6k。

浙公网安备 33010602011771号