二月——Week4

2025.2.23

A: 简单的生成树

答案式子为 \(\prod siz_in^{m^\prime-1}m^{n^\prime-1}\)
至关重要的一环,\(siz_i\) 相当于 \(i\) 所在连通块内选择一个关键点的方案数。
所以可以设 \(f_{x,0/1}\) 表示 \(x\) 所在连通块是否已经选择了一个关键点的方案数,左右两棵树分别进行 dp。那左边的树来举例
转移是 \(f_{x,0}\gets nf_{x,0}f_{y,1}+f_{x,0}f_{y,0}\),分别代表新开一个连通块和不新开。\(f_{x,1}\gets nf_{x,1}f_{y,1}+f_{x,1}f_{y,0}+f_{x,0}f_{y,1}\),分别表示新开一个连通块并把 \(x\) 选为关键点,不新开把 \(x\) 选为关键点,不新开不把 \(x\) 选为关键点。
对最上面的想到 dp 之后的过程就非常简单。
赛时通过打表发现完全二分图生成树个数是 \(n^{m-1}m^{n-1}\) 后一直停留在矩阵树定理如何快速带修求出一个长相奇特的行列式的值。
并没有想到先添加一些树边是两边分别形成若干连通块后再求答案,如果想到了这里的话式子是比较容易由初始打表发现的结论来猜得,但是得到这个式子将 \(siz_i\) 变成 \(i\) 连通块内选择一个关键点的方案数感觉不太好像,虽然好像这个转化比较经典。

B: 简单的拼接

原题详见 2025.1.03 B.挖野菜
本题变成多串,建 Trie 之后像上题那样处理。
记录一下比较重要的结论:
到根路径并等于按 dfn 排序后所有点的到根距离和减去相邻两点的 \(\text{LCA}\) 距离和,或者为按 dfn 排序后相邻两点的距离和(首尾也算)除以二。

C: 简单的计数

记录一个很厉害的东西。
对于有的阶乘暴力,最终答案类似 \(\sum\limits_p \prod a_{i,p_i}\) 形式的,这种积和式很难处理,当我们只关心存在性(即答案是否非 0)而不关心答案具体是多少时,将式子变成 \(\sum\limits_p(-1)^{\sigma(p)}\prod a_{i,p_i}\) 可以变成行列式求值。时间复杂度直接由 \(O(n!)\) 变成了 \(O(n^3)\),厉害!

2025.2.24

A:弹性碰撞

赛时注意到一个 A 类型的正电荷和左边一串负电荷开创,创到最后其实是将左边那一串的负电荷向左循环移位一位,同时将序列中最右边的球变成 B,这时候一个遇到一个负电荷球我们就把他塞进队列里,那么如果他要作贡献变成 B 球,必须要后面有当前队列大小个正电荷球来把他创出来,这样就可以 dp 了,然而只能拿 70 分。
上面说的有些复杂,虽然推到最后和题解也是计数同一个东西吧,还是说一下题解吧。
首先一堆东西来回碰撞是不会发生互相穿越的的事件的,所以最后每个球的相对位置一定不变,也就是说如果最初我们序列中有 \(k\) 个正电荷,那么最终的结果是序列中的前 \(k\) 个球最终为正电荷,而我们要找的是 B 类型的正电荷,也就是初始为 A 类型的负电荷,也就是说我们最终的答案是序列中前 k 个球中负电荷球的个数。
现在就可以对于每一个球求出它的贡献了。若一个球要产生贡献,首先它要么为 -,要么为 ?,其次序列中正电荷的球的个数要大于等于这个球的下标,预处理出组合数后缀和就能解决问题。
感觉碰到这种创创创的题大脑就会宕机,但只需要记住最终相对位置不变或者相撞相当于没撞/直接穿越的经典结论似乎就不会无从下手。

C:树上二维偏序问题

对于链的情况,大胆猜测或者显然有一个分界线,分界线前面的问号全都填成 0,后面的问号全都填成 1,这样就可以三分这个分界线了。快速计算左边问号全填 0,右边问号全填 1 的贡献可以使用线段树,维护区间 0 的个数,区间 1 的个数,区间问号的个数,区间的答案,区间问号后 1 的个数和,区间问号前 0 的个数和。
知道有这个分界线之后,对于我们的暴力,就可以由 \(O(n^2q)\) 暴力树上背包优化成 \(O(nq)\) 了。
具体做法就是一个点如果填 0,那么它的祖先都必须填 0,所以我们可以默认都填成 1,然后维护每个点从 1 变成 0 的贡献,把贡献为正的填成 0 就好。

2025.2.25

A:游戏

根据博弈论题经典套路,先考虑一个游戏的 SG 函数,最后再把多个游戏的 SG 异或起来。n 的范围 \(\le 10^5\) 而且多组询问带修又告诉我们 SG 函数一定不困难,得到结论之后要使用线段树等数据结构单 \(\log\) 来维护。
这时候考虑一个游戏的 SG 函数,发现可操作次数是固定的,对于一个长为 \(n\) 的 01 串而言,记最左边的 1 位置为 \(l\),最右边 1 的位置是 \(r\),那么可操作次数就是 \(n-2\times\min(l-1,n-r)\)
这时候使用线段树维护一下区间取反,区间最左 1 的位置和区间最右 1 的位置就完成了,对于询问的 \(k\) 个区间我们把它们的操作次数异或起来,运用经典 Nim 结论,若为 0 则先手必败,否则必胜。

B:连通

所有数都是 \(X\) 的倍数,所以先把最小公倍数 \(Y\) 以及所有 \(a_i\) 都除以 \(X\),之后我们就是要计数 交集为空,并集为全集 的连通块个数。
题面所有数的质因数都 \(\le50\) 提示我们首先把每个数质因数分解,这样数就变成了一个二进制串。
交集为空,并集为全集 等价于每个元素既有 0 也有 1,到这里的转化比较平凡。
比较牛的是上面说的东西等价于 存在一条边,其两个端点一个包含这个元素,另一个不包含这个元素
那我们把边权设为两个点权的异或来进行树上 dp。那么 交集为空,并集为全集 这两个限制最后就变成了 并集为全集 这一个限制。
树形 dp 转移式子为 \(f_{x,S}=f_{x,S}+\sum\limits_{T_1\cup T_2\cup w=S}f_{x,T1}f_{y,T2}\)
每次合并使用 FMT/FWT 的话,时间复杂度是 \(O(2^{15}15n)\) ,不能通过。
但是并不是每次合并都要用 FMT/FWT,我们在每个位置的数组都维护 FMT/FWT 的点值的话时间复杂度就只有 \(O(2^{15}n)\)
最后在每个结点都求一下 \(S\) 为全集的值,由于只求这一项,所以在一项做高维差分就好了,IFMT/IFWT 回来求这一项复杂度就又不对了。
感觉多个限制通过异或转成一个限制的 Trick 还是很厉害的,这就不得不想到另一个不咋相关但是类似的题 Link,把高维的问题通过技巧拆分成不相关的低维问题赛时是不太能想到的。

2025.2.26

A:安全

容易设出 \(O(nV)\) 的 dp,即 \(f_{i,j}\) 表示第 \(i\) 个数变成了 \(j\) 的最小代价,顺序 dp,使用单调队列优化。
这种对一个数加一减一然后代价是绝对值的题使用 slope trick 优化。若干个绝对值函数相加最终一定是凸函数,同时我们的答案函数连续,斜率为整数,所以可以使用。
介绍一下 slope trick。
使用一个大根堆和一个小根堆来分别维护凸函数斜率 \(\le0\) 的部分和斜率 \(\ge0\) 的部分,一个点表示斜率增加 1,若在一个位置斜率变化为 \(k\) 那么塞 \(k\) 个。
两个凸函数的相加,我们就是把斜率变化点进行合并。通常是只有一个(少量)拐点的函数合并到我们的答案函数,来快速维护答案。
合并时分三段,斜率 < 0,斜率 > 0,以及斜率 = 0。
合并斜率变化点的同时,我们要维护我们的答案变化,其实答案变化量分情况,其实就是看原来最小值的位置和现在最小值的位置变化以及这两个点所处的直线斜率。

B: 运动美学

最短路最大,考虑二分答案。如果能 \(O(n)\) 进行 check 就能做。
二分到的当前答案 \(mid\),我们 check 最短路能否大于 \(mid\),那么我们要将从 \(1\) 经过这条边到 \(n\) 的最短路 \(\le mid\) 的边全都拿出来。这点通过我们预处理 \(1\)\(x\) 的最短路 \(dis_x\) 以及 \(n\)\(x\) 的最短路 \(Dis_x\) 就能处理。
之后我们要在这些边中找出一条在 \(1\)\(n\) 的必经之路且进行完操作后使 \(1\)\(n\) 的最短路 \(>mid\) 的边,这个使用 tarjan 找割边来解决。如果能找出来,代表我们最短路可以 \(\ge mid\),否则不行。

2025.2.27

A: 高冰果

莫贪心,爆了一个零,空悲切。
怎么贪都贪不出来一定要想想 dp。设 \(f_{i,j}\) 为到位置 \(i\) 填的前缀最大值为 \(j\) 的最大伤害,注意一下状态转移是否合法,直接转移就能拿到 35 分了。

B: 子图

总的颜色数为 \(O(n)\),要求至少颜色数为 \(k\le 5\),这种东西很容易想到将颜色随即映射为 \(1\sim k\) 中的一个整数,映射完之后求得答案和映射前答案相等,当且仅当映射前为最优答案的五种颜色映射之后互不相同,概率为 \(\frac{5!}{5^5}\),也就是说一次的错误率为 \(1-\frac{5!}{5^5}\),多进行几次错误率就很低了。
接下来考虑如何求一个无向图至少包含 \(k\) 种颜色的点数最少的联通子图。
我们设 \(f_{i,j}\) 表示包含 \(i\) 结点的连通块,出现颜色状态为 \(j\) 的最小连通块大小。这个联通子图一定是一棵树,那我们就能 dfs 进行树形 dp 吗?显然不行,dfs 虽然不会形成横叉边,但是返祖边仍然会对答案造成影响。
例如下图从 \(1\) 开始搜的话容易搜成 \(1-7-2-5-6-4-3\) 的链,这样就不可能求出最优答案了。

既然是连通子图,那么这个问题其实和最小斯坦纳树差不多,同样按最小斯坦纳树那样转移就好。

C: 显现

顺着扫,同时维护一个序列,为每个颜色的上一次出现位置,这样每次扩展一个新位置就可以在原来的序列上二分,找到最后一个个颜色数量不发生变化的位置,那么当前点的颜色就是那个位置的颜色。如果没找到,说明这是一个新的颜色。
维护序列的话可以使用平衡树,线段树上二分等多种数据结构,不过根据经验 vector 不会被卡,所以使用 vector 也是可以过的。
\(k = 2\) 的情况要特判,因为要求查询次数严格小于等于 \(n\)

posted @ 2025-02-23 17:17  ZepX_D  阅读(56)  评论(4)    收藏  举报