Codeforces练习笔记

CF1430G Yet Another DAG Problem

\(n\leq 18\)最大权值与最小权值的差小于18
然后想到枚举权值,通过状压来给部分点赋值
通过参数分离,可以在一条边较小一头的点被赋值时向\(dp\)中减去\(w*a\)
在另一头被赋值时补回贡献。
在赋值时注意判断是否可行即可
数据较小,感觉比较裸

CF1468LPrime Divisors Selection

看上去很神的一道题
大致分析一下最后的数列,肯定是由一些质数的幂次,还有这些质数的倍数组成
为了每个\(P\)都是\(friendly\),所以每个质数的幂次出现的次数,要么为\(0\),要么大于\(2\)
然后不妨先把这些数都抓出来,因为这样肯定是最优的,不仅能凑数,还能让质数的倍数能取得可能性变大
考虑寻找质数幂的方法,注意到\(a\)的值域相当大,不能套路的根号筛质数,只能套路的\(\frac {1}{3}\)筛质数
现将小于 \(1e6\)的质数筛出,并对\(a\)序列筛一次素数,于是剩下的\(a\)中只有大于\(1e6\)的素数了
换句话说,设\(P\)\(a_i\)剩下的质数,由于\(P\geq 1e6\) ,则\(P^3>a_i\),\(a_i\)中最多只包含\(2\)个类似的\(P\)
任务变成了"判断一个数是否为质数或者质数的平方",其实是否为质数的平方本质与判质数相同
但是对于\(1e18\)的质数,手头似乎没有可以判断的方法。
距离AC本题还差最后一步:百度\(Miller Rabin\)
在取出一些必然合法的数后再用已出现的质数去原序列中 套即可

CF1120D Power Tree

有点水的一道2500
显然是一道树形DP,\(dp[x][0/1]\)表示使以\(x\)的子树 叶子节点权值相同,且能否任意确定权值的最小花费
转移方程:

\[dp[x][1]=\sum_y dp[y][1]+min(0,v[x]+max_t dp[t][0]-dp[t][1]) \]

\[dp[x][0]=\sum_ydp[y][1]+max_t dp[t][0]-dp[t][1] \]

在DP完后再dfs一次标记节点即可实现query2

CF1146G Zoning Restrictions

感觉极为板子的一题,与POI2015 Myjnie做法完全一样
但是这个板子非常玄妙,区间dp灵动的转移方向使得DP成立
\(dp[l][r][k]\)表示决策了\([l,r]\)区间内的建房情况,且最高高度不大于\(k\)的最大贡献
在决策\(dp[l][r][k]\)时,仅考虑被[l,r]完全包含的限制条件
然后像正常的区间dp一样枚举断点,这道题还要同时枚举断点的高度
直接上状态转移方程可能更直截了当:

\[rep(k,i,j)rep(p,0,h)Max(dp[i][j][p],dp[i][k-1][p]+dp[k+1][j][p]+p*p-sum[k][p]); \]

其中\(sum\)为预处理出的被\([l,r]\)包含的限制条件
感性理解可以发现这样转移会覆盖所有情况
理性。。。不太会证

CF1033E Hidden Bipartite Graph

很有借鉴意义的一道题,感觉对二分图的判断有非常重要的意义,可能非常板子。
我们可以构造出原图的一个生成树,流程如下:
1.选一个根节点
2.在未加入生成树的集合中分治,找到一个与当前生成树有边的点
3.在已加入生成树的集合中分治,找到一个与上一步生成点有边的点
4.二者相连,重复2-4。
然后在check一发奇数层内是否有边和偶数层内是否有边即可确定是否为二分图
若是,则输出奇数层的点即可
否则,可以考虑从奇数层中逐个删点,比较删点前后边数是否改变即可
找到其中一个点后,暴力扫出另一个点,结合树径即可得到答案

CF1111E Tree

这不虚树dp裸题吗
考虑按照\(dfs\)序加点进行\(dp\),下文所说的祖先都是关键点
对于一个点,他显然不能和他祖先在同一个集合,而他的祖先之间必然有祖先关系,也必然不能再同一集合
而此时他的祖先已经决策完毕,而因为他祖先的集合两两不同,所以这个点可塞入的集合个数是一只的
就可以非常轻松的\(dp\)
注意到此时,虚树的作用只在于求出祖先个数,这显然可以在根为\(1\)\(dfs\)线段树上分讨得到
按照\(dfs\)进行加点来决策祖先

CF1290D Coffee Varieties

做交互题,先看看有没有毒瘤数据范围,这不,一个关键的\(\frac{3}{2}\)不就找到了
发现题目强调\(n,k\)都是2的幂,显然又是一个入手点,刚整活完多项式,要说没想到分段那是不可能的
考虑两个长度为\(S\)的段m,我们可以用加入一次序列1,一次序列2,一次序列1来去重
这样对于合并后的段,本次操作的系数为\(\frac{3}{2}\)
因为有这队列大小的限制,所以分的块大小只能为\(k\)
于是就有\(\frac{n}{k}\)个块,块间两两去重,有\(\frac{n^2}{2k^2}\)个块
每次去重需要操作\(3k\),总操作数就凑好了
ps:在执行块间去重时还可以顺便处理块内重复

CF1368G Shifting Dominoes

直呼神题!!模型的转换非常巧妙,个人拿到手没有任何想法
有很多重要的性质
1.可以讲盘上的点分为奇偶两类,因为一个空格移动时只会从\((i,j)\)\((i\pm2,j\pm2)\),两类点间的移动是封闭的
2.可以发现每个点变成空点的方法只有一种,就是从它所在的块的另一头跳过来
3.不存在一种方案使得在不反复横跳的情况下,一个空点移动后重新回到原位置,可以由\(2\)推导得到
每个点的入度为1,且没有环,不就是颗树吗!
看到这个结论时直接蒙了,这都能推
然后对于删去的一块多米诺,他所能产生的点对就是两个点在两颗树上所对应的子树的size乘机,但是需要去重
题目转化为了两颗外向树的合法点对数,可以按照dfs序加入一颗树上节点的贡献,数据结构维护另一颗树哪些点可行
因为按dfs序加入贡献时会统计祖先的贡献。
属实神题

CF1491G Switch and Flip

拿手好活,构造置换环
发现一个环内若有相邻的两个负数则有解,及从一个负数出发,绕环一圈到另一个负数
但是现在的环没有负数,注意到我们可以交换一次,使得两个环结合为一个大环,且有两个相邻负数
这样操作数为环的size。
若环数为偶数,则两两结合,操作数为\(n\)
若环数为奇数,则先两两结合,最后一个环在结合前面一个已处理完的自环,操作数\(n+1\)
有手就行

CF1436F Sum Over Subsets

看到gcd==1下意识的套一个莫比乌斯反演
易得\(A\)集合的贡献为\((|A|-1)*(\sum_{x \in A} x)^2\)
不难发现实际上就是求形如\(xy\)\(x^2\)的两类点对
设我们枚举的d的倍数公用\(cnt\)个,\(x,y\)的贡献可以视为:

\[2*x*y*\sum_{i=0}^{cnt-2} C_{cnt-2}^{i}*(i+1) \]

稍微转换一下就成了:

\[x*y*(2^{cnt-2}*cnt+2^{cnt-1}) \]

然后我们发现对于每对\((x,y)\)其系数都是相同的,所以只需要统计\(x*y\)的总和即可,which is simple enough
然后对于\(x^2\),但看形式就应该比\(xy\)要便于维护,贡献为:

\[x^2*(\sum_{i=0}^{cnt-1} C_{cnt-1}^{i}*i) \]

稍微转化一下就成了:

\[x^2*(cnt-1)*2^{cnt-2} \]

这道题就可以埋了

CF1392H ZS Shuffles Cards

白学了白学了,minmax容斥白学了。
其实这是一道很裸的minmax容斥题,由于每张卡牌实际等价,所以可以减去枚举自己的过程,用组合数即可
一提到minmax容斥感觉都没什么好讲的了。。。太板子了

CF1264D2 Beautiful Bracket Sequence

对于这类题,基本上第一步都要先推导最优情况的特征。
首先,贪心可以的到最后的序列必然是\(((...))\)的形状,也就是说在某个关键点前删去所有的\()\),后删去所有的\((\)
然后对于这种情况随着关键点\(i\)\(1\)枚举到\(n\)\(i\)前的左括号数单调不减,\(i\)后的右括号单调不增
而且对于每种方案必然可以找到唯一一个点使得左括号数==右括号数,因为i的每一次变化都会导致左括号数+1或者右括号数-1,此时也括号数恰好就是该方案的答案。
得到这个结论就可以轻松\(n^2\)维护\(i\)前左括号数为\(j\)的方案数,通过组合数的到后续的方案,过掉easy version。
用数据结构可以维护左括号数,但统计答案就很蛋疼了,所以考虑数学推导
设左括号数为\(l\),左侧?数\(x\),右括号数\(r\),右侧?数\(y\),则有:

\[\begin{aligned} res&=\sum_{i=0}^{x} (l+i)\binom{x}{i}\binom{y}{l+i-x}\\ &=l\sum_{i=0}^{x} \binom{x}{i}\binom{y}{y+r-l-i}+\sum_{i=0}^{x} i\binom{x}{i}\binom{y}{y+r-l-i} \\ &=l\binom{x+y}{y+r-l}+x\sum_{i=1}^{x} \binom{x-1}{i-1}\binom{y}{y+r-l-i} \\ &=l\binom{x+y}{y+r-l}+x\binom{x+y-1}{y+r-l-1} \\ \end{aligned}\]

然后完事,组合数方面需要加强
突然发现以前组合数用\(C\)太恶臭了

CF1503E 2-Coloring

有手就行系列。
稍稍摸几组数据就会发现染色情况本质只有1种:
左三角右三角中间沙漏型,或者旋转90度
这里仅考虑左三角右三角中间沙漏型
考虑枚举左右三角相切的线i(竖线),以及分别过二者相邻最近的点的横线j,k。
原因很简单,知道这三个量后,我们知道了左右三角的横向大小,同时也可以很方便的限制二三角形不会相交
这样答案就是:

\[2\sum_{i=1}^{m-1} \sum_{j=1}^n \sum_{k=j+1}^n \binom{i+j-1}{j}\binom{n-j+i-1}{n-j-1} \binom{m-i+n-k}{n-k+1} \binom{k+m-i-2}{k-2} \]

参数分离后就很好写了
有手就行

CF1073F Choosing Two Paths

由于要求链,自然想到求直径,但是这显然是有问题的,这个"直径"是受限制的.
所以考虑先预处理出哪些点可以做重合部分端点,求出这些符合条件的点的直径,就可以解决第一关键字的问题
然后考虑余下路径最长的问题,在以直径的一端为根的树中,剩下的路径要以另一个重合端点的dep为第一关键字,路径和为第二关键字进行dp,同时要记录子树所对应的端点,这样在既可以计算答案也可以处理多条直径的情况。实现起来也比较简单。

CF1257G Divisor Set

非常重要的一类思想
\(deg(x)\)\(x\)中质数的个数\((deg(4)=2)\),则各个数之间的整除关系可以画出一个有向分层图,按照\(deg\)进行分层
不难发现,每个层内不连边,
对于这道题,有一个非常重要的结论,答案必然是某一层上的所有点。
正确性也比较显然,若存在一个不在我们枚举的层内的点,则该层内至少有1个数因此而不可被选中,所以讲该点替换为一个该层内被他整除或者整除他的点,必然是不劣的
但是我们并不知道那一层的点是最优的,CF官方题解说是\(\frac{n}{2}\) 但并没有给出详细证明
不过好在我们的做法于此无关
得到了上述的结论,我们只要知道每一层的点数就可以了,这样我们可以写出每一种质数所贡献的生成函数
各个质数生成函数的乘积就是最后得到的各层点数
这个过程可以采用如带公主的背包一样对生成函数的封闭形式ln后求和再exp实现\(O(nlogn)\)的写法
也可以使用启发式合并的方法对生成函数两两合并,复杂度\(O(nlog^2n)\)

CF1452G Game On Tree

看到这类"围剿"题就有点心慌,感觉有一些奇奇妙妙的决策。
实际上这道题没有,由于A先手,所以B只需无脑追A就行了,A就没有秦王绕柱走的策略
于是预处理处B的多点源最短路(意会)
A显然要一直向着dis增大的方向跑,而且这样跑必定合法
然后想到从大到小枚举dis,将其对应的点向外更新,更新过程中dis单调减小,对于更新过的点显然不能更新
于是每个点只会更新,就得到了所有点的答案

posted @ 2021-08-02 15:35  Saltywater  阅读(79)  评论(0)    收藏  举报