【CF】2022一二三月CF之旅
太咕了,太咕了,人快没了.jpg
CodeForces - 1459D Glass Half Spilled(dp)
虽然考试上是第一道题,但应该第一时间想到DP(n100),然后列状态,前两维度很容易想到是前i个中选j个,经过思考后,我们要求在选定k个杯子,此时装水为L,然后选取的最大容积为多少的状态。之后列DP转移即可。(惭愧)
CF1257D
2e5数据范围很容易想到贪心,惭愧考场上没有做出来,然后用数组k[i]表示可以连着干掉i个时候的最大士兵武力,然后顺着模拟这个过程一路干人就可以了。
CF1260D
由于答案显然具有单调性,我们考虑二分,由于精妙绝伦的想法,一个点最多走三次(一个人走过去一次,回来一次,再带兵走一次),于是我们模拟这个过程就可以了。
我们可以发现对于变换第一种等于二进制后面加一位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]加和。
画画图后发现,无论是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不行,除此外都可。
容易想到这道题最后的答案就是k^合法未被完全覆盖的涂色次数。于是乎,倒着考虑,如果一次涂色它的行列都被涂过或者所有行or所有列都被后续覆盖则不合法。
1644E - Expand the Path
虽然理解了,但不是完全理解(o.o)属于下次还错的,后续可能回看该题,大致就是找到一个上边界和下边界,其以外的部分就是不能走到的。具体做法参考jiangly大佬的代码。
1642E - Anonymity Is Important
关于该题,参考博客,感觉十分精妙,也就是很容易判断一个人是否无病,但对于它有病,我们的想法如同题解中,用set维护区间,当一个人有病它处在一个区间且该区间中除他以外的每一个人都没病。类似用set维护的想法十分精妙,值得回味。
这道题如果不考虑有多重数的情况,我们就考虑一位一位的放,每一位可以放比它严格小的数然后后面乘(n-1)!再在该位填一样的数类似数位dp一位一位考虑。而如今有多重数,那么考虑式子就是n!/c1!*c2!*c3!.... 那么我们就利用数组数组求有多少个比某位小的,同时维护这个式子就可以了。
一个图上DP,先BFS求出距离,然后容易发现必定是一个简单路径,于是考虑dp[x][0/1]表示不增/增最佳路径上点的方案数。然后按照距离起点的距离顺着类似topsort一样图上DP。
考虑之后发现,如果固定一个点值为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边权的边,