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\),写出方程:

\[\begin{aligned} \sum_{k}f(a_{p,k})-1&=\sum_{i}\sum_{j\not =i}\frac{a_{p,i}}{m(n-1)}(f(a_{p,i-1})+f(a_{p,j}+1)+\sum_{k\not =i\&k\not =j}f(a_{p,k}))\\ &=\sum_{i}(\frac{a_{p,i}}{m}f(a_{p,i-1})+\frac{m-a_{p,i}}{m(n-1)}f(a_{p,i}+1)+\frac{(m-a_{p,i})(n-2)}{m(n-1)}f(a_{p,i})) \end{aligned} \]

不妨按比例分配为

\[f(x)-\frac{x}{m}=\frac{x}{m}f(x-1)+\frac{m-x}{m(n-1)}f(x+1)+\frac{(m-x)(n-2)}{m(n-1)}f(x) \]

可以预处理逆元做到\(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\)为开头的前缀和序列的合法方案数

则有转移

\[f(n,x)=\sum_{i=0}^{n-1}\sum_{j=0}^{n-1-i}\binom{n-1}{i}\binom{n-1-i}{j}f(i,x)f(n-1-i-j,x)(pf(j,x+1)+(1-p)f(j,x-1))\\ \]

把卷积提出来就能做到\(O(n^3)\)

posted @ 2022-11-15 22:21  冰雾  阅读(79)  评论(0编辑  收藏  举报