Codeforces Round #219 (Div. 1) ABCD

题目链接

代码链接
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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值