CF刷题计划?(upd:2023.3.22)
CF刷题计划?
CF750G
巧妙但单薄
不妨先考虑一条祖先-后代链
假设从节点\(x\)开始走,走了\(h\)步
那么首先要加上\((2^{h+1}-1)x\)
然后对于所有的右儿子,贡献为\(2-1,2^2-1,2^3-1\cdots 2^h-1\)
一个重要的观察是,\(x=\lfloor\frac{s}{2^{h+1}-1}\rfloor\)
这是因为假设将\(x\)减去\(1\),那么最大的贡献为\((2^{h+1}-1)(x-1)+\sum_{i=1}^{h}(2^i-1)<s\)
然后剩下的部分可以贪心构造
对于跨过lca的链,
考虑枚举两个深度\(h1,h2\),那么\(x\)同理唯一确定
剩下的部分可以数位dp构造
总复杂度就是\(O(\log^5s)\)
CF838C
所以博弈论就是猜结论归纳猜结论归纳猜结论归纳对吧
令\(a_i\)表示\(i\)的个数,那么排列数为\(\binom{n}{a_1,a_2\cdots a_k}\)
1.如果排列数为偶数,先手必胜
如果此时存在删数会使后手必败就删,否则选择重排
重排后,如果后手选择删字符,上面已经讨论了不存在,所以后手选择重排,也就回到上面的过程
2.如果排列数为奇数,那么当\(2\nmid n\)时先手必胜
由于排列数为奇数,先手只能选择删字符,否则会变为后手必胜
删字符时,我们选择一个\(a\),使得其在\(2\)的分解下次数最小,设为\(k\)
容易发现此时\(2^k|n\),且这样的\(a\)一定存在
同时会发现,这样删数不会是排列数的奇偶性改变,也就证明了上面的结论
于是只要对\(2|n\)且排列数为奇数的情况计数
令\(m=\log_2n\),可以用集合幂级数科技做到\(O(m^22^m)\)
CF889E
令\(f(x,i)=f(x,i-1)\mod a_i\)
观察到只要不让\(x\mod a_i\)变成\(0\),就可以在不变化\(f\)的相对差的情况下,随意让其\(+1\)或\(-1\)
于是我们可以维护一个二元组\((x,y)\),表示最小值为\(x\),相对差之和为\(y\)
每次我们可以让\(x\)直接模上\(a_{i+1}\),或者我们让\(x\)顶到\(a_{i+1}-1\)的上界,然后维护\(y\)的变化
但是二元组的数量可能特别多
再观察:每次取模,值会至少减少到原来的二分之一
所以复杂度降为\(O(n\log n\log a)\)
CF955F
upd:我超,还有线性做法
非常暴力的题目
首先对于给定的\(k\)计算所有\(dp\)值,显然可以做到\(O(n\log k)\)
但是\(k\)的范围特别大,考虑暴力一部分
显然,当\(k>20\)时,\(dp\)值\(\le 4\)
于是可以考虑对这部分计算\(\sum_{i}\sum_j[dp_j\ge i]\)
可以设一个\(f_{i,j}\)表示以\(i\)为根,深度为\(j\)时,最大的合法的\(k\)是多少
\(f_{i,j}\)可以通过二分以及\(f_{son,j-1}\)得到
然后再给子树的\(f\)取个\(\max\)就行了
复杂度\(O(4n\log n+22n\log 22)\)
CF986D
感觉有点粪
可以感性理解,一定只会选\(2\)和\(3\)
进一步,由于\(3^2>2^3\),所以\(2\)的个数\(\le 2\)
于是就变成了用多项式科技计算\(\log_3n\)
需要大量卡常
CF1034E
深入理解子集卷积
直接给第\(i\)位赋一个附加因子\(4^{|i|}\)
然后改卷积为或卷积
那么当\(|i|+|j|>|k|\)时就直接消掉了
于是就是对的
CF1067E
好题
考虑矩阵的秩等于其子式中秩的最大值
不放找出一个邻接矩阵,即原森林的导出子图
显然该图仍然是森林
那么不存在自环,以及长度\(>2\)的环
同时注意到一个\(n\)阶矩阵\(A\),\(\text{rank} A=n\)等价于\(\det A\not =0\)
所以这个矩阵满秩当且仅当其存在最大匹配
所以原矩阵的秩等于森林中最大匹配的两倍
显然可以钦定从叶子往上匹配
于是用\(dp\)算出每个点和儿子匹配的概率就行了
CF1147E
直接从约数乘一些组合数转移可以做到\(O(n\log n)\)
用一些结论精细实现可以做到\(O(n)\)
CF1225G
直接猜推出一个充要条件:
存在解当且仅当存在序列\(b\),使得\(\sum a_ik^{-b_i}=1\)
只证明充分性
令\(B=\max b_i\)
首先证明一下,一定存在至少两个\(i\)的\(b_i=B\)
给两边乘上\(k^B\),即\(\sum a_ik^{B-b_i}=k^B\)
对于右式,\(k|k^B\),对于左式,对于所有\(b_i<B\),都有\(k|k^{B-b_i}\)
同时有\(k\nmid a_i\)
所以如果只有一个\(b_i=B\),那么\(\sum a_ik^{B-b_i}\equiv a_i\mod k\),故矛盾
于是直接合并这两个数,剩下的序列依然满足条件,所以归纳就证明了充分性
然后随便bitset优化\(dp\)算一下就行了
CF1257G
大胆猜
考虑这么一件事,就是设一个\(k\),然后让集合数中指数和为\(k\)
显然满足限制
然后打个表发现\(k\)可以直接取\(\frac{n}{2}\)
于是分治FFT就做完了
证明先咕
CF1270H
太有意思啦
一个重要的观察是:连通块是许多连续段
瞎证明:
设\(i\)和\(j\)联通(\(i<j\))
1.\(a_i<a_j\),显然对于\(k\in[i,j]\),若\(a_k>a_i\)则\(i\)和\(k\)有边,若\(a_k<a_i\)则\(j\)和\(k\)有边
2.\(a_i>a_j\),此时要么有\(a_x<a_j,x<j\),要么有\(a_x>a_i,x>j\),也可以得到类似的结果
于是转化成对\(\min_{1\le i\le p}a_i>\max_{p+1\le i\le n}a_i\)的\(p\)计数
考虑将\(>p\)的看成\(1\),\(\le p\)的看成\(0\)
那么序列必须形如\(111\cdots 100\)
于是我们可以对每种权值统计相邻\(01\)数对的个数
由于统计\(1\)的出现次数比较困难,所以我们令\(a_0=+\infty,a_{n+1}=0\),就可以只统计最小值个数了
CF1285F
太nb了这个题
暴力一点的做法是二分后直接莫反,但是不够快
考虑枚举一个\(\gcd\),令其为\(d\)
然后从大到小枚举数,然后把\(\gcd(\frac{x}{d},\frac{y}{d})=1\)的点对找出来
因为要求最大化,所以如果当前有一组点\(x<z<y\),且\(\gcd(\frac{x}{d},\frac{y}{d})=1\)
那么\(z\)一定可以删去,\(y\)同理
也就是说,这是一个从小到大退栈的过程,而每个数的入栈退栈次数都恰好为\(1\)
为了保证复杂度,需要莫反算出有多少个与当前数互质的数
当然我们可以做得更快
即两个数\(x,y\)一定存在\(a|x,b|y,lcm(a,b)=lcm(x,y),\gcd(a,b)=1\)
于是可以\(O(A\log A)\)
CF1349D
设\(t\)为答案
可以感受到\(E(t)<\infty\),于是考虑停时定理
设\(a_{i,j}\)为\(i\)步后第\(j\)个人的饼干数量
设\(f(i)\)为\(i\)块饼干的势能函数,一个局面\(A_i\)的势能函数\(\Phi(A_i)=\sum f(a_{i,j})\)
令\(m=\sum a_i\)
为了使\(\Phi(A_{p+1})-\Phi(A_p)=-1\),写出方程:
不妨按比例分配为
可以预处理逆元做到\(O(m)\)
CF1408H
从上界入手
设\(0\)的个数为\(w\),那么上界为\(\lfloor\frac{w}{2}\rfloor\)
你考虑这么一件事,就是说,把左边\(0\)的个数\(\ge w\)的放入集合\(S_R\),右边\(0\)的个数\(\ge w\)的放入\(S_L\)
然后对于每种颜色,我们只保留其在\(S_L\)中最靠右,\(S_R\)中最靠左的,记为\(le\)和\(ri\)(容易发现这样最优)
你考虑这么一件事,就是说,用网络流去分配\(0\)
那么\(S\to col\),\(col\to le,ri\),\(le,ri\to i\)(\(a_i=0\)),\(i\to T\)
然后\(S_L\)中\(i\to i-1\),\(S_R\)中\(i\to i+1\)
求最大流不好求,考虑转化成最小割
手玩发现只会割\(i\to T\)和\(S\to col\)
于是我们可以枚举\(S_L\)的一个前缀,然后在线段树上修修改改就做完了
CF1423N
考虑增量,按编号从小到大构造
这是就会发现,题目给了一个给点修改权值的操作
所以可以往变与不变的方向思考
设有\(e:u\to v\)(\(u>v\))
那么可以让\(w_e-1\),\(w_v+1\),或者是\(w_e+1\),\(w_v-1\)
这样可以改变\(u\)而不改变\(v\)
同时\(u\)一共可以有\(d_u+1\)种权值,而其相邻点只有\(d_u\)个
所以一定有解
CF1442E
需要一些观察的题
首先可以把相邻相同颜色缩起来
不妨考虑没有灰色的情况
可能会想到第一次直接删掉所有的白色/黑色
但这样不优
因为对于分出去的连通块,对其内部的操作显然可以提前
归纳一下就得到了一定是每次删一层叶子
所以只需求出最小可能直径
dp就完了
CF1528F
大力拉反的做法先咕了
经典的序列转等概率环模型
考虑有长为\(n\)的序列,第\(i\)个人会占据\(a_i\)的位置,如果位置已经被占,就不停往后走
如果有人无法占到位置,就不合法
可以发现这个问题和原问题中的\(a\)的计数等价
但这个问题还不够明朗
考虑加入\(n+1\)号点,然后序列变为环
可以发现的是,对一个合法序列旋转,可以得到\(n\)个不同的不合法序列
也就是说,我们只需对所有排列计数,然后除上\(n+1\)
最后的问题形如\(\sum_{i=0}^n\binom{n}{i}i^kn^{n-i}\)
其实就是\(k![x^k](e^x+n)^n\),容易Binomial Sum做到线性
CF1548E
连通块的信息量太大,考虑将一个连通块中\(a_i+b_j\)最小的位置标记
相同则按\((i,j)\)关键字排序
记\(pre_i\)表示最大的\(k\)满足\(a_k<a_i\),记\(suf_i\)表示最小的\(k\)满足\(a_i\le a_k\),列同理
首先如果\((i,j)\)被标记,则其不能走到\(pre_i,suf_i\)
但还不够
我们希望\((i,j)\)能走到\(pre_i\)等价于其能走到\((pre_i,j)\)
可以发现,如果从\((i,j)\)出发到达了\((pre_i,k)\),不妨假设\(k<j\)
那么由于\(a_{pre_i,pre_i+1\cdots i-1}\ge a_i\),同时这些位置加上对应的\(b\)小于等于\(x\)
则\(a_{pre_i}+b_{k,k+1\cdots j}\le x\),结论得证
然后可以数据结构维护一下
CF1599J
如果答案序列有一个\(X\),
那么只要存在\(a_i-X\)就能表示出\(a_i\)
但是这样有可能差一个元素
于是考虑是否存在三个元素表示出三个\(a\)
简单解方程可以发现,需要让\(a\)中存在三个数和为偶数
跳过有限步,我们把问题规约到了全是奇数的问题
类似于上面的问题并结合样例
可以考虑找到两个大小和元素和相同的集合
根据鸽巢原理,在\(N\)较大时一定有解,此时可以搜出每种集合
在\(N\)较小时则状压枚举所有情况
CF1603F
当\(x=0\)时,随便算一算就行了
当\(x>0\)时,任意数的方案是一致的
那么秩为\(k\)的基贡献就是\(2^k-1\)
然后就是个\(q-\)二项式系数板子
CF1605F
先考虑怎么判断是不是good
可以每次选出两个相等的数放到序列两侧,然后删掉这两个数,剩下的数删去其和这个数的公共位
如果删到不超过一个数,就是good序列
然后考虑容斥,计数不合法序列
为了防止算重,可以钦定\(0\)在合法序列中
于是设\(f_{i,j}\)表示\(i\)个数,按位或有\(j\)个位且每个数非\(0\)的方案数
设\(g_{i,j}\)表示\(i\)个数,按位或有\(j\)个位的方案数
设\(h_{i,j}\)表示\(i\)个数,按位或有\(j\)个位不合法序列数
于是\(h_{i,j}=\sum_{p,q}\binom{i}{p}\binom{j}{q}2^{(i-p)q}f_{i-p,j-q}(g_{p,q}-h_{p,q})\)
最后要去掉是不合法序列但是是good序列的情况
CF1616G
容易转化为在原图中求出两条不交路径,使得其覆盖整个点集
先特判原本就存在哈密顿路径的情况
直接计数可能会比较困难,因为不好去重
观察一下性质
发现一定会存在至少一个断点\(i\),使得\(i\)和\(i+1\)没有边相连
加入虚点\(0\)和\(n+1\),然后对原序列做\(01\)的染色
钦定\(0\)染为\(0\),\(n+1\)染为\(1\)
可以发现\(0,1\cdots y-1\)都是\(0\),\(x+1,x+2\cdots n+1\)都是\(1\)
不妨找到最左和最右的断点
枚举一个左断点左侧的\(y\),可以发现只有最右断点右边的\(x\)才可能成为答案
直接做是\(O(N^2)\)的,不过我们可以从第一个断点向两侧dp
但是要注意染色可能有两种,稍微处理下细节即可
CF1630F
显然题目给出了一个偏序集
同时,不难发现条件可以转化为不存在长度\(\ge 2\)的链
所以一个点不能同时有入度和出度
将点拆为入度点和出度点\(x,x'\),连边\(x\to x'\)
同时,若存在\((x,y)\),则\(x\to y,x\to y',x'\to y'\)
由于要求删去的点最少,所以就是在这个图中求最大反链
也就是求最小链覆盖,再拆一次点做最大流即可
CF1637H
将数看成平面上的点\((i,p_i)\)
然后有一个结论:
对于\(\forall i<j,p_i>p_j\),若\(i\)被选,\(j\)被选一定不会更劣
证明:
对于原序列中\(j-i\)最小的\(p_i\)被选\(p_j\)未被选的一对点
我们可以考察第一象限中被其划分出的9个区域的贡献
跳过有限步会发现
只有 \(i<k<j\),\(p_k>p_i\)且\(k\)被选 或 \(p_k<p_j\)且\(k\)未被选 的点可能会使调整后逆序对数增多
但是我们钦定的是\(j-i\)最小的一对点,所以上述情况不存在,结论得证
于是贪心选一选就做完了
CF1672G
不妨从行/列的异或和入手
可以发现,其是否改变取决于\(n,m\)的奇偶性
令一次十字操作\((i,j)\)为对所有\(x=i\)或\(y=j\)的点进行操作
当\(n,m\)都为偶时,对\((i,j)\)进行十字操作可以只改变\((i,j)\)的状态
当\(n,m\)其中一个为奇数时,不妨假设\(n\)为奇数
一次操作不会改变列上的异或和
同时,对\((i_1,j),(i_2,j)\)进行十字操作可以只翻转这两个位置的状态
于是证明了其充分必要性
当\(n,m\)为奇数同理
对于答案的计算,前两种是trivial的
对于第三种,不妨枚举最后要使得行/列异或和都为\(k\)
然后对于一个位置\((i,j)\),可以选择翻转/不翻转第\(i\)行以及第\(j\)列的异或和
于是从\(i\)向\(j+n\)连边,然后对每个联通块算答案
通过剥叶子可以发现,一个联通块的方案数就是\(2^{|E|-(|V|-1)}\)
CF1677F
不是很懂为什么比赛时这么少人切
可以发现这是个缝合题
对于第一部分:
对多个\(a_i\)求解\(\sum_{j=1}^{a_i}p^jj^{k}\),显然可以变成\([x^k]k!\frac{1-(pe^x)^{a_i+1}}{1-pe^x}\)
可以观察出多项式形式,多点求值即可
对于第二部分:
对于每个\(i\),求解\(\sum_{l,r}[i\in[l,r]]\sum_{w=l}^r\prod_{t\not =i}([t\not =w]+a_t)\)
维护一些和,简单拆一拆算一算即可
CF1707E
考虑一个nb的结论:
\(f^k(l,r)=\cup_{i=l}^{r-1}f^k(i,i+1)\)
证明:
如果\([l,r]\)和\([L,R]\)有交,那么\(f(l,r)\)和\(f(L,R)\)显然有交
由于有交,所以显然就是区间内的最小值和最大值
至于\(k\)次方可以归纳
然后只要倍增就做完了
CF1710D
从小到大考虑每个好的区间
然后假设连通块的编号是\(1,2\cdots k\)
于是可以\(1\to k\),\(2\to k\),\(3,4,\cdots ,k-1\to 1\)
CF1713F
为了规避一些位置没有初值的问题,我们采用一个牛逼的方法
为了方便,将\(a\)和对角线从右到左标号为\(0,1,2\cdots n-1\)
那么\(a_i\)对对角线的第\(j\)个位置的贡献就是\(\binom{i}{j}\)
于是只需做一次超集和
再做一次子集和就得到了\(b\)
于是从\(b\)推\(a\)只需做一次子集和的逆,以及超集和的逆
CF1720E
记原矩阵含有的不同颜色数为\(cnt\)
显然\(cnt\le k\)时答案就是\(k-cnt\)
当\(cnt>k\)时,有一个结论:答案一定为\(1\)或\(2\)
考虑第一次操作选择了\((1,1)-(L,L)\)
使得操作后的\(cnt'\ge k\),且\(L\)再\(+1\),\(cnt'\)就会\(<k\)
然后考虑第二次操作以\((L+1,L+1)\)为右下角开始扩展
每次最多可以消去两种颜色,最后\(cnt\)会变成\(k\)或\(k-1\)
当其变为\(k-1\)时,显然只需让操作的矩形贡献新颜色即可
然后考虑判断是否可以一次操作达到目标,只需一点简单的差分前缀和技巧
CF1782F
事实说明,如何设状态很重要
不妨考虑计数合法的前缀和序列
设\(f(n,x)\)表示还剩\(n\)次操作,以\(x\)为开头的前缀和序列的合法方案数
则有转移
把卷积提出来就能做到\(O(n^3)\)了