(非)人类题选做(2)
[ARC193C] Grid Coloring 3
个人差很大的题,想了很久根本不会处理算重。
先变成倒着染色,处理算重的方法是考虑判定一个局面是否可以被生成,一个合法的局面唯一对应了一个生成的过程。
对于当前局面,我们假设同色行的集合为 \(S\),同色列的集合为 \(T\)。删去所有 \(S\) 中的行和 \(T\) 中的列,然后递归下去,如果最后被删空说明可以被生成。
每一种局面双射了一个删除的过程。
对其进行容斥,钦定 \(S'\) 的行同色,\(T'\) 中的列同色,若 \(S',T'\) 都不为空贡献为 \(C\),否则贡献为 \(C^{|S'|+|T'|}\)。
现在我们要配一个容斥系数,使得每一对 \((S,T)\) 只会被计算恰好一次,且 \((\emptyset,\emptyset)\) 被计算了 \(0\) 次。
经过尝试发现 \((-1)^{|S'|+|T'|+1}\) 是一个合理的容斥系数。
[AGC069D] Tree and Intervals
下文中使用 \(S\) 代替题面中的 \(x\) 序列。
看题解得到了第一步转化:将 \(\le i\) 的点染黑,\(S_i=\) 同色的黑连通块数 \(+\) 同色的白连通块数 \(-1\)。
考虑不断染黑的过程,设当前黑色连通块数为 \(x\),白色连通块数为 \(y\)。增加 \(i\) 号点后黑块数变为 \(x'\),白块数变为 \(y'\)。
显然 \(x'\le x+1,y\le y'+1\)。
另外可以发现不可能同时有 \(x'=x+1\) 且 \(y=y'+1\)。
考虑 \(i\) 号点周围的邻居中有 \(p\) 个黑点 \(q\) 个白点。染黑 \(i\) 号点后黑块数增加了 \(1-p\),白块数增加了 \(q-1\)。
显然当 \(n>1\) 时不可能有 \(p=q=0\),这也说明了为什么不能同时加一减一。
进一步地,考虑 \(p+q=\deg u\),由于开始时 \(x=0,y=1\) 结束时 \(x=1,y=0\),因此 \(\sum p+q=\sum\deg u=n-1\) 成立,且上面保证了 \(\deg u\ne 0\),可以想象一定可以连成一棵树,猜测这是充要条件。
现在考虑如何判定是否存在上述 \(x\) 和 \(y\) 序列。
假设 \(S_{i-1}=a\),\(S_i=b\)。当 \(a\ne b\) 时,对于 \(x'\) 要求 \(1\le x'\le \min(n,x+1)\);对于 \(y'\) 要求 \(\max(1,y-1)\le y'\le n\),也就是 \(\max(1,a-x)\le b-x'\le n\),即 \(x'\le b-a+x\)。当 \(a=b\) 时,由于不能同时顶到界,要求 \(x'\le x\),\(y'\ge y\)。
容易发现 \(x'\) 的可行范围是一段 \([1,j]\) 的区间,因此记录最大值 \(j\) 即可。
\(f_{i,j,a}\) 表示染色 \([1,i]\),黑块数目最多是 \(j\),总连通块数目为 \(a\),枚举 \(b\) 转移复杂度 \(O(n^4)\)。使用一些二维差分可以到 \(O(n^3)\)。
CF1043G Speckled Band
如何单次 \(O(\sqrt n)\) 查询一个子串 \(s[p,q]\) 的最短 border:
设最短 border 长度为 \(l\),\(B=[\sqrt n]+1\)。
枚举 \(l\le B\) 判断。对于 \(l>B\),可以证明其在整个串中的出现次数不会多于 \(B\),因此枚举后缀数组中 \(l\) 周围的 \(B\) 个点即可。
证明如下:
假设出现次数超过了 \(B\) 次,说明一定存在重叠,也就是它成为了一个子串 \(t\) 的长度大于一半的 border。在这种情况下,\(t\) 一定还会存在更短的 border,也就是 \(s[p,q]\) 存在更短的 border,这也就导出了矛盾。
如何求出以每个位置开始的最短 AA 串:
枚举 AA 串的长度 \(l\),找到所有长度为 \(l\) 的 AA 串。
每隔 \(l\) 个撒一个关键点,一个长度为 \(l\) AA 串一定跨过了相邻两个关键点。从相邻两个关键点同时向前和向后扩展,求出最长能扩展的长度,每一组内的所有的 AA 串可以表示为一个区间的形式。
如何 \(O(d(n))\) 求出一个子串的所有整周期:
\(O(d(n))\) 求。
蚂蚁
考虑一个等价的随机过程,每次从摸牌堆中摸牌,如果摸到的牌已经有了 \(b_i\) 张就将其放入弃牌堆,不再重复摸牌。设摸牌堆中有 \(j\) 张牌,弃牌堆中有 \(k\) 张牌,摸牌一次的期望时间为 \(\frac{M-k}{M-j-k}\)。
由于期望的线性性,我们求出每一个 \(\frac{M-k}{M-j-k}\) 发生的概率。对于每一个局面,只和 \(j\) 和 \(k\) 有关,而与摸牌的顺序无关。所以对牌做背包,设 \(f_{i,j,k}\),讨论一下第 \(i\) 张牌放入了多少张转移,即可做到 \(O(n^3)\)。继续优化可以做到 \(O(n^2)\)。
[AGC067D] Unique Matching
充要条件就是:
- \(l_i\le i\le r_i\)。
- 不存在 \(i<j\) 使得 \(j\le r_i\) 且 \(l_j\le i\)。
从左往右考虑的话是一个前缀单调栈的结构,从右往左考虑就是一些散区间的合并,都不太好 dp。考虑提取 \(r_i\) 的笛卡尔树做 dp 也失败了。
设 \(p_i\) 表示最小的 \(j\) 满足 \(i<j\) 且 \(l_j\le i\)。设 \(f_{l,r}\) 表示区间 \([l,r]\),取出 \(p_k=r+1\) 的最小的 \(k\),然后 \([l,r]\) 就被分成了独立的两段 \([l,k-1]\) 和 \([k+1,r]\)。实际上可以只记区间长度,可能需要添加一维 0/1 来表示 \(l_{r+1}\) 是否已经确定了。
大海的深度
答案是一个三次的式子 \(\sum a_i(i-l_i)(r_i-i)\)。
定期重构,设定阈值 \(B\)。
取出这 \(O(B)\) 个待定的位置,赋值上 \(+\infty\),做单调栈求出 \(l_i\) 和 \(r_i\)。
考虑一次询问的时候,对于 \(O(B)\) 段中的每一段分别考虑,求出段内 \(l_i\) 或 \(r_i\) 可能产生的变化。可能变化的 \(l_i\) 只在段内的前缀最小值处,\(r_i\) 只在后缀最小值处。一个关键的结论是至多有一个位置的 \(l_i\) 和 \(r_i\) 同时发生变化。于是我们可以把一次询问转化为 \(O(B^2)\) 次查询段内 \(\le w\) 的数的权值和。复杂度 \(O(n^2/B+nB^2)\),经过平衡可以得到 \(O(n^{5/3})\)。经过一些平凡的优化可以做到 \(O(n^{3/2})\)。
[POI 2014] HOT-Hotels 加强版
长链剖分离线求出 \(q\) 次询问距离 \(u\) 为 \(d\) 的点数:
先求出子树内的到 \(u\) 的距离为 \(d\) 的点数,这是经典的。
再考虑子树外的部分,
[NOI2024] 登山
困难题。
[NOI2023] 字符串
把所有前缀和后缀放在一起排序,然后考虑一对 \((i,j)\) 合法的充要条件:
容斥掉最后一个限制,剩下的部分是一个二维偏序。
[AGC068C] Ball Redistribution
建图,连接 \(i\to a_i\) 构成基环内向森林。
由于是给定结束状态判定是否有初始状态,所以倒着做,判定能否成功。
非常大胆地猜测充要条件是不存在一个点 \(u\) 的一个子树所有点标号都 \(<u\)。考虑最优策略下每个点就是要断自己的那个环,因为别人的环可以留给别人来断。
简单而美丽的结论。

浙公网安备 33010602011771号