Codeforces Round #219div1 部分题解

来源:互联网 发布:算命网站源码免费下载 编辑:程序博客网 时间:2024/04/29 06:15

感觉这场比赛题目略微奇怪吧..

开始比赛后首先开了C,dp方程是显而易见的,观察了下转移发现这不就是经典的单调队列吗0 0.

赶快啪啪啪敲完,交上去WA3...   难过了,盯着看了十几分钟,什么错误也没看出来

有点绝望...  估计是要跌成紫了... 可是已经用大号交了无力挽回了   只能争取把损失降到最低,于是先把A过了准备C对拍,朴素写了几行突然弹出个窗口说C出了点问题rejudge了....   (汗.. 然后就过了) 瞬间就不是那么绝望了,虽然A出得特别晚但是C出得早还是有一定优势的

这时候同时看了B和D,全都不太会做T_T.. D的核心问题显然是维护树上的一个集合构成的联通块大小,这东西肯定是能用LCA算的,于是先敲了一堆树BFS和LCA,边敲变想,想着想着突然机智的发现Bn^5也只有1亿,常数至少要除以8,时限居然还有4秒,赶快啪啪啪A掉了

最后剩下40分钟和一个D,因为写了不少感觉还是靠谱的。于是我仔细想了想发现可以算出所有点到LCA的距离和,之后去重只要考虑dfs序排序后所有相邻点对的LCA即可,这个东西用set就可以维护了

然后啪啪啪啪啪啪,终于在还剩5分钟的时候过掉了~ 最后rating还是涨了点,挺开心的 


具体做法:

A

比赛时的想法是二分答案,如果答案固定为x了,那么如果最小的x只袋鼠不能被最大的x只袋鼠装住的话,其它情况肯定更不行了,那么只需线性check一次即可

观察发现答案不会超过n/2,于是可以把袋鼠排序后从中间分开,前一半被装后一般装,那么直接贪心就可以了


B

感觉比赛中五方的dp比较好.. 首先固定左上的界,然后统计每个点为右下角可以构成多少个合法的矩形即可

官方题解的做法是先用二维前缀和处理出所有合法矩形,然后四维前缀和直接算答案

感觉写起来还是有点麻烦的


C

题目相当于让所有的|a[i]-x|之和尽量小,很容易想到一个dp:f[i][j]代表放第i个烟花时站在j号位置,之前的和最小是多少

这个转移显然就是f[i- 1]中的一段区间最小值,并随着j向右滑动

这是经典的单调队列,可以百度"poj sliding windows"


D

上面讲了大概的做法了,赛后发现可以更加简明:

把集合中的点按dfs序排列,求所有相邻两点到LCA的距离,然后观察子树上的每条边,除了最左、最右的两条链之外,其余每条边被经过了两次(从左边的子树跨越到下方子树,从右边的子树跨越到下方子树),再加上左右两条链(既dfs最大、最小的点到它们LCA的距离),这样每条边都被统计了两次,就可以计算出有联通块大小了


E

数学渣 几何渣 完全不会T_T.. 谁来教我反演T_T..




赛季过去了好久了,回想起来总是有点失落

以前的时候太注重表面上的"题量",盲目看了很多题解,导致思维太弱,最近多多少少有点提升

做了这么久CF了,感觉这个rating系统还是不太科学,短时间内的发挥对rating的影响太大,不如TC的rating更能反应实际水平

不过毕竟都不是ACM 0 0.. 

其实更喜欢CF的感觉,但是跟ACM比起来确实像游戏一样

明年不知道还会不会继续ACM, anyway这一年还是不能完全扔掉算法练习

哎.. 前路迷茫

0 0