Codeforces Round #318 vp

来源:互联网 发布:rog主板软件 编辑:程序博客网 时间:2024/04/29 15:16

A.Bear and Poker

2A (while if都能写反0.0,没救了
把2和3的因子都去掉然后比较

B.Bear and Blocks

1A
简单思考发现,每个格子被删掉的时间是它到边缘的四联通最短距离
最后一个被删掉的格子肯定在floor上
然后dp就可以求出底端所有格子到两边的距离了

C.Bear and Drawing

订正
这题还是很厉害的,不能相交是一个很强的性质,但是同时又很自由
我的做法是这样的:
考虑任意取一个x作为root,那么x的所有孩子里面只有两个孩子可以延伸出去,g(x,f)表示x的father是f的话延伸出去可不可行,剩下的孩子都必须能在1*n的格子里摊开,G(x,f)表示x的父亲是f的话能不能在1*n的格子里展开
考虑转移的话g的话只能有一个子树延伸出去,剩下的还是在1*n里展开
能否展开其实就是删去f之后x这个是不是一条链,这个可以直接dp
我们记忆化dp这个f和G即可

然后考虑这个x的选取,我们可不可以任意选一个点作为x呢?不行,如果是一个度为1的点作为x,显然会出错,本来子树可以两边延伸的,现在就只能一边延伸了,我们可以以同样的思路构造一个反例,让度为3的时候出错,比如cf的testcase12
借用一下cf题解的评论中adamant的图:testcase12
如果以1为x就会出现这样的问题,但是既然有一个子树是两边拓展的,那么只要我们选择这个子树的根节点即可。
更一般地说,一个合法的方案,如果不存在一个节点的两个子树向两个方向拓展的情况,那么任意选一个点肯定是合法的
存在两个子树往两个不同的方向拓展的情况的话,我们只要选这个点x作为root,那么也是合法的
这样我们只要枚举每一个x就可以保证正确性了

记忆化不要用map,因为访问次数的常数太大了,复杂度O(n)

题解的做法利用了更多的题目性质:
像对图去生成树一样,对这个树我们取一条从最左边到最右边的长链,因为这条链完全分隔了这个2*n的格子,分成了若干个1*n的小条
而每个小条中,显然只有G(x,f) == true的可以被填进去
考虑怎么找这个main path,我们首先标出所有的链,这只需要从每个叶子往上走,走到第一个度数 > 2的节点就停止即可
然后我们考虑每个节点,如果它不在main path上,那么它最多和两个链 以及 肯定和一个main path上的点相连,所以如果一个点和多于三个点,或者和两个不是链的点相连,那么它一定在main path上,反之它一定可以不在main path上
然后考虑每个main path点,它合法的条件是它只能和两个一定在main path上的点相连,否则就一定不合法
对于一个每个点都合法的情况,我们只要把main path串起来,然后容易证明这一定对应了一组合法解(只需要main path在上面)剩下的点在下面即可
我们的dp其实就是枚举一个一定在main path上的x,然后把挂在它上面的y-letter和lines都算了然后剩下的dp递归到一侧
之所以要枚举所有x,是因为这个x必须在main path上,也就是要往两边延伸

一个div2 E写了好长,感觉还是很有意思,main path这个观察真的非常巧妙,窝的dp做法倒是比较直观233

D.Bear and Cavalry

这个题可以简单地用交换法证明,当一个线和三个线相交的时候一定不会最优,所以就得到了i只可以和i+-0/1/2的节点匹配的结论
然后就可以得到一个nq的做法

题解用分类讨论证明了只有三种可能的匹配连续段,于是就可以线段树的结构做dp,方便快速修改了

分类讨论真是不优美0.0 以后有时间做吧

E. Bear and Bowling

这个题和xyz神犇的Control一题一样
Control一题里我们限制了一定选p个,但是在考虑模拟费用流的办法的时候还是按照把代表第i个的Y集合点一个个加入的办法k=1..p这样模拟
那么这题求的是最大的,同样这样模拟,到贡献小于0停止即可
所以就是分块维护凸包来支持+i操作,注意凸包中查询最优值可以均摊,因为分快的时候更新了势能0.0
所以就是nsqrtn的了

订正

DE两题还没有写,有时间写吧QAQ
自己现在怎么这么弱啊,药丸

0 0
原创粉丝点击