Codeforces Round #219 (Div. 1) ABCD

来源:互联网 发布:数据异地云备份 编辑:程序博客网 时间:2024/05/22 13:29

题目链接

代码链接
A:

排序,二分装在袋子里的袋鼠数量,然后用最大的mid只袋鼠试装最小的mid只袋鼠来判断可行性。

B:

n给40的意思就是疯狂的预处理。先求出固定左右界的矩形数量(即dp[a][b][c][d]表示矩形的左端点在线段(a,b)-(c,b)上,右端点在线段(a,d)-(c,d)上的矩形数量),然后可以用这个推出只固定左界的矩形数量,再然后就可以推出左右界都不固定的矩形数量,也就是最终的答案。时间复杂度O(n^4)。

C:

相当裸的单调队列优化dp。

D:

要解决这题需要一点关于dfs序的姿势:如果按照dfs的顺序沿树边访问所有树上的节点,最后再回到根,那么每条边都会被访问到两次,那么就可以得到节点数的信息。(dfs序就是深搜遍历时节点的先后访问顺序)。那么现在要知道一棵树有多少节点,只需要从这棵树的任意一个叶子出发,遍历整棵树即可。那么只需要求出sum = sigma(dis(a,b)) ,(a和b是树上dfs序相邻的两个叶子节点)。那么这棵树的节点数就是sum/2+1。

然后现在假如已知一棵树的路径和,求连上一个新节点后新树的路径和,这个是可以O(lgn)算的。先求出这个节点在树上的dfs序前驱prev和dfs序后继next,那么连通这个节点增加的节点数就是:dis(u,prev)+dis(u,next)-dis(prev,next)。

然后回到这道题,要求出总节点数小于k的子树包含的最长连续区间长度,换句话说,也可以检查包含区间[l,r]的最小子树是否合法(<=k),而显然区间越短对应的树的节点越少,那么是不是可以O(n)枚举所有的左端点,让右端点尽量向右延伸,开一个set维护当前树上的节点,每个节点进出set一次,复杂度nlgn。

5 0
原创粉丝点击