2025.3
P11714 清华集训 2014 主旋律
总结:做计数时可以令要求的答案作为代表元,用代表元来表示总集,这通常是第一步。比如这个题就令“缩点之后入度为 \(0\) 的强连通分量”作为代表元,强连通分量就是我们要求的答案。
令 \(P(S)=\sum_{(u,v)\in E} [u \in S, v \in S], Q(S, T)=\sum_{(u,v)\in E} [u \in S, v \in T]\)。
那么现在我们只知道一个式子:
也就是钦定一些缩点后入度为 \(0\) 的强连通分量。\(f(s)\) 表示 \(s\) 内的点构成强连通分量的方案数。因为是钦定,所以有一个 \(h(m)\) 的系数。\(h(m)\) 也很好求:
简单归纳可以得出 \(h(n)=(-1)^{n+1}\)。
然后对于上面的式子,把 \(m=1,t_1=S\) 的一项移到左边。再令 \(g(s)\) 等于 \(\sum_{t_1\cup t_2\cup..t_m=s} (-1)^{m+1} \prod_{i=1}^{m} f(t_i)\)。分别转移 \(f(s),g(s)\) 即可。记得求完 \(f(s)\) 后令 \(g(s) \rightarrow g(s)-f(s)\)。
P11834 省选联考 2025 岁月
总结:图论计数全家桶。
这里不妨考虑概率,可以省去一些不必要的组合数。
考虑性质 C。
令图 \(G'\) 中满足能到达所有点的起点集合为 \(S\),那么应该满足 \(3\) 条性质:
- \(S\) 中的点强连通
- \(S\) 中的点能到达所有点
- \(S\) 外的点没有边指向 \(S\) 内的点
性质 \(1\) 就是主旋律,性质 \(3\) 直接算一下边的个数即可。对于性质 \(2\),有一个简单 dp 是,先固定起点集合 \(X\),再设 \(f(t)\) 表示 \(S\) 中的点当前能到达 \(t\) 集合的概率。这个可以容斥计算:\[f(s)=1-\sum_{t \cup X = t} f(t)2^{-Q(t, s/t)} \]
然后答案是 \(f(2^n-1)\)。起点很多,终点唯一。容易想到倒着 dp。也就是把上面式子的 \(f(s/t)\) 继续展开,那么每一次转移都有一个 \(2^{-Q(t, s/t)}\) 的系数,然后 \(f(s)=\sum_{t \cap s=s} f'(t)\)。这个都是容易看出来的。
考虑正解。如果做过最小生成树计数,可以想到一条性质:对于任意最小生成树,边权 \(\leq v\) 的边的连通性都是一样的。在这个题里,也就是弱连通性一样。考虑边权为 \(v+1\) 的边的贡献,令 \(f(s)\) 表示,边权 \(\leq v\) 的边形成的连通块里,恰好 \(s\) 中的点可以到达所在连通块的所有点的概率,这里要求 \(s\) 中的点弱连通。
如果 \(s_1,s_2,..,s_k\) 通过一些边权为 \(v+1\) 的边弱连通,那么关键边 \((u,v)\) 必然满足 \(v\) 可以到达其所在连通块的所有点,不然 \((u,v)\) 这条边是没有用的,注意这里对 \(u\) 是没有限制的。
考虑现在这个大连通块能到达所有点的起点集合 \(S\),那么应该满足 \(4\) 条性质:
- \(S\) 中的点强连通
- \(S\) 中的点能到达所有点
- \(S\) 外的点没有边指向 \(S\) 内的点
- \(S\) 中的点在边权 \(\leq v\) 的边构成的连通块里,能到达其所在连通块的所有点。
做法跟性质 \(C\) 区别不大。这里唯一要注意的是,性质 \(C\) 中 dp 转移时,系数是 \(2^{-Q(t,s/t)}\),但在正解里,因为 \((u,v)\) 对 \(u\) 是没有限制的,所以令 \(h(s)\) 表示 \(s\) 中的点所在连通块的点的并集,系数应该变成 \(2^{-Q(h(t), s/t)}\)。同时做性质 \(2\) 的 dp 时也要注意,因为要满足性质 \(4\),不妨直接钦定 \(f(s)\) 恰好就是所有满足性质 \(4\) 的点,这里要额外算一下恰好满足性质 \(4\) 的概率。不这样处理的话,后面算概率会非常难办。
只在连通性改变的时候做 dp。总复杂度为 \(O(2^nn^2+3^n\))。参考代码
P11835 省选联考 2025 封印
考虑分成两部分计数。令第一次操作的数为 \(i\),再一次操作 \(i\) 的时候称开始下一轮。
第一轮的主要作用是删元素。所以从第二轮开始就不能再有元素被删去,也就是操作必须从前往后依次进行,这里是为了防止数重。同时根据最大值的大小可以确定当前是在哪一轮,所以是不会数重的。
- 进行了不到一轮
这个很好做。为了避免数重有两个要求:
- 若 \(a_i=1\) 且操作了 \(i\),则不能操作 \(j \gt i, a_j \gt 1\)。
- 若末尾操作了 \(1\),则开头不能操作 \(2\)。
要求 \(2\) 是因为,开头操作 \(2\) 就相当在末尾插入一个 \(1\)。
直接 dp 即可。
- 不止一轮
首先 \(a_i=1\) 的位置可以直接删掉。
令 \(a_{i+n}=a_{i}-1\),\(pos\) 为序列中最靠前的最小值的位置,那么答案为 \((a_{pos}-2) \times len + pos-1\) 。
枚举 \(pos\),令 \(f_{i}\) 表示结尾为 \(i\) 的答案,\(g_i\) 表示结尾为 \(i\) 的方案数,从 \(j\) 转移到 \(i\) 需要满足 \(\max(a_{j+1},..,a_{i-1},a_{i})=a_{i}\)。因为要贡献"\(pos-1\)",每选择一个 \(\gt n\) 的位置,答案都要 \(+1\)。
可以直接看代码,很清晰:
re(i, len) {
f[i] = val[i] - 2, g[i] = 1;
rep(j, i+1, i+len) {
f[j] = g[j] = 0;
if((j == i+len) || (val[j] >= val[i])) {
int mx = 0;
per(k, j-1, i) {
if(mx >= val[j]) break;
MOD(f[j] += f[k]);
MOD(g[j] += g[k]);
mx = max(mx, val[k]);
}
if(j < i+len) {
MOD(f[j] += 1ll * (val[i]-2) * g[j] % mod);
if(j > len) MOD(f[j] += g[j]);
}
}
}
MOD(ans += f[i+len]);
}
容易用单调栈做到 \(O(n^2)\)。
但这里会少算一种情况。当选择的集合为 \(\max,\max,..,\max-1,\max-1\) 时,因为这些位置是必须被选的,所以进行到最后 \(2 2 2 ... 1 1 1\) 时,只能计算到 \(111...111\) 这种方案,\(1\) 更少的方案是计算不到的,所以答案要加上集合大小。参考代码
P5853 USACO19DEC Tree Depth P
位置 \(i\) 在笛卡尔树上的深度,也就是前缀 \(i\) 的后缀最小值个数 \(+\) 后缀 \(i\) 的前缀最小值个数 \(-1\)。不妨只求第一部分。第二部分将序列翻转后一样做。
令一开始序列为空,随后不断往序列前端加数。那么后缀最小值也就是,加入 \(v\) 时,逆序对数没有变化。令 \(f_{i,j,0/1}\) 表示加入了 \(i\) 个数,逆序对数为 \(j\),有没有钦定后缀最小值。最后再计算一个 \(g_{i,j}\) 表示最后加入的 \(i\) 个数,贡献了 \(j\) 个逆序对。那么答案就是 \(\sum f_{i,j,1} g_{n-i,K-j}\) 。可以看做最后加入的这 \(n-i\) 个数是从 \(i+1\) 开始一直往后加入。
P5156 USACO18DEC Sort It Out P
总结:排序题,先想逆序对相关。
容易发现若 \(i \lt j, a_i \gt a_j\),则 \(a_i,a_j\) 中至少有一个被选中。因为未被选中的数之间的相对顺序不会改变。更进一步的,所有未被选中的数应该构成一个上升子序列。必要性充分性都挺好说明的。然后容易将问题转换成求“字典项第 \(K\) 大的最长上升子序列。这个随便做。复杂度 \(O(n\log n)\)。
ARC194E
总结:操作可逆,判断两串是否同构。基本思路是若 \(a\rightarrow c, b\rightarrow c\),则 \(a=b\)。
在这个题里,不妨将两个串都操作成字典序最小的串,然后比较操作完的串是否相同。也就是尽量把 \(0\) 往前挪。感受一下,能操作就操作就可以,不会存在两个区间都能操作,其中一个区间操作完后另外一个区间不能操作。问题是直接做复杂度会很高。从前往后划分,每当有连续 \(A\) 个 \(0\) 就划分为一段。可以发现,操作前面的区间不会影响后面区间的划分情况,因为这只是在把 \(1\) 往后扔。操作后面的区间会影响前面的划分情况,因为这会把 \(0\) 往前扔。所以先从后往前,每次操作能操作的最靠后的区间。这样得到的最终区间,再从前往后做即可,因为 \(0\) 的划分情况已经不变了,只需要尽量把 \(1\) 往后扔即可。复杂度线性。
P8263 Ynoi Easy Round 2020 TEST_8
不会 WBLT。
记录一个小 trick 吧相当于。 \(x\) 和 \(2x\) 的二进制下 \(1\) 个数的奇偶性是一样的,这启发我们可以进行倍增。例如这个题,就可以维护复制 \(2^k\) 次后,正串和反串分别长啥样。更新 \(2^{k+1}\) 是容易的,\(2^{k}+1 \sim 2^{k+1}\) 相当于二进制下多了一个 \(1\),也就是奇偶性改变,用之前的信息可以求出来。
GYM105666C
总结:
- 尝试猜测充要条件。
- 尝试把题目转换到网络流上,虽然复杂度可能不对,但或许更有利于证明一些结论。
- 上升子序列,意味着对于逆序对 \((i,j)\),\(i\) 和 \(j\) 不可能同时在子序列里。
给定一个长度为 \(n\) 的排列,从中选出一个长度为 \(K\) 的子序列使得这个子序列的最长上升子序列的长度不超过 \(\frac{K+1}{2}\)。找到这个子序列,或者返回无解。多测。 \(1 \leq K \leq n \leq 5\times 10^5\)。
一个显然的观察是,如果 \(a_i\) 在子序列里,且所有满足 \(j \lt i, a_j \gt a_i\) 的 \(j\) 都不在子序列里,那么随便选一个 \(j\) 加入子序列是更优的。进一步的,因为题目里有 \(\frac{K+1}{2}\) 这样的限制,猜测子序列合法的充要条件是:选出的子序列里,若 \(j \lt i,a_j\gt a_i\),则连边 \((j+n,i)\),那么该图的最大匹配个数 \(\geq \lfloor \frac{K}{2} \rfloor\)。
证明的话,显然,一条边连接的两个端点不可能同时出现在上升子序列里。那么也就是求这个图的最长反链=最小链覆盖=总点数-传递闭包后建图二分图最大匹配。反证,若最大匹配个数 \(\lt \lfloor \frac{K}{2} \rfloor\),也就是最后一项的大小 \(\gt \frac{K+1}{2}\),不合法。得证。
然后注意到我们只需要尽可能让每个点都有匹配即可,所以按照值域从大到小考虑,考虑到 \(a_i\) 时,如果存在 \(j \lt i, a_j \gt a_i\) 且 \(j+n\) 还没有匹配,那么就匹配 \((i,j+n)\)。这里直接选择下标最大的 \(j\) 即可,使用线段树维护。输出方案只需要把匹配的点都选上,如果点数不够 \(K\) 就再选一些。
P11676 USACO25JAN DFS Order P
DFS序为 \([1,2,..,n]\) 也就是 \(u\) 子树内包含 \([u,r]\) 间的所有数。对着这个做区间 dp 即可。
P11677 USACO25JAN Shock Wave P
总结:对于可以进行很多种操作的题,先分析一下操作具有哪些性质,比如进行 A 操作一定比 B 操作优,可以简化问题。
如果同时操作了 \(1 \lt i \leq j \lt n\),改成同时操作 \(i-1,j+1\) 是更优的。也就是至多有一次 \(1 \lt i \lt n\) 的操作。先考虑如果只能操作 \(1,n\) ,最少要几次。二分答案 \(x\),设操作了 \(a\) 次 \(1\),那么相当于有 \(n\) 个不等式 \(a(i-1)+(x-a)(n-i) \geq p_i\),要求不等式有解,这个可以 \(O(n)\) 处理。设此时答案为 \(V\)。
更进一步的,答案至少为 \(V-1\),因为同时一次操作 \(1,n\) 比只操作一次 \(i\) 更优。也就是只用 check 操作了一次 \(i\) 后,能否只用 \(V-2\) 次 \(1,n\) 操作,还是解不等式,但是不用二分了,复杂度 \(O(n^2)\)。
考虑优化,继续观察不等式,移项后得到 \(a \geq \lfloor \frac{p_i-x(n-i)}{2i-n-1} \rfloor\),不过要分讨 \(2i-n-1\) 的符号,这里只讨论正数的情况。操作一次至多让 \(p_i\rightarrow p_i-n\),也就是不等式右侧的值至多变化 \(\frac{n}{i}\) 次,求和,\(1\sim n\) 总共变化 \(n\ln n\) 次。直接维护这 \(n\ln n\) 次变化即可。复杂度 \(O(n\log^2 n)\) 。因为值的变化是 \(+1-1\),用桶来维护理论上可以做到 \(O(n\log n\)),不过有点难写。
P11678 USACO25JAN Watering the Plants P
总结: slope trick 的形式其实很多。\(f_{i,j}=\min_{k\geq a_i-j}(f_{i-1,k}+jb_i)\) 这种形式也可以做。也就是支持序列翻转,可以用 deque 维护。
令 \(f_{i,j}\) 表示前 \(i\) 个都合法,第 \(i\) 个水渠提供了 \(j\) 单位。容易写出转移方程:
答案是 \(f_{n-1, w_n}\)。令 \(V=\max(w_i)\),那么 \(i-1\rightarrow i\) 转移可以分成以下两步:
- 令 \(f_{w_i}=\min(f_{w_i},f_{w_i+1},..,f_{V})\),再令 \(j \gt w_i, f_j=\infty\)
- 翻转 \(f_{0} \sim f_{w_i}\),再令 \(f_{i} = \min_{j\leq i} f_{j}\),最后 \(f_i\rightarrow f_{i}+ic\)
打表发现差分数组单调增。但要特判 \(1\rightarrow 2\) 的转移,有 corner。考虑维护差分数组。
也就是要维护序列末尾删除元素,翻转序列然后符号取反,对 \(0\) 取 \(\min\) 后全局 \(+c\)。
对 \(0\) 取 \(\min\) 可以颜色段均摊。用 deque 维护翻转序列,然后维护符号的 tag,全局加的 tag 即可。
CF1237E
挺有意思的一个题。为啥只有 * 2400啊。
完美树的子树也一定是完美树。其次容易发现右子树的大小一定为偶数,这个可以通过分讨得到。
然后由于 \(n=1,2,4,5\) 的答案为 \(1\),\(n=3\) 的答案为 \(0\)。那么只有 \(2,4\) 能作为右子树,更进一步的,由于 \(n=1,2,4,5\) 都不是满二叉树,所以只有 \(5,4\) 能作为左/右子树,否则因为深度不同,可以将更深的叶子移到另外一个树上。然后就可以用 \(4/5\rightarrow 9/10 \rightarrow 19/20...\),复杂度 \(\log n\)。
CF727F
总结:假如在序列开头新增元素很难做,不妨尝试转化成在序列末尾加数。
有一个 \(nm\log n\) 的做法是,维护当前前缀和,如果\(\lt 0\),则不断删去最小的未被删除的数。
考虑一下为什么这个只能做到 \(nm\log n\),是因为在前面加数太难做了,所以考虑倒着做,这样就相当于在末尾加入一个数。
那倒着做的话,也就是相当于若 \(a_i \lt 0\),则需要一个 \(j \lt i, a_j \gt 0\) 来抵消 \(a_i\)。那么当前 \(a_j \gt 0\),就不断消掉后面绝对值最小的 \(a_i \lt 0\)。最小是为了使得删去的数最少。这样 \(a_0\) 需要消掉的集合是固定的,可以直接二分计算能消掉多少。
P8264 Ynoi Easy Round 2020 TEST_100
总结:第二分块
维护 \(1 \sim V\) 在经过第 \(i\) 块操作后会变成什么值。注意到如果能 \(O(1)\) 合并两个信息,那么复杂度就是对的。也就是若当前变换的值为 \(t\),那么将 \(t+x\) 和 \(t-x\) 合并起来即可。然后这里把较小的集合合并到较大的集合上,同时维护一下全局的 tag。最后再倒过来复原回去即可。
可以 poly,但是平衡树给我爬。
25mx D?A
trick1:求树上点 \(x\) 距离路径 \((u,v)\) 上的哪个点最近,可以用 \(lca(u,v) \oplus lca(u,x) \oplus (v,x)\) 求得。证明可以参考虚树相关。
trick2:给定一个连通块 \(V\),每次操作给定一个连通块 \(S_i\),将 \(V\) 与 \(S_i\) 求交。也就是连通块求交。将 \(S\) 按照 dfn 排序,相邻两点的路径的并构成了 \(S_i\),现在求 \(V\) 与一条路径的交,树链剖分,因为连通,所以在某条重链上,\(V\) 和 \(S\) 都是一个连续区间,对这两个区间求交即可。复杂度 \(O(n\log n)\)。
可以构成的 \(z\) 构成了一个区间。证明的话可以将最小值的方案一点点调整成最大值的方案。现在就要分别求最小值和最大值。最大值是好求的。最小值的话,维护现在的最小值集合,每次给定一个新的集合,也就是连通块求交。若无交,那么最小值就是最小值集合里到新连通块最近的点。
不过这个题的话,可以先钦定最后连通块里的一个点作为起点,从后往前找最近的点。这样就能找到最优的起点,再以这个起点从前往后做一遍即可。
容易做到 \(O(n\log n)\)。
25mx D?B
总结:\(ans_x = \sum (-1)^{\text{popcount}(x\cap a_i)} w_i\) 这种取交二进制下 \(1\) 的奇偶性相关的题,要往 FWT 去想,因为 FWT 的点值的式子就是 \(\sum (-1)^{|i\cap j|}\)。
注意到跟二进制下 \(1\) 的个数有关,考虑 FWT。\(m=1\) 就是直接 FWT。考虑 \(m\) 更大的情况。
大概只能容斥?考虑一些 \(2^m\) 相关的东西。 又因为是FWT,所以要想一些异或相关。
固定 \(x\),令 \(B_{i,S} = \oplus_{j \in S} a_{i,j}\),\(C_{i,S} = (-1)^{|x \cap B_{i,S}|}\) 。
这个式子只有 \(x=m\) 时不为 \(0\)。现在是当 \(x=0\) 时不为零。那么应该有 \((-1)^{j}\),这样后半部分 \(m-x=0\) 时不为 \(0\)。然后再乘上一个 \((-1)^i\),消掉前面的贡献。也就是令 \(A_{i,S}=(-1)^{|S|}C_{i,S}\)
这个式子当 \(x=m\) 时值为 \(2^m\),否则为 \(0\)。这就是我们想要的结果。那么最后除掉 \(2^m\) 即可。
那么就有 \(ans_x=\sum_{i=1}^{n} \sum_{S} (-1)^{|x \cap B_{i,S}|} (-1)^{|S|} w_i\)
\(O(n2^m\)) 预处理,\(O(2^k k)\) FWT 即可。
图论题
cxm 讲的一道题,感觉很厉害。
给出一个有 \(n\) 个点 \(m\) 条边的图,判断是否存在两个大小相同的简单环。\(n \leq 10^4,m\leq 10^6\)。
首先若这个图有 \(\gt n\) 个简单环,那么一定有解。也就是 \(m \leq 2n\),否则随便找一个 dfs 树,至少有 \(n+1\) 条返祖边,这些返祖边至少构成了 \(n+1\) 个互不相同的简单环。
现在暴力做复杂度是 \(O(n^3)\),通过一些神秘技巧可以做到 \(O(n^2)\)。
不过可以进一步证明若不存在两个大小相同的简单环,那么 \(m \leq n+2\sqrt n\)。考虑令每条边有 \(\frac{1}{2\sqrt n}\) 的概率被删掉,期望删掉 \(\sqrt n\) 条边。对于原图一个大小为 \(x\) 的环,在新图中仍然存在的概率是 \((1-\frac{1}{2\sqrt n})^x\)。那么新图中环的个数的期望就是对 \(x=1\sim n\) 的概率求和,结果是 \(\sqrt n\)。因为期望是 \(\sqrt n\),所以至少存在一种方法使得删去 \(\sqrt n\) 条边后只剩下 \(\sqrt n\) 个环,也就是可以再删去 \(\sqrt n\) 条边使得图中没有环,此时 \(m \leq n-1\)。综合一下,就能得到 \(m \leq n+2\sqrt n\)。广义串并联图一下再暴力找环,复杂度就是 \(O(n^2)\)。
CF840D
总结:扩展摩尔投票
令 \(d=\lceil \frac{r-l+1}{k} \rceil\)
一种做法是,取出 \([l,r]\) 中的第 \(1,1+d,1+2d,..\) 小的数,依次 check 是否出现至少 \(d\) 次即可。因为在排好序的数组中值相同的数是连续的。
另外一种做法是扩展摩尔投票。
若求区间中出现次数至少为 \(d\) 的数,可以每次删去 \(k\) 个互不相同的数。那么原先占比至少为 \(\frac{n}{k}\) 的数,删完后仍然至少占比 \(\frac{n'}{k}\)。因为 \(\frac{n}{k}\) 变小了 \(1\),至多删掉一个。
所以就可以维护一个大小为 \(k-1\) 的二元组,代表元素和其出现次数。合并是容易的。线段树维护复杂度是 \(O(nk^2\log n)\),这个题不带修改所以可以写猫树,可以省一个 \(k\)。
P7906 Ynoi2005 rpxleqxq
总结:静态区间查询用莫队。总是忘,闹嘛了。
二次离线莫队。要求 \(O(\sqrt n)-O(1)\) 修改查询。注意到值域跟 \(n\) 同阶,范围为 \(2^{18}\)。考虑类似于 meet in the middle,预处理 \(f_{i}\) 表示若 \(a\) 的前 \(9\) 位为 \(i\),则有 \(f_i\) 个 \(b\) 满足 \(b \oplus a\) 与 \(x\) 的第一个不同的位在前 \(9\) 位且更小。\(g_{i,j}\) 表示前 \(9\) 位为 \(i\),后 \(9\) 位跟 \(j\) 异或后的结果 \(\lt x\) 的后 \(9\) 位的数的个数。
然后就结束了。
CF718E
总结:要分析答案的性质。最优解一类的题只要保证可以计算到最优解即可。
称一类边为 \((i,i+1)\),二类边为 \((i, j), s_i=s_j\)。
一个显然的结论是直径长度 \(\leq 2|S|\)。每种字符至多经过两次。如果经过了多次不如直接从第一次经过走二类边到最后一次经过。
本题最关键的一点是,令 \(f_{i,c}\) 表示从 \(i\) 开始走到某个颜色为 \(c\) 的点的最小距离。那么 \(i\rightarrow j\) 的最短路就是 \(\min(|i-j|, \min (f_{i,c}+f_{j,c}+1))\)。这是能够计算到最优解的。因为一旦走了一条二类边,都会被后面的式子计算到。
- \(|i-j| \leq 15\)
此时有可能是前面的式子取 \(\min\),暴力枚举计算即可。 - \(|i-j| \gt 15\)
此时只用计算后面的式子。暴力计算复杂度 \(O(n^2 |\sum|)\)。 令 \(g_{x,y}\) 表示某个颜色为 \(x\) 的点走到某个颜色为 \(y\) 的点的最小距离,这个可以 \(O(n |\sum|^2)\) 计算。那么有 \(f_{i,c}=g_{s_i,c}/g_{s_i,c}+1\) 。令 \(msk_i\) 表示 \(f_{i,c}=g_{s_i,c}+[c \in msk_i]\)。若 \(s_i=s_j, msk_i=msk_j\),那么 \(i,j\) 可以被当成一种数。总共有 \(\sum 2^{\sum}\) 种数,对于每种数暴力计算即可。
25mx D3A
总结:猜测必要条件。二分图匹配相关要思考 Hall 定理。
只要左右两个子集分别满足 Hall 定理即可。也就是两边子集的选择是独立的。用 FWT 合并即可。
P10197 USACO24FEB Minimum Sum of Maximums P
做了半天都不对,还是没有分析清楚贡献是怎么计算的。
总结:分析最优结构的性质。区间 dp 的转移,只要保证可以计算到答案即可。
令 \(a_0=a_{n+1}=C\),\(C\) 是一个极大值,这样可以去除边界的影响。
考虑相邻两个固定的瓷砖 \(L,R\),不妨令 \(a_L \lt a_R\)。注意到若把 \((i,a_i)\) 画成折线,则“峰“的位置贡献系数为 \(2\),”谷“的贡献系数为 \(0\),否则为 \(1\)。对于 \(L\lt i \lt R\) 的部分,可以通过调整使得只有最大值为峰,最小值为谷。现在再带上 \(L,R\) 的贡献。易得答案为 \(a_R+\max(0, mx-a_R)+\max(0, a_L-mn)+\sum_{L \lt i \lt R} a_i\)
也就是只需要填入一些数,最小化 \(\max(0, mx-a_R)+\max(0,a_L-mn)\)。
一开始我不清楚这个具体的贡献函数,猜测每个区间内的数在值域上应当是连续的。但是观察这个式子,实际上只能推导出任意两个区间的值域,要么包含要么相离。证明的话,若有两个区间的值域相交,可以不断将 \(mx\) 较小的区间的 \(mx\) 和另外一个区间的 \(mn\) 交换。这样 \(mx\) 减少或不变,\(mn\) 增加或不变,是不劣的。
然后就可以 dp 了。设 \(f_{l,r,s}\) 表示考虑值域在 \([l,r]\) 的数,\(s\) 中的区间已经被放满了。转移要么值域边界往外扩一格。要么枚举 \(s\) 的子集合并两个 \(f\)。要么从 \([l+1,r-1]\) 转移过来并新增一个 \(s\) 中的区间。很显然瓶颈是枚举子集,对于 \(f_{l,r,s}\),枚举完 \(t\) 之后,只需要从 \(f_{l,l+siz_t-1, t}+f_{l+siz_t, r, s/t}\) 转移。复杂度 \(O(3^k n^2)\)。
CF1060F Shrinking Tree
总结:\(a^x=\sum_{i=0}^{x} \binom{x}{i}(a-1)^x\) ,也就是可以钦定 \(i\) 个元素,每个元素的权值为 \(a-1\)。
上一次做这个题是 2023.12。就当是复习了。
现在要计算 \(x\) 保留到最后的概率,不妨直接把 \(x\) 当成根。若在整个过程中,有 \(w\) 条边跟 \(x\) 相连,概率就是 \(\frac{1}{2^w}\)。假设已经确定了删边的顺序,考虑一条边 \((u, fa_u)\) 能被计算到答案,当且仅当这条边是到根的链上最晚被删除的边。比较遗憾的是这里不能线性性,因为贡献不是独立的,跟有多少条边满足限制有关。 根据“总结”里的内容,每钦定一条边,就乘上 \(-\frac{1}{2}\) 即可。令 \(f_{u,i}\) 表示考虑了 \(u\) 子树内的所有边,钦定的边里,在 \(u\) 子树中相对删除顺序最小的为 \(j\) 的方案数。合并儿子 \(j,k\) 时,枚举合并后最小值的排名,剩下的是一些组合数乘起来。
P5643 PKUWC2018 随机游走
总结:树上随机游走的题,一般都有 \(f_u=1+\sum_{(u,v) \in E} \frac{1}{|S|} f_v\) ,解这个方程组,可以设 \(f_u=g_u f_{fa_u}+h_u\),这个是可以从下往上递推的,那么 \(f_{root}=h_{root}\),再从上往下代入,解出方程。
相当于求 \(S\) 内点的“第一次到达”时间的 \(\max\),用 min-max 容斥转换成求第一次到 \(S\) 内点的时间。这个就是“总结”里的内容。暴力枚举 \(S\) 即可,复杂度 \(O(2^n n \log V)\)。解方程求逆元还需要 \(O(\log V)\),或许可以省掉。
P5405 CTS2019 氪金手游
总结:假如总共只有两种限制,不妨钦定 \(B\) 限制要么为 \(A\) 限制,要么无限制。
好简单的题。如果是外向树,记录 \(f_{u,i}\) 表示 \(u\) 子树内 \(w\) 之和为 \(i\) 的概率,转移时要乘上 \(\frac{w_u}{i}\),表示 \(u\) 第一次抽到的时间要最早。现在不一定是外向树。考虑每条指向父亲的边,要么无限制,要么钦定其指向儿子,乘上 \((-1)\) 的系数。注意本来应该是 \(f_{u,i} f_{v,j} \rightarrow f_{u,i+j}\),如果这条边选择无限制,那么应该为 \(f_{u,i} f_{v,j}\rightarrow f_{u,i}\)。
P8329 ZJOI2022 树
总结:要想降复杂度,可以考虑容斥。同时做多个不相关的容斥,系数是可以乘一块的,因为有乘法分配律。
不妨令 \(0\) 为叶子,\(1\) 为非叶子。
假如已经确定了第一棵树。那么第二棵树的限制就是:只能向 \(0\) 连边,且每个 \(0\) 都有入度。显然第二个条件长得就是容斥的形式。那么设 \(f_{i,j}\) 表示考虑了后 \(i\) 个点,钦定只能有 \(j\) 个 \(0\) 有入度。可以做到 \(O(2^n n^2)\)。那么 dp 时再算上第一棵树的贡献,令 \(f_{i,j,k}\) 表示考虑了后 \(i\) 个点,钦定第二棵树上 \(j\) 个 \(0\) 有入度,第一棵树上还有 \(k\) 个点没有父亲。转移时枚举当前点在第一棵树上是 \(0/1\)。问题在于 \(1\) 的转移需要枚举接了几个儿子,复杂度 \(O(n^4)\)。那不妨一开始就先钦定第一棵树上一共有 \(k\) 个 \(1\) 能有入度,做 \(1\) 的转移时,要么是被钦定的点,要么不是被钦定的点同时系数乘 \(-1\)。两个容斥一块做是没问题的,可以当成乘法分配律。复杂度 \(O(n^3)\)。
P9058 Ynoi2004 rpmtdq
总结:要仔细分析支配对。
区间点对最值显然支配对。先点分治,转换为区间最小两个数的和。单调栈,弹栈的时候更新支配对,支配对总数 \(O(n\log n)\)。
P5333 JSOI2019 神经网络
总结:考虑最优解的形态。
E* 的意义是从一棵树的任意一个点可以到另外一棵树的任意一点。对于一条哈密顿回路,每棵树被划分成若干条条链。可以先求出第 \(i\) 棵树被划分成 \(j\) 条链的方案数。
令 \(f_{u,i,0/1}\) 表示 \(u\) 子树被划分成 \(i\) 条链,是否有一条链经过 \((u,fa_u)\) 这条边。转移是树上背包,复杂度 \(O(\sum k^2)\)。那么现在就相当于,同一子树内的点没有连边,除此之外可以随便连边。
考虑最终的哈密顿回路,把经过的路径写下来,相当于限制相邻两个位置不能相同。这是经典问题,强制钦定第 \(i\) 棵树有 \(j\) 个相邻的位置。剩下的相当于一个多重组合数。可以 \(O((\sum k)^2)\)。还需要限制开头结尾元素不能相同,强制末尾是 \(1\),再算一遍方案就行然后减掉。同时第一棵树必须从 \(1\) 出发,算链的划分个数时要注意一下细节。最后是其实开头结尾可以同时为第一棵树内的路径,但是要求结尾的点是 \(1\) 的儿子,也就是可以一步走到 \(1\)。
qoj9611 木桶效应
同学出的题,来做一下!
首先计数题中的 \(\min\) 要么是差分成 \(\sum_{x} [min \geq x]\),要么是 min-max 容斥,唯独不可能是直接枚举 \(\min\)。
不妨先考虑 \(q=0\)。暴力的,先钦定每列的 \(\min b_i\),然后算方案数。对于单独一行,从小往大放数,\(x\) 只能放在 \(b_i \leq x\) 的列。只关心有多少个列可以放,dp 设 \(f_{i,j}\) 表示有 \(j\) 个 \(b \leq x\) 的列,转移枚举有多少个 \(\min = i+1\) 的列,复杂度 \(O(n^3)\)。有 \(m\) 行,直接算答案的 \(m\) 次方即可。
\(q\gt 0\)。首先还是考虑钦定 \(\min\),这 \(q\) 个位置对于钦定的 \(\min\) 有限制。记录一下这 \(q\) 列是否已经被钦定。直接做复杂度大概是 \(O(n^3 2^q q)\)。看了题解咋复杂度带了个 q^2 /yun。
某芸豆模拟T1
总结:字符串匹配问题,可以考虑匹配的对象的变化次数,如果次数很少可以把相同对象的匹配放在一块做。
给点 \(S,T\),每次只能删掉 \(S\) 中某种字符的第一次出现/最后一次出现位置,要求将 \(S\) 变成 \(T\),删掉第 \(i\) 个元素有代价 \(a_i\),最小代价。
\(T\) 中每种字符只有第一次/最后一次出现是关键的,因为这个改变了某种字符是否出现。也就是总共有 \(52\) 个关键位置,设 \(f_{i,j}\) 表示 \(s\) 中第 \(i\) 个字符对应了 \(t\) 中第 \(j\) 个关键位置的最小代价,接下来一段的转移,因为 \(t\) 中 \(j\rightarrow j+1\) 这一段内的字符,要么是已经结束,要么没开始,要么开始了还没结束,也就是 \(s\) 中每个字符是否应该保留是确定的。做一遍 kmp 转移即可。复杂度 \(O(n \sum)\)。
排列环长相关模2题
总结:限定排列的置换环长度 \(\leq 2\),并且答案 \(\bmod 2\),一般来说如果存在环长 \(\gt 2\) 的置换环,将这个环取逆就能构成双射,所以当做没有环长的限制即可。
定义好的排列 \(p\) 满足 \(\forall i, p_{p_i}=i\),求所有长度为 \(n\) 的好排列里,逆序对数为 \(1\sim k\) 的个数 \(\bmod 2\) 。\(n \leq 10^9, k \leq 5\times 10^4\)。
注意到若排列 \(p\) 存在环长 \(\gt 2\) 的置换环,将下标最小的置换环的边反向,构成了排列 \(p'\),这是一个双射。但是并不能保证逆序对数不变。但是不管环长直接求答案,这个东西竟然结果还真是对的,我也不知道他咋回事。
反正现在不用管环长的限制了,考虑 \(f_{i,j}\) 表示前 \(i\) 个逆序对为 \(j\),新加入元素枚举它在前 \(i\) 个里的排名并更新答案。反正就是 \(0 \leq a_i \lt i, \sum_{i=1}^{n}a_i = k\) 的方案数。听说可以 bitset 做到 \(O(n^2/w)\)。但我连正确性都不知道为啥对还来研究这个干啥。
P8275 USACO22OPEN 262144 Revisited P
总结:递归到子问题。做法需要按照值域扫的时候,可以考虑对序列建立笛卡尔树。
首先有一个区间的答案 \(\leq \max + \log n\)。
当序列不降时,考虑划分连续段。若只有一个连续段,答案是容易求的,直接 \(\log n\) 枚举最终答案即可。否则枚举当前连续段能合并出多少个下一个连续段内的数,然后递归到下一个连续段继续做。考虑本质不同的状态数大概是 \(n+\frac{n}{2}+\frac{n}{4}+...=O(n)\) 个,直接写个记忆化复杂度就是对的。每次枚举答案,总复杂度 \(O(n\log n)\)。
考虑为啥序列不降可以这么做。因为可以从前往后操作,等当前连续段操作完了再递归下去。
回到原问题,根据部分分做法,想到应该要建出笛卡尔树,同一权值按照下标从小到大确定顺序。不妨求出 \(h_i\) 表示考虑极长的以 \(a_i\) 为最大值的区间,操作完之后最少剩多少个元素,且所有元素 \(\leq a_i\)。转移很简单。继续往序列不降的做法上靠,考虑求 \(a_l=\max[a_l \sim a_r]\),操作完 \([l,r]\) 后会有 \(g_{l,r}\) 个 \(a_l\)。考虑从前往后扫,单调栈维护所有后缀最大值。每次考虑用左子树的 \(h\) 更新单调栈的结尾元素的 \(g\)。如果发生改变则递归修改单调栈的后缀。总共的更改次数应该也是 \(O(n)\) 级别的,顺便还能求出每个 \(g\) 对应的区间。
剩下的任务就很简单了,从后往前做单调栈,相当于只用在单调栈上进行递归。不过要注意的是应该把权值相同的数在单调栈里压在一起,不然复杂度会变成平方级别。还需要专门对同一个权值的数开个数组存一下前缀和,反正我的写法是这样。复杂度 \(O(n\log n)\)。

浙公网安备 33010602011771号