2023.1.3 营业日志
CF1500D Tiles for Bathroom
Description
给定一个 \(n\times n\) 的正方形,对于所有正整数 \(k\leq n\),求出有多少个 \(k\times k\) 的正方形颜色数不超过 \(q\)。\(q\leq 10\)。
Solution
好久之前做的题了,感觉忘了,来补个档。
考虑枚举右下角,只要求出 \(f_{i,j}\) 表示 \((i,j)\) 为右下角的正方形边长最多是多少,就可以求出原问题。
考虑二分,每次考虑以 \((i,j)\) 为右下角,边长为 \(k\) 的正方形有几种颜色。直接数不是很好做,可以考虑格子 \((x,y)\) 对 \((i,j)\) 的贡献。有贡献的条件是 \(\max(|i-x|,|j-y|)\leq k\),换句话说,两格子之间的切比雪夫距离不超过 \(k\)。问题转化为与 \((i,j)\) 切比雪夫距离不超过 \(k\) 的颜色有多少个。由于颜色数比较小,所以可以考虑存储与 \((i,j)\) 切比雪夫距离最近的 \(q\) 种颜色。
此问题上切比雪夫距离没有优势,考虑转成曼哈顿距离处理,相当于将坐标系旋转了 \(45\) 度。所以现在只需要求出左上和右上的曼哈顿距离最近的的 \(q\) 种颜色即可,可以利用 \((i-1,j-1)\) 和 \((i-1,j+1)\) 两个格子递推归并得到。
启示:切比雪夫距离转曼哈顿距离,相当于一种正方形数点的方式吧。这题也为二维数颜色问题拓宽了一个思路,存储“最近”的几种颜色,虽然使用的场景比较有限。
P5311 [Ynoi2011] 成都七中
Description
给定一棵 \(n\) 个点的树,\(m\) 次询问如果只保留 \([l,r]\) 内的边,那么 \(x\) 所在的联通块的颜色数有多少。
Analysis
暴力就是每次大力求出保留的点然后求颜色数量,复杂度 \(\mathcal{O}(n^2)\)。
考虑 \(l=1\) 的情况。那么可以使用扫描线,每次加入一个点并维护联通块颜色数,这个可以用线段树合并。
考虑加上下界怎么做,假设我们加入 \([1,r]\) 的点,那么 \(x\) 和 \(y\) 可达的条件就是它们之间的路径编号最小值不小于 \(l\),想到 kruskal 重构树,如果能够每次动态维护每个联通块的 kruskal 重构树,那么问题就转化为了区间数颜色问题。但是观察 kruskal 重构树的形态变化,并没有找到什么很好的性质,也没有什么类似 \(\mathcal{O}(\min(x,y))\) 合并的方法。
此时发现我并不会做颜色互不相同的情况,但是联通块的一个性质是,只要随便找到 \(x\) 联通块内的一个点,那么询问是等价的。考虑点分治,对于一组询问,如果当前分治中心在它的联通块内,那么询问挂在分治中心上也是可以的。所以考虑查询分治中心点数怎么做。发现如果求出一个点 \(x\) 到根的路径上的最小值和最大值 \(L_x,R_x\),那么合法的条件就是 \(L_x,R_x\in[l,r]\),典型的二维数点,扫描线就好了。
换到数颜色,二维数颜色看起来不是很友好的样子,但是仔细分析一下问题的结构,发现二维数颜色只是从矩形加变成了某种颜色矩形覆盖而已。于是扫描线一下,然后求出某种颜色当前的 \(L_x\) 最大值,每次更新的时候保证贡献不相交就好了。复杂度 \(\mathcal{O}(n\log^2 n)\)。
Solution
怎么大家都写点分树。
启示:数颜色问题可以看作是矩形覆盖。另外树上联通块问题可以考虑点分治,每次求出跨过分治中心的联通块答案,这和求路径答案的思想也是类似的。
CF1774F2 Magician and Pigs (Hard Version)
Description
维护多重集 \(S\),支持下面三种操作:
- 往 \(S\) 中加入一个数 \(x\)。
- 将 \(S\) 中所有的数都减去 \(x\)。
- 将之前已经进行过的操作重复一遍。
求最后 \(S\) 中非负数的个数。
Analysis
一个月前我 vp 的时候还不会这题来着。
先转化一下。假设 \(f_{i,j}\) 表示第 \(i\) 次操作 \(j\) 的个数,\(g_i\) 表示前 \(i\) 次操作减法总和,那么将三种操作写成有关 \(f\) 的转移:
- 操作 \(1\):\(f_{i-1,x}+1\to f_{i,x}\)。
- 操作 \(2\):\(f_{i-1,j}\to f_{i,j-x},g_i=g_{i-1}+x\)。
- 操作 \(3\):\(f_{i-1,j}\to f_{i,j},f_{i-1,j}\to f_{i,j-g_{i-1}},g_i=2g_{i-1}\)。
观察可以发现有意义的操作 \(3\) 其实只有 \(\mathcal{O}(\log V)\) 次,每次暴力重构数组可以通过 F1。
F2 需要进一步的观察,根据转移抽象原问题:对于一个数,它在操作 \(2\) 固定会被减去一个数,操作三可以选择是否减,问最后大于 \(0\) 的方案数。发现操作三有 \(g_x\geq 2g_y\),容易联想到从高位往低位贪心的想法,进一步想到,如果一个较大的 \(g_x\) 可以减但是没有减,后面就可以随便选,方案数加上 \(2^{c}\)。发现这个性质就随便做了。
P3526 [POI2011]OKR-Periodicity
Description
构造长度为 \(n\) 的 \(01\) 串 \(s\),使得 \(\text{per}(s)=T\),其中 \(T\) 为给定集合,\(\text{per}(s)\) 表示 \(s\) 的所有周期。
Analysis
破防了,根本不会。
发现周期集合恰好是 \(T\) 这个条件非常烦人,直接构造的话比较困难,考虑归纳构造。假设 \(s\) 存在不超过 \(n/2\) 的周期(以下简称短周期),那么剩下的大部分周期都是最短周期的倍数,如果它的所有倍数恰等于原集合,那么可以构造一个只有末尾是 \(1\) 的串,然后就做完了。比较麻烦的点在于,如果存在不为它倍数的长周期,那么问题有点大。长周期对应了短 border,如果短 border 长度不超过短周期长度,那么可以直接构造短周期,限制为短周期也有相应的 border。然后我们成功将问题规约到了更小的规模。
看起来形式一片大好,但是发现有些串可能根本没有短 border。如果全都是长 border 怎么做呢。转化方法比较少,考虑观察一些性质。但是发现根本观察不出来性质。
沿用原来的归纳已经不可行,考虑一些新的归纳。但是发现根本没有什么可行的归纳,我尝试的归纳要么限制过于复杂要么干脆就是错的。
Solution
https://www.cnblogs.com/yllcm/p/17024329.html
有序的分类讨论和我的无序的性质寻找形成鲜明对比。

浙公网安备 33010602011771号