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。

posted @ 2025-07-02 20:20  Cindy_Li  阅读(25)  评论(0)    收藏  举报