2025.8
[AGC070B] Odd Namori
先不考虑第三个条件,对 \(n\) 个点的基环内向森林计数。
[AGC066C] Delete AAB or BAA
dp,然后转化为判定一个区间 \([l,r]\) 能否删空。
考虑什么样的字符串能够被删空。
首先有 \(c_A=2c_B\)。在此基础上,将 \(2c_B\) 个 A 插入 \(c_B+1\) 个空隙中,必定有一个空隙出现了两个 A,归纳下去即可。然而唯一的问题出在 \(c_B=1\) 时,只剩三个,可能存在形如 ABA 的情况。
我们发现额外要求 \(s_l\ne s_r\) 就可以满足了。这样有 \(2c_B-1\) 个数插入 \(c_B\) 个空隙,此时一定是存在的。
CF2122G Tree Parking
浓浓的 CF 风味数数题。
固定一棵树,方案数为
而一棵树拓扑序的为 \(\frac{n!}{\prod siz_i}\)。
所以我们计算拓扑序个数,然后乘上 \(\frac{(2n)!}{n!2^n}\) 即可。
固定拓扑序为 \(1,...,n\),计数有多少棵 \(p_i<i\) 且恰有 \(m\) 个叶子的树。
这等于欧拉数 \(A(n-1,m-1)\),其中 \(A(n,m)\) 表示长度为 \(n\) 且有 \(m\) 个下降的位置的排列个数。
考虑一个双射,我们提取这棵树的一个优先遍历编号较大的儿子的 DFS 序,一个叶子对应了一个 \(p_i>p_{i+1}\) 的位置。显然 \(p_1=1\),所以实际上是长度为 \(n-1\) 的排列。从排列也可以唯一还原一棵树,\(i\) 的父亲实际上等于 \(i\) 前面第一个 \(p_j<p_i\) 的 \(j\)。因为 \(p_1=1\) 所以一定存在。
[ARC198E] Monotone OR
考虑转移式
相当于我们要完成一个在线的或卷积。
考虑 cdq 的结构,先递归左半边,处理左半边到右半边的贡献,然后递归右半边。按位分治,在 \(x\) 和 \(y\) 最高的不同位完成转移。时间复杂度 \(O(n^22^n)\)。
我们发现瓶颈不在做点乘,而在 FWT 和 IFWT,也就是高位前缀和。这可以在分治过程中维护,时间复杂度 \(O(n2^n)\)。
CF2122F Colorful Polygon
很有趣的题!
考虑我们可以用一个长方形来造出一个组合数 \(C(a+b,a)\),通过将多个长方形拼起来就可以得到多个组合数的乘积。这种方法比较劣,需要大概 \(1/2ns+O(n)\) 的结点,不太行。
考虑对 \(a_1,...,a_n\) 分治,我们先造出一个 \(C(a_1+...+a_n,a_1+...+a_{[n/2]})\),然后继续递归分治两边,这种方法只需要 \(s\log n+O(n)\) 的结点数,很好。
关于 checker,似乎有论文可以 \(O(n^3)\) 求多边形三角剖分数。
[AGC064D] Red and Blue Chips
一件很奇妙的事情是我在 cf2122 前随机随到了这道题,当时并不会做,补了 cf g 后发现会了这道题。
类似 cf2122g 的结论,如果我们确定 DFS 序的排列 \(p\),\(p_1=n\),则 \(p_i<p_{i+1}\) 的位置对应了所有的叶子结点,在这道题中要求 \(s_{p_i}=R\to p_i<p_{i+1}\)。欲求连接 \(s_{p_1}s_{p_2}...s_{p_n}\) 可得多少种不同的字符串。
考虑如何判定一个字符串是否可以被生成。考虑一条遍历 \(n\) 个点的路径,如果碰到 R 说明下一步必须往右跳,所以贪心选择最靠前的 R 即可。容易改写成 \(O(n^3)\) 的 dp。
然而这个贪心是错的,这里放一个拍出来的 hack:RRBRRBB,正确答案是 15。
但是我们发现修改一下贪心的过程,假设一个 B 前面连着 \(b_i\) 个 R,对 \(b_i\) 从小到大贪心然后判定就对了。可以写出 \(f_{i,j,k}\) 表示只考虑 \(b_*\le i\),占用了 \(j\) 个 B \(k\) 个 R。复杂度是调和级数 \(O(n^3\log n)\)。
[ABC367G] Sum of (XOR^K or 0)
实际上让我们做的事情就是求 \([x^o][y^0]\prod (1+x^{a_i}y)\)。
如果不带 \(y\) 那么是经典的,考虑 \(\prod FWT(1+x^{a_i})\),求出在这一位上 FWT 为 0/2 的个数然后可以计算。这里关键是如何理解 \(1+x^{a_i}y\) 的 FWT。
考虑 \(y\) 这一元实际上代表了在模 \(k\) 意义下选的个数,用之前的技巧求出假设有 \(c_0\) 个 \(0\) 和 \(c_2\) 个 \(2\),预处理 \((-1)^0C(c_2,0)+(-1)^kC(c_2,k)+(-1)^{2k}C(c_2,2k)+...)\) 即可,具体来说是 \([x^0](1-x)^{c_{0}}(1+x)^{c_{2}}\)。设 \(dp_{i,j}\) 表示 \(i\) 个选了模 \(k\) 意义下的 \(j\) 个,可以递推。
CF1119H Triple
还是之前的套路。
用生成函数重新描述:
考虑将一个小多项式做 FWT 的结果,必然只存在 \(\pm c_1\pm c_2\pm c_3\)。
这里有 8 个未知数,所以需要 8 个方程来解。太多了,所以要稍微简化一下。
提取公因式,
,令 \(b'=b\oplus a,c'=c\oplus a\)。
现在就只有仅仅 \(4\) 种情况了。设四种情况的个数分别是 \(x_0\sim x_3\)。
构造
设上面三个 FWT 在某一项上为 \(p_1,p_2,p_3\)。
然后就能一一解出四个未知数了。
CF1103E Radix sum
即求 \([x^o]\left(\sum x^{a_i}\right)^n\)。
[AGC066D] A Independent Set
一个重要的性质是如果我们关注所有连续的 ABABABA...,则每一段存在一个 A 的位置是相较于初始位置没有动的。所以对不动点做 dp,设 \(f_i\) 表示第 \(i\) 个 A 作为一个不动点,这样状态数就被优化到了 \(O(n)\) 量级,转移 \(O(n^2)\)。经过优化也可以做到 \(O(n)\) 转移。
具体地,考虑两个不动点 \(i\) 和 \(j\),\(i<j\),如何计算 \(i\) 和 \(j\) 之间的花费 \(w(i,j)\):
- 将 \(i\) 后面的向后推,直到推不动为止,记此时为 \(p\)。
- 将 \(j\) 前面的向前推,直到推不动为止,记此时为 \(q\)。
- 必须满足 \(p+1=q\) 才能转移。
- 另外还需要满足 \(2(j-i+1)\le pos_j-pos_i+2\),不然显然放不下。
单调栈求出向前能推到的位置和向后能推到的位置,前缀和求出向前和向后需要的代价。转移需要排序,\(O(n\log n)\),使用桶排容易线性。
[AGC067B] Modifications
蒜头的奖杯
最终的式子是:
注意到 \(d_1d_2g\le n\),枚举 \(d_1,d_2,g\) 的复杂度最多是 \(O(\sum_g (n/g)\log (n/g))\)
[AGC052D] Equal LIS
设整个序列的 LIS 为 \(l\)。如果 \(l=2k\) 则容易构造,否则设 \(l=2k+1,k\in N\)。
有很多必要条件都很好找,考虑如果长度为 \(l\) 的 LIS 不唯一,则一定有解。
否则,存在唯一的 LIS,我们关注不在 LIS 之中的数 \(p\),如果 \(f_p+g_p-1\ge k+1\),则可以将 \(p\) 和 \(p\) 前面 \(<p\) 的以及 \(p\) 后面 \(>p\) 的组成一个长度为 \(k+1\) 的 LIS,将 \(l\) 个数中剩余的 \(k+1\) 个组成一个长度为 \(k+1\) 的 LIS。
【MX-X14-T7】墓碑密码
最新颖的地方是记录压位的正负号 \(O(\frac{n2^m}{\log n})\) 求出 \(\sum x^{a_i}\) 的 FWT。
[AGC056D] Subset Sum Game
如果 \(l=0\),那么获胜当且仅当 \(a_1+a_3+a_5+...\le r\)。
考虑第一次 \(s\ge l\),那么此时胜负就已定了。
Bob 的目标实际上就是让 \(s\ge l\) 的时候最大化 \(s+a_1+a_3+...\)。
也可以说 Bob 有两个备选方案,要么让 \(s<l\) 要么让 \(s>r\)。在某个时刻前 Bob 的目标是前者,经过某个时刻变成了后者。
以上思路都是错的。
考虑一个相似的问题,\(n=2k\),但是 Bob 先手。结论是将 \(a_{2k},a_{2k+1}\) 两两配对,若 Bob 选择了其中一个,Alice 的策略一定是选择与之配对的另一个。结论是 Alice 必胜当且仅当 \(\sum a_{2k}\ge l\) 且 \(\sum a_{2k+1}\le r\)。
考虑将这题转化为 Bob 先手,枚举 Alice 选的第一个数。但是这是 \(n\) 是奇数,所以还要枚举 Alice 给 Bob 余下来的最后一个数。
CF2089C2 Key of Like (Hard Version)
条件概率公式:
贝叶斯公式:
利用以上公式就能推出所有式子。
得到的结论是:假设有 \(m\) 把🔒,\(m+k\) 把🔑,如果第一次尝试匹配第一把🔒和第一把🔑成功了,则转化到 \(m-1,m-1+k\);否则有等概率用另一把钥匙匹配第一把🔒或者以第一把🔑匹配另一把锁,随后用同样的继续匹配直到匹配成功或是得到了一把空钥匙,转化到 \(m-1,m-1+k\) 或 \(m,m+k-1\)(空钥匙)。
利用期望的线性性拆成每个人成功的概率。设 \(f_{i,j,r}\) 表示 \(m=i,k=j\),当前轮到了第 \(r\) 个人。容易写出一个 \(O(nm^2k)\) 或者 \(O(n^2mk)\) 的 dp,优化很容易,对 \(r\) 转个圈即可。
CF2079D Homework
先考虑操作能够生成的空间。考虑有两个数 \(x,y\),则能够生成的数是 \(x,y,x\oplus y\)。
考虑这题中的操作等价于选择 \(i\ne j\) 令 \(a_i:=a_j\oplus a_i\)。由于操作不改变线性基的秩,因此能够将 \(a\) 变成 \(b\) 当且仅当 \(\{a\},\{b\}\) 秩相等且能够生成的线性空间完全一样。复杂度 \(O(n\sqrt{n}/w)\)。
[AGC059D] Distinct Elements on Subsegments
考虑相邻的变化,若是从 \(x\to x+1\),则说明 \([l+1,l+k-1]\) 内部仅存在 \(a_l\) 而不存在 \(a_{l+k}\);若是从 \(x\to x-1\) 则说明存在 \(a_{l+k}\) 不存在 \(a_l\);若是 \(x\to x\) 则有两种情况:要么 \(a_l,a_{l+k}\) 同时存在,要么同时不存在。
不妨先假设不存在第三种情况。“不存在”的限制是容易满足的,只要新开一种颜色即可;而“存在”的限制相对困难。所以钦定一些 \((x,y)\) 对满足 \(a_x=a_y\)。也就是一些匹配。设 \(L\) 是 \([l+1,l+k-1]\) 存在 \(a_l\) 的 \(l\) 组成的集合,\(R\) 是 \([r-k+1,r-1]\) 中存在 \(a_r\) 的 \(r\) 组成的集合,则 \(x\in L\) 能够匹配 \(y\in R\) 当且仅当 \(x<y<x+k\)。一个必然要满足的限制是 \(|L|=|R|\),最优策略当然是依次匹配。
现在考虑第三种情况,也就是有两种选择:同时往 \(L\) 加入 \(l\)、往 \(R\) 加入 \(l+k\) 或否。注意到若 \(b_i=k\) 则必须选择第二种,否则选择加入一定是不劣的。
[AGC057D] Sum Avoidance
设 \(n=[\frac{S-1}2]\),则
引理 1: \(|A|=n\)。
引理 2: 设 \(1\le s\le n\),\(s\in A\) 和 \(n-s\in A\) 恰好成立其一。
引理 3: 令 \(B=A\cap [1,n]\),\(a,b\in B,a+b\le n\),则 \(a+b\in B\)。
引理 4: 若 \(B\) 合法(满足 引理 3),则对应的 \(A\) 也合法。
从小到大枚举 \(i=1,..,n\),若 \(B\) 中已有元素可以得到 \(i\) 或加入 \(i\) 后仍然不能凑出 \(S\) 则将 \(i\) 加入集合 \(B\) 中。
现在的问题变为优化上述步骤。这个很类似同余最短路。首先第一个被加入的数就是使 \(d|n\) 不满足的最小的 \(d\),这样的 \(d\) 不会很大,具体地 \(d\le 50\)。按照模 \(d\) 分类,对于第一种情况下加入的数不会超过 \(d\) 个,找到这些数,维护一个同余最短路状物即可。最后利用同于最短路的 dp 数组二分找集合中的第 \(k\) 小。
Median Replace Hard
手玩几种情况发现都存在一个简单的 dp,而 dp 的本质是一个能接受所有状态的 DFN!所以大胆猜测所有情况下一定存在一个 \(O(1)\) 大小的 DFN。
考虑如何爆搜,我们设置一个阈值 \(L=10\)。我们认为两个状态 \(s,t\) 等价当且仅当任意一个 \(|w|\le L\) 的 \(w\) 对于 \(s+w\) 和 \(t+w\) 的合法性相同。用 bfs 的方式从已有状态中扩展得到新的状态即可。伪代码如下:
queue<int> Q;
Q.push(初始状态);
while(!Q.empty()){
当前状态=Q.front();
Q.pop();
令后继状态=当前状态+0/1;
若后继状态与某个已有状态等价则无事发生
否则 Q.push(后继状态);
}
预处理 DFN 之后就可以进行 \(O(n|S|)\) 的 dp 了,经过打表 \(|S|\) 最大在二三十左右。
2077D - Maximum Polygon
没做出来,太菜了。
一个必须要记住的结论是任意大于 \(O(\log V)\) 个点必能构成一个多边形(三角形)。
枚举最大值,然后考虑一个贪心。从前往后,维护一个子序列,判断能否删除末尾的几个元素使得加入 \([i,n]\) 仍然合法,最后把 \(i\) 加入子序列。这样是 \(O(n^2)\) 的。
注意到,如果最大值不存在于最大的 \(O(\log V)\) 个点中则一定不优。因为仅有前 \(O(\log V)\) 个点已经能构成一个多边形。
2077E - Another Folding Strip
考虑一个贪心,从前往后,记录两个变量 \(x,y\),分别表示奇数和偶数末尾的数量。每次到 \(i\) 将 \(\max(0,x-a_i)\to x,y+a_i\to y\) 然后 swap(x,y)。答案是 \(x+y\)。
注意到 \(x\) 和 \(y\) 是独立的,可以分别计算 \(\sum x\) 和 \(\sum y\)。稍微改写一下形式变成了最大后缀和,也就是 \(s_r-\min s[l-1,r]\)。拆成两项 \(s_r\) 和 \(-\min s[l,r]\),使用单调栈维护。
H. Kevin and Strange Operation
好题。
任意一个数在经过若干次操作之后,会变成的是以它开始的一段区间的 max。想象有两个集合 \(L,R\) 分别表示 \(l_i\) 延申到了 \(r_i\)。那么一次操作就是选择一个位置 \(p\),从 \(L\) 中删去 \(p\),删掉 \(R\) 的第一个元素。
容易发现,最后得到的 \(R\) 一定是 \(n,n-1,n-2,...\)。而 \(L\) 我们可以任选。设 \(f_{i,j}\) 表示 \(i\) 匹配的是 \(j\)。从 \(f_{i,*}\) 转移到 \(f_{i-1,*}\)。可以用线段树维护整个 \(f_{i,*}\) 序列,或者更简便的实现可以使用树状数组,利用单调性可以继续优化至线性。
2057E2 - Another Exercise on Graphs (hard version)
做了很久。
结论是只有最小生成树上的边是有用的,边数从 \(O(n^2)\) 降低为 \(O(n)\)。
CF2089D Conditional Operators
分讨题,但是 Median Replace Hard。
考虑这题是 Median Replace Hard 的一种特例情况,所以套用上面的做法即可。
D. Flower-like Pseudotree
既然不能有自环,那我们就造一个二元环。
CF2115E Gellyfish and Mayflower
Secret Message
数竞题。
构造 5 种答案,使得总和为 \(s+p\)。
那么想到五染色,选择包含这种颜色的所有点,另外将不能被这种颜色包含的点纳入集合,可以发现总和恰为 \(s+p\),于是总是存在一个 \(\le 1/5 (s+p)\)。
AND x OR
充要条件:\(a\) 序列和 \(b\) 序列完全相同,或者存在 \(i\ne j,b_i\subseteq b_j\)。
必要性:
考虑最后一次操作,必然有 \(x\subseteq b_j\),\(b_i\subseteq x\)。
充分性:
无论初始时 \(a_i,a_j\) 如何,都可以使用如下方式将 \(a_i\) 变为 \(b_i\),将 \(a_j\) 变为 \(b_j\):
- \(f(a_i,a_j,2^{30}-1)\)。
- \(f(a_i,a_j,0)\)。
- \(f(a_i,a_j,b_i)\)。
- \(f(a_j,a_i,b_j)\)。

浙公网安备 33010602011771号