2026暑期复健
这篇博客拿来记录一下这次复健遇到的有意思的题
Codeforces Round 1106 (Div. 2)
D
我们把 n 素因子分解, 假定有 k 个素因子, 那么就可以把数 n 及其因子看成 k 维的向量, 之后题目的塔状限制使得我们可以猜测除了每个素因子要单独开一层以外, 剩下的向量可以以各维之和来分类, 各维之和可以放在一起的原因是变化是连续的.
E
这种通过决策使得对面最大决策最小的就是典型的DDP, 先考虑给对面设计一个从左到右的状态, DPi,j,k 表示从前往后决策, 第一个决策量是 i 且第二个决策量是 j 的前提下, 值最大能到多少.
之后朴素的方法是设计 DDPi,x,y,z 表示是否存在 DPi,x,y=z 的决策, 而我们希望在固定了 xy 后 z 这个值最小, 并且这个 DDP 具有最优子结构所以可以优化为 DDPi,x,y 表示最小的 z 使得存在 DPi,x,y=z 的决策, 之后就是直接 O(1) 转移可以得到 O(n3) 的算法了.
Codeforces Round 1105 (Div. 2)
C
需要猜结论: 先手必输当且仅当至多只有一堆非空石头. 遗憾的是我擅长证明而不擅长猜测.
D
只要观察出来我们可以把每个人给礼物/不给礼物对答案造成的贡献给独立出来, 而不去依赖其他人是否给礼物即可.
E
小构思, 我们考虑从后往前确定每一个数字, 对于我们遇到的第一个 s 位置 a , 并且假定 a 的前一个 s 的位置为 b , 之后我们规定一下的记号:
- A 表示 b 前的已知部分
- B 表示 b 前(包括b) 的未知部分
- C 表示 a,b 之间的部分(当然是已知的)
那么有 sa-sb=(a,C)+(a,B)+(a,A)+(C,C)+(C,B)+(C,A) , 只要我们确定了 (a,C)+(a,B)+(a,A) 的值, 我们就可以知道 a 应该填多少了, 为此我们可以直接减去 (C,C) 和 (C,A) , 关键是怎么计算 (C,B) 呢. 事实上, 由于 a 是最后一个未知的位置, 所以我们可以知道 a+A+B+C 是哪些数, 之后只要我们确定了 a 的值, 我们就可以知道 B 是哪些数(尽管我们并不知道它们内部的顺序, 但是这对于计算(C,B)而言并不重要!) , 因此就可以来计算了. 这个过程是关于 a 的大小单调的, 因此可以用一个数据结构+二分来确定 a 是多少, 之后 a 就是已知的值了, 于是我们可以递归地去解决 b 了.
F
这是我第一次见到把两类条件放在一起容斥的, 假定图有 N 个点, 那么题目是求有多少个函数图满足:
- 所有零入度的点都小于等于 M
- 所有简单环都存在至少一个小于等于 M 的点
考虑容斥, 令 fi,j 表示恰好有 i 个大于 M 的零入度点且恰好 j 个所有点都大于 M 的简单环的函数图的数量, 令 gi,j 表示至少...且至少...的函数图的数量(即我们钦定若干个大于M的零入度点和若干个大于M的简单环后, 剩下的随意选出边). 那么根据我们的计数方法, 我们有
那么我们就有
具体证明的方法是通过固定一个变量然后应用单一变量的容斥形式.
Order Capital Round 2 (Codeforces Round 1104, Div. 1 + Div. 2)
这场纯狗屎
Codeforces Round 1103 (Div. 3)
中规中矩, 没啥很有意思的题
Educational Codeforces Round 191 (Rated for Div. 2)
E2
这个题算是巧妙的对称性的题目, 因为我们只能交换行, 所以实际上我们不用特别去关心每一列有多少个 1 这一类问题, 我们把每列看成一个向量 a , 那么对于任何的交换操作 ()' 以及任意的 i,j 有 ai=aj iff a'i =a'j , 因此我们还需要保证不存在两个一样的向量.
之后我们就判断一个向量序列是不是排列这个方向就没有什么比较了, 所以我们尝试从一个排列出发来看看能够得到哪些向量序列, 然后就会惊奇地发现如果某两行的 1 的个数是一样的, 那么交换这两行得到的向量序列仍然是排列. 具体的证明如下
假定是交换第 i 行与第 j 行(i<j), 那么我们只需要去证明第 i 行为 1 且第 j 行为 0 的数 x 经过交换后仍然是这个排列中的数. 注意使用第 i 行的 1 的个数和第 j 行一样多, 具体的, 由于排列第 i 行的 1 随排列长度增长的规律是先 2i 个 0 之后 2i 个 1 之后 2^i 个 0 再之后 2i 个 1... , 所以可以得到 -2i<(n mod 2j+1) <2i , 从而可知 n 其实是足够大以容纳对 x 交换后得到的数的.
因此在满足每一列向量都互不相等的前提下, 只要每行的 1 的个数和排列的那一行的 1 的个数相等, 那么这就是一个排列, 于是我们只需要确认数量是正确的前提下, 把行按照 1 的个数分组, 每组任意排列即可.

浙公网安备 33010602011771号