【CF】2022一二三月CF之旅

太咕了,太咕了,人快没了.jpg


CodeForces - 1459D Glass Half Spilled(dp)

虽然考试上是第一道题,但应该第一时间想到DP(n100),然后列状态,前两维度很容易想到是前i个中选j个,经过思考后,我们要求在选定k个杯子,此时装水为L,然后选取的最大容积为多少的状态。之后列DP转移即可。(惭愧)

CF1257D

参考题解

2e5数据范围很容易想到贪心,惭愧考场上没有做出来,然后用数组k[i]表示可以连着干掉i个时候的最大士兵武力,然后顺着模拟这个过程一路干人就可以了。

CF1260D

参考题解 

由于答案显然具有单调性,我们考虑二分,由于精妙绝伦的想法,一个点最多走三次(一个人走过去一次,回来一次,再带兵走一次),于是我们模拟这个过程就可以了。

Co1635D - Infinite Set 巧妙的DP

我们可以发现对于变换第一种等于二进制后面加一位1,第二种等于二进制后面加两位0,故我们利用dp[i],表示数字表示为i位的有多少个数字,如果起始只有1,那么dp[i]=dp[i-1]+dp[i-2]。而有些初始数由于可以由其它表示,我们利用排序后用set除去可能表示的无用数后,设置g[i]表示初始表示i位的数字个数。然后dp[i]=dp[i-1]+dp[i-2]+g[i],答案就等于dp[i]加和。

1635E - Cars 构造关系图

画画图后发现,无论是irrelevant还是distine他们的图都是方向相反的。于是乎我们先对关系连接无向边,二分图构造出它们每个的方向,如果无法构造则puts("NO"),然后再已经匹配好方向之后,利用关系,坐标位于左边的向右边的连边,构造有向图之后topsort,如果有环无解,否则坐标出。

1630A - And Matching

关于该题,比较容易想到构造。于是乎对于k=0,我们用0<->n-1,1<->n-2......一一对应即可。对于0<k<n-1,我们用0<->c(k)(k的反二进制位即n-1-k),k<->n-1同样构造。而对于k=n-1,构造n-1<->n-2,n-3<->1,0<->2,于是n=4不行,除此外都可。

1644D - Cross Coloring

容易想到这道题最后的答案就是k^合法未被完全覆盖的涂色次数。于是乎,倒着考虑,如果一次涂色它的行列都被涂过或者所有行or所有列都被后续覆盖则不合法。

1644E - Expand the Path

虽然理解了,但不是完全理解(o.o)属于下次还错的,后续可能回看该题,大致就是找到一个上边界和下边界,其以外的部分就是不能走到的。具体做法参考jiangly大佬的代码。

1642E - Anonymity Is Important

关于该题,参考博客,感觉十分精妙,也就是很容易判断一个人是否无病,但对于它有病,我们的想法如同题解中,用set维护区间,当一个人有病它处在一个区间且该区间中除他以外的每一个人都没病。类似用set维护的想法十分精妙,值得回味。

1648C - Tyler and Strings

这道题如果不考虑有多重数的情况,我们就考虑一位一位的放,每一位可以放比它严格小的数然后后面乘(n-1)!再在该位填一样的数类似数位dp一位一位考虑。而如今有多重数,那么考虑式子就是n!/c1!*c2!*c3!.... 那么我们就利用数组数组求有多少个比某位小的,同时维护这个式子就可以了。

1650G - Counting Shortcuts

一个图上DP,先BFS求出距离,然后容易发现必定是一个简单路径,于是考虑dp[x][0/1]表示不增/增最佳路径上点的方案数。然后按照距离起点的距离顺着类似topsort一样图上DP。

1654D - Potion Brewing Class

参考博客

考虑之后发现,如果固定一个点值为1,那么我们就顺着跑最后答案就是在约分之后所有的分母的lcm,再乘上所有的值之和。由于数太大了,我们质因数分解,顺着跑,然后就能找出最后的答案了。

1657E - Star MST

考虑到一些最小生成树的性质后等价于edg(x,y)>=max(edg(1,x),edg(1,y))关于这道题,设f[i][j]表示已经与1连了j个点,当前j个点的与1连边都是小于等于i的连边。转移考虑连i+1边权的边,

f[i][j] --> f[i+1][j+k] * C(n-1-j,k)*(w-i)^(k*(k-1)/2+i*k)
DP转移即可。
构造方法,二分图染色,然后黑点为正度数,白点为负度数。怎么想的emmm可能还需要多加练习才行。
 
(感觉最近遇到的最小生成树的题实际上都有一个固定的生成树方式,下次遇到类似题目注意其生成方式)
我们发现如果点权固定,设定边权为ai*aj,那么我们得到的最小生成树一定是1.点权全正则全连向最小值点2.点权全负则全连向最大值点3.点权正负则正连向最小负,负连向最大正。
于是乎我们更改原题式子为(ai+t)*(aj+t)-t^2,即在t固定下,我们就可以确定生成树来确定答案,且最后是一个关于t的一次函数。
然后我们发现如果-t在[ai,ai+1]之间(我们按照大小排序之后),那么在其中改变是不改变最小生成树的连边的。
于是乎我们就固定-t在哪两条边之间,每次都可以确定出一棵最小生成树及对应的一次函数。这样我们就可以求得解。(注意在边界时判定斜率正负输出INF)
十分惊为天人的做法了好伐,好久没用这么搞字典树了。我们考虑由于L^x=a[i],故L^a[i]其中一个一定等于X。我们考虑如何判断这个是不是X,先设这东西a[i]^X = b[i]。那么我们想到对于一个排列全部异或上同一个数一定还是两两不等。于是乎,如果我们用假定的某个b,min{b^a[j]} == L max{b^a[j]} == R则一定可以说明这个b就是X,它的的确确可以构造出这个排列出来。于是这个min和max咋做咧,我们考虑01字典树,于是就完了。实在是精妙至极的做法!
首先一来判断出是否存在这样的解。然后根据想法来思考最后发现,因为这个类似一个"平均段"的东西,很容易发现如果把数组看做一个环,一定存在这样的一个平均段。由于数组不是环,故答案为1或2。然后就利用前缀和判断一下即可。具体为什么是这样,可以看一下这个commet,清晰简明易懂。
三月的最后一天了,做到了一道十分有趣的博弈题。关于该题,我们考虑f[x][y]为1先手必胜,为0后手必胜。考虑到先手若是最大则答案一定先手胜(若后手移到别的位置,先手可以跳回原来的位置)。然后若是在某个v的位置,后手必须要跳在另一个大于v的位置,否则先手又可以跳回原v的位置。这样考虑之后,我可以按照权值逆序考虑。如果先手在某一个位置(x,y),而后手可以找到一个(x1,y1)满足v[x1][y1]>v[x][y]且|x-x1|+|y-y1|>k,f[x1][y1]那么后手胜。考虑先手胜的条件就是任何都有|x-x1|+|y-y1|<=k,f[x1][y1]=1。
对于|x-x1|+|y-y1|<=k我们拆开来考虑就是max(abs(x+y-(x1+y1)),abs(x-y-(x1-y1)),因为是绝对值,对于拆开来考虑就是拆开的四个中最大的那个,方便整理计算就保存x+y和x-y分别的最大最小值来进行考虑。
于是该题就完成了。
 
posted @ 2022-01-19 22:13  Newuser233  阅读(99)  评论(0编辑  收藏  举报