Codeforces 泛做
CF506E
建出自动机后矩阵快速幂,将相同的路径压在一起,奇回文串特判
CF1188D
考虑最后所有数都变成了 $ x $,第 $ i $ 个数要被加的次数就是 popcount($ x - a_i $),将所有 $ a_i $ 变成 $ max{a} - a_i $,按位 dp,进位情况只有 $ n + 1 $ 种
CF1188E
如果一个串可以一直进行操作称为好串,坏串的方案是好算的,枚举一个操作次数即可,好串能变成的串 $ b $ 和原串 $ a $ 一定满足所有 $ a_i - b_i $ 在 mod 串长意义下相同,可以通过把两个串的极差都变的小于串长来证明,枚举 $ a_i - b_i $ mod 串长的值,组合数计算
CF521D
把 assign 操作变成 add 操作,操作顺序一定是 assign, add, multiply,直接贪心
CF521E
提取出原树任意一颗生成树,如果有一条边被不在生成树上的边覆盖至少两次就可以构造
CF526G
将问题传化成选至多 $ 2y $ 个叶子且 $ x $ 要在这些点的连通块中,容易发现直径端点至少会被选中一个,剩下可以选 $ 2y - 2 $ 个任意的点,再选一个点使得 $ x $ 在连通块中,分类讨论一下
CF843D
容易发现最短路增量小于等于选的边的数量,因此值域很小,开值域个 queue 可以去掉堆的 log
CF923E
hy 说可以有理函数展开
CF1396E
考虑最大匹配显然是以重心为根,所有点的 dep 之和,每个点都走到重心再匹配,令当前答案为最大匹配,每次找两个点匹配使他们不走到重心,答案会减少两个点 lca 的深度,简单构造一下
CF1236F
仙人掌连通块 = 点 - 边 + 简单环,暴力拆式子,算点的个数的平方的期望相当于求点对同时出现的概率,其余也可以用类似的方法计算
CF1396D
枚举 x1 后从大到小枚举 x2,用线段树维护对于每个 y1 最小的合法 y2 的位置,容易发现 y2 的位置是单调的
CF538G
将坐标 $ (x, y) $ 变成 $ (x + y, x - y) $ 可以把两维坐标独立,在 mod l 意义下相邻的两个时间计算进行 $ l $ 次操作后的位移量的限制,注意上下取整
CF516E
首先可以转换为 n 和 m 互质的情况,考虑两个指针分别在 x 和 y 且两个位置此时均为 1,经过 n 轮后会让第二个指针前进 $ n \bmod m $ 步,经过 m 轮会让第一个指针前进 $ m \bmod n $ 步,串成一个环后对每个 1 计算一下,特判很恶心
CF566C
用 $ ans_i $ 表示以 i 为根的答案,以带权重心为根,每一条向下的路径的 $ ans $ 都不递减,任何一个点只有一个相邻的点的 $ ans $ 会小于它,点分治求出导数最大的子树判一判
CF566E
判掉菊花的情况,如果存在两个点距离为 $ 3 $,他们集合的交大小一定为 $ 2 $,在这两个点之间连一条边,只有叶子没被连边,判掉连的边的条数只有一条的情况,剩余就是找到叶子接在哪个点上,这个只要看某个集合和非叶子点的交就行了,关键是要高效判断一个集合是不是叶子的集合,我们可以把这个集合的非叶子集合和叶子集合分开,如果存在一个集合只包含部分叶子集合内的点,或者包含所有叶子集合内的点不包含整个集合,这个集合就不是叶子的集合,用 bitset 实现
CF771E hacked
用 $ f_{i, j} $ 表示第一行前 $ i $ 个可以选,第二行前 $ j $ 个可以选的时候的最大权值,容易发现状态数只有 $ O(n) $ 个
CF1392H
容易发现抽到一张 joker 的期望次数是 $ \frac{n}{m+1} + 1 $,我们只要算出期望要抽几张 joker 即可
考虑每次抽一张 joker 的过程,相当于把 $ n + m $ 张牌随机排列,第一张 joker 和之前的牌都会被抽一次,一个集合 $ S $ 不被抽到的概率是 $ \frac{m}{|S| + m} $,相当于把这个集合和 $ m $ 张 joker 重排,第一张是 joker 的概率,考虑抽了 $ k $ 张还没抽完的概率是
相当于枚举一个集合大小 $ i $ 后容斥算贡献,期望张数就是对每个 $ k $ 都计算一下后加起来
CF1012F
用 $ f_i $ 表示当前已经办好了 $ i $ 这个集合的护照的最小时间,直接转移(题解貌似是 $ 2^n \cdot n $ 的,写了 $ 2^n \cdot n^2 $ 卡了半天常
CF983D
离散化扫描线,对线段树每个区间维护一个 $ mx $ 表示当前区间内最大的还没被算进答案里的中最晚出现的矩形,维护一个 $ lim $ 是当前这个区间在什么时候被已经算进答案里的矩形完全覆盖,如果 $ mx < lim $ 则当前区间的矩形被完全覆盖,要将 $ mx $ 赋值为 $ 0 $,update 的时候 $ mx $ 是两个孩子的 max,$ lim $ 是两个孩子的 min
CF512D
容易发现要进行计数的序列是拓扑序,把图缩点后变成树,树上拓扑序计数是经典问题,如果一个连通块是一棵树就以每个点为根算一算,最后除一个根的方案数的贡献,如果连通块内有环就随便选一个环缩成的点为根,最后卷起来
CF571D
如果只有 U 操作和 A 操作是好搞的,建出操作树后 dfs 就行了,但是现在多了一个将集合内的数修改为 0 的操作,其实只要对每个询问处理出上一次被修改为 0 的时间即可,建两个操作树
CF547E
建 ac 自动机后算某个串在 $ s_1, s_2 \cdots s_i $ 中的出现次数即可
CF917D
link
也可以把给定的树的边的边权设为 x,其余的边的边权设为 1,求出来的行列式的 $ x^k $ 项就是选 k 条重复的边的方案数,求点值后高斯消元可以做到 $ n^4 $
CF1270I
首先将下标从 $ [1, 2^k] $ 变为 $ [0, 2^k-1] $
定义矩阵乘法 $ A = B \times C $ 其中 $ A_{i, j} = \bigotimes_{x=0}{2k-1}\bigotimes_{y=0}{2k-1} B_{x, y} \cdot C{i-x, j-y} $
令 $ F_{i, j} $ 表示 $ (i, j) $ 这个格子在不在给定的 t 个格子中,在为 1 不在为 0,令 A 为最开始给你的矩阵,我们需要找到矩阵 G 使得 $ F \times G = A $ 且 G 中非零位置尽可能少
经过一些推导可以得到 $ F{2k} $ 为单位元,因此 $ G = A \times F^{-1}, F^{-1} = F{2k-1} $, 我们还可以发现 $ F{2x} $ 中只有 $ t $ 个位置有值,因此可以将单次矩阵乘法优化到 $ t \times 2^{2k} $,要进行 $ k $ 次矩乘,可以通过此题
CF1320E
虚树上跑 dij
CF1078E
link
CF1078D
处理出以 i 开始经过 $ 2^k $ 步能走到的区间,开 log 个 st 表即可
CF587E
建出 ac 自动机,对串长根号分治
CF639F-鸽
虚树上跑 tarjan
CF913H
被 Sooke 教导了一番才会
维护分段函数,最多有 $ n^2 $ 段,用面积表示概率
对分段函数再次进行积分貌似可以做到 $ O(n^4) $ 的复杂度
CF704E
首先树剖转成序列上的问题,如果答案比 t 大,在 t 时刻之前点的位置的相对顺序一定不会发生改变,维护相邻的点算一算就行了
CF913G
假设 a 有 n 位,枚举 a 前面有几个数 m,有式子 $ x = a * 10^m + b (mod\ 10^{n+m}), 2^{n+m}\mid x,5\nmid x $,容易发现当 $ 2^{n+m+1} \le 10^m $ 的时候一定可以找到合法的 b,因为 2 是 $ 5^p $ 的原根,构造一下就行了
CF1336F
讨论链并的两个端点是否是祖孙关系,用线段树合并在 dfs 序较大处计数
CF605E
倒着 dij
CF613E
容易发现答案一定是一个 $ \subset $ 形和一个 $ \supset $ 形拼起来,中间填一条从左到右的链,可以 dp 出答案,然后把第二个串反过来再做一遍,很多很多的特判,如果第二个串的串长很小我们可以爆搜减少讨论
CF611H
串长最大为 6,先把相同串长的连边连上,每个串长选一个"关键点",容易发现可以构造不存在两个非关键点相连的方案,枚举生成树后跑网络流
CF1307G
给每条边添加一个流量 1,跑费用流,每次增广跑出来的东西是一个最小割,如果要使最短路增加 x 可以把最小割中每条边都加 x,存起来查询时二分
CF611G-鸽
凸包面积就是选个基准向量,剩下的相邻向量叉一叉,按顺序枚举基准向量,容易发现使得分割面积小于等于一半的向量的单调的,随便维护下
CF1416E
平衡树优化 dp,貌似可以直接用 set 搞,手写 fhq 卡了半天才过去
CF1276F
只要考虑怎么高效求 * 左右都有字符的方案数,枚举 * 左边的串,容易发现 endpos 集合相同的左边的串对应的方案数也是相同的,假设当前左边串的 endpos 集合是 {1, 3, 5},右边的串就可以从 {3, 5, 7} 开头从串中选,容易发现是反串的 parent 树上的链并,set 启发式合并维护
CF883D
二分答案,我们可以给每个 P 定一个方向,从左往右扫,如果最后一个 P 是右的,我们只需要贪心的选一个没被吃掉的 * 最靠右的情况,如果最后一个 P 是往左的,之后的 P 再向左是不会对当前局面造成影响的,因此只需要贪心的选一个最后一个向右指的 P 的位置最靠右的情况,直接 dp
CF603E-鸽
容易发现答案肯定是不增的,我们连完边后只能存在偶数大小的连通块,否则总度数之和是奇数,如果连通块是一颗树,把所有两端点的子树大小为奇数的边选在边集内是唯一的方案,容易发现最优方案一定会存在于最小生成树中,用 lct 维护最小生成树,由于答案不增,从大到小枚举当前的边看看子树两边是不是都是偶数,如果是就删掉,可以用 lct 维护子树大小来搞,复杂度是单 log 的
CF1083F
转换为使差分数组全变成 0,把 % k 相同的位置提出来,容易发现要求前缀异或和为 0 的个数,分块维护
CF1163F
随便找一条最短路,对不在最短路树上的边算一下两个端点沿着最短路树跑到的节点,删掉两个节点中间的边的权值可以对经过这条边的答案取 max,就可以求删掉一条边后的最短路长度了
CF671D
转换为对偶问题后用可并堆贪心
CF1205F
简单分析一下析合树的性质,我们可以发现连续段个数就是析合树节点个数加上合点所产生的额外连续段个数,合点的儿子数量不能为 $ 1 $,析点的儿子数量要大于等于 $ 4 $,容易发现满足这个性质的析合树都可以构造出对应的排列,dp 一下即可
CF1427G
填的每个数都是输入的某个数,我们可以用一个 $ \texttt{01} $ 串来表示一个数,第 $ i $ 位为 $ 1 $ 表示这个数大于等于输入的第 $ i $ 小的数,容易发现这个 $ \texttt{01} $ 串一定只有一段前缀是 $ 1 $,剩下的都是 $ 0 $。我们假设我们填进去的数不用满足这个条件,考虑第 $ i $ 位造成的贡献,就是相邻的两个数这一位不同的对数,容易发现这是最小割。从第 $ 1 $ 位往上推,每次退流后重新跑网络流,复杂度是四次方的,可以感性证明不会出现一个数填的时候不会出现 $ 010 $ 的情况(严谨证明应该也不难,但是懒得证了)。