codeforces 2100左右的dp题 做题记

可能是跳着做的

1|0CF1271D Portals

发现,一个点要派遣,一定是在最后能派遣的地方派遣,就设一个dp,f[i][j]表示到了i点,兵力为j的最大贡献,然后就直接dp转移,第i个点派肯定按贡献从大到小用。用刷表法,由于派遣最多有n个,所以总共复杂度为O(n2)

2|0CF980D Perfect Groups

奇怪题,跟dp似乎没有关系,直接分解质因数,保留指数为基数的素数,求出乘积,每次加一个点,看区间内有没有乘积等于当前点的组,有就不变,没有就加,特判0即可

3|0CF213C Relay Race

f[i][x][y]为两个点都走了i步,第一个点横坐标为x,第二个点横坐标为y,那么纵坐标可算出,然后看每种走法有没有重合然后直接转移即可

4|0CF1202C You Are Given a WASD-string...

还是和dp没有关系,发现可以分别讨论一个位置向各个方向走对答案的影响,然后计算即可

5|0CF547B Mike and Feet

还是无关,算出每个数前面的第一个小于它的数的位置,后面的也算出,然后统计一下即可

6|0CF710E Generate a String

终于是dp了,一个数必定不会被连续删除两次,因为这样就可以在乘的前面删一次达成效果,可以设出dp:f[i]=min(f[i1]+x,f[i/2]+y)imod2=0,min(f[i1]+x,f[(i+1)/2]+x+y)(imod2=1,直接转移即可

7|0CF1271E Common Number

考虑把一个数拆成二进制,然后发现,一个数x在y的路径中当且仅当x是y的前缀或把相同长度的前缀的最后面的1(如果为奇数)减掉后x为前缀的数y,那么,奇数和偶数分别有单调性,二分,奇数查当前数,偶数就查当前数和当前数加1即可

8|0CF840B Leha and another game about graph

感觉是图论,考虑把图的dfs生成树给搞出来,容易发现,我们从底向上调整,最后只会导致根不合法
如果整个图中有-1,那么那个点到根的路径的每个点的父边都取反,那么就容易做到合法
如果没有,我就直接猜了一个结论,因为返祖边会导致环,而且只有环内的点可以有父边取反且环的头不可以父边取反,由于返祖边不会超过根,就一定不能做到合法,这样并不是很严谨
正确的思考方式是由于一条边会增加两个度数,所以所有的点的最终度数mod2不为0就不合法,而如果根不合法,其他点都已经合法,那么就会导致连任何一对点都不会导致合法,即度数为奇数,所以直接这样做即可

9|0CF1151E Number of Components

联考原题(弱化版),性质:连通块数=点数减去边数,先求出1到所有点的答案,然后看删除点的贡献,这个直接讨论相邻的点即可,注意,连一起的要删的要看作同一个

10|0CF837D Round Subset

简单题,发现只有2,5会造成贡献,把数拆了后做一个类似背包的东西,f[i][j][k]表示到第i个,选了j个,五的个数有k个的最大的2的个数,直接做即可

11|0CF963B Destruction of a Tree

感觉可以啊,1h切了,发现一个点的子树是独立的,那么只用讨论父边选不选,这个可以dp,设f[i][0/1]表示i点的父边选/不选可不可以,如果root不能就No,然后按中序遍历类似的做法做即可,感觉难度蓝差不多了

12|0CF771C Bear and Tree Jumps

c=dep[i]+dep[j]dep[lca(i,j)],那么所求的就是i=1nj=i+1nceil(c/k),然后按照套路,拆开,那么所求的就是i=1nj=i+1nccmodk+[cmodk!=0]×kk,上面的modk就不会有余数了,拆成三部分算,第一个就枚举lca然后求一下,这个不难,第二部分就把每个点的depmodk存到线段树内然后还是枚举lca,求出对于每一个lca的modk=1k1的个数累加,第三部分就点的对数减去余数为0的二元组的个数即可,细节挺多

13|0CF16E Fish

感觉是一道十分常规的状压dp,设f[S]为状态为S的概率,然后就每次枚举两个鱼算一下即可

14|0CF900D Unusual Sequences

感觉很神奇,尝试想过没想出来,只能看题解
首先常规转化成gcd()=1,=y/x的形式,设g(x)表示不考虑gcd的=x的方案数,根据隔板法,答案就为i=1xCx1i1=2x1,根据二项式定理可得
然后设f(x)为考虑gcd的答案,设gcd()=a,那么做那个转化就可以成f(x/a)的形式,那么对于每一个x,枚举约数,然后再用总答案减去gcd不为1的答案即可,这个可以递归算
算一下时间复杂度,由于x的因子的因子一定是x的因子,所以最多会有d(x)种情况被统计到,那么时间复杂度为O(d(m)m)

15|0CF27E Number With The Given Amount Of Divisors

自己想出来了
首先,设最小的数为T,它的分解为p1a1...pkak,那么d(T)=i=1n(ai+1)
而要最小,那么a一定是单调不增的,因为如果增了,换一下位置一定更优
而由于210>1000,所以只要把前10个质数拉出来然后做一个类似背包的dp即可,f[i][j][k]表示第i个质数,选了j个,质因子共有k个的最小值,直接输出即可,时间复杂度随便过

16|0CF128C Games with Rectangle

一道简单题,但我没想出来
首先,有一步最简单的转化,行和列是无关的,这是显然的
那么就可以把二维转成一维,倒着处理,设f[i][j]表示现在已经到了第i个区间,长度为j的方案数,就等于k=1j2f[i1][k]×(jk1),后面的就是在这个长度为j的区间中长度为k的区间的个数,简单优化即可
但还有更简单的,答案就是Cn12×k×Cm12×k
考虑随机撒2×k个点,那么一定唯一对应一种情况,所以是对的

17|0CF621E Wet Shark and Blocks

一道难度还好的题,没什么细节
首先看到次数小于等于1e9,看能否用矩阵乘法
先考虑朴素dp,f[i][j]表示到了第i个块,当前的整数mod x=j
转移:f[i+1][(j×10+a[k])modmod]+=f[i][j]
显然,这是可以矩乘的,直接构造一个x\times x的矩阵然后快速幂即可

18|0CF768D Jon and Orbs

首先设计dp,f[i][j]表示第i天,选了j个的概率,每次有选之前的和新选一个的情况,乘上系数即可
至于天数,由于p<=1000,由于这题概率的倒数就是期望次数,累加就成了n×H(n)的形式,H为调和级数,所以开10000即可

19|0CF1265E Beautiful Mirrors

一道经典的期望dp题
首先,根据套路,我们发现正着不好推(其实是我不会),于是考虑倒着推,设f[i]表示完成in的期望次数
每一步有两种:走到i+1或1,写成转移就是f[i]=pi×(f[i+1]+1)+(1pi)×(f[1]+1),即下一步的期望再加上这一步再乘上对应的概率
但我们发现并不知道f[1]
我们要求的就是f[1],考虑通过一个已经知道的量推出f[1]
我们先把f1的式子写出,化简可得:f1=f2+1p1
再根据这个,把f2的公式也写出,这样推下去,发现一个公式:f[1]=f[i+1]+j=1i1pj×pj+1×.......×pi
然后f[n+1]=0,就做完了

20|0CF505C Mr. Kitayuta, the Treasure Hunter

sb题,还降至了
直接f[i][j],j表示d的变化量,转移即可

21|0CF119C Education Reform

简单题,发现差值很小,就把暴力的状态改一下即可

22|0CF786A Berzerk

首先,博弈论理论:如果一个状态的后继有必败态,那它就是必胜态,否则必败
然后就可以从第一个点开始倒推,如果当前点必败就把所有能走到它的点变成必胜,否则如果所有能走到的状态都走完了且必胜,标记成必败

23|0CF14E Camels

随便dp一下

24|0CF351B Jeff and Furik

我们分别考虑两个人的操作,A要尽量早,所以肯定每次减少一个逆序对
B有二分之一的概率减少一个,二分之一增加一个
所以一步期望减少一个逆序对
所以总的期望就是逆序对数乘二,如果逆序对数为奇数就减一,A操作后就结束了

25|0CF1030E Vasya and Good Sequences

一道板但有意思的题
首先,我们只关心二进制下1的个数的奇偶性,0没有影响,如果1的个数为奇数就一定无法达成需求
但如果有一个数,1的个数超过了当前区间的1的个数的一半,那么其他的就无法补全,就不合法
要求1的个数为偶数可以直接用桶
由于a>0,所以如果1的个数超过区间的一半,区间长度一定小于64,直接遍历然后check即可

26|0CF372B Counting Rectangles is Fun

简单题,求出前缀和,然后搞一个f[i][j][k][l]就是这两个点之间有没有大于0的,然后再求一遍前缀和即可

27|0CF165E Compatible Numbers

一道很有意思的题
首先,要&之后为0,如果当前位是0,另一个数0/1都可以,如果当前位是1,就只能填0
发现了一个有趣的性质:其实合法的x就是当前的数按位取反的子集,这个完美符合上面的条件
然后就做一个很像状压的把所有的都更新到然后对于每一个数,随便记录一个满足的即可,然后对每一个a判断即可

28|0CF510D Fox And Jumping

一道有意思的题
首先根据裴蜀定理,如果gcd(a,b)=1,那么ax+by=1一定有正整数解
而题目的条件实际上就是要通过若干操作向右/左移动一格,这样一定可以走到所有格子
那么只需要找到若干数,它们的gcd为1,那么就一定可以构造一组解
考虑用最短路算法,每次的gcd就转移到下一个状态,用map存即可,因为质因子不多所以复杂度是对的


__EOF__

本文作者longzhaocheng
本文链接https://www.cnblogs.com/longzhaocheng/p/17895507.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   longzhaocheng  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示