博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uoj139 【UER #4】被删除的黑白树
阅读量:5146 次
发布时间:2019-06-13

本文共 998 字,大约阅读时间需要 3 分钟。

不难发现有一个暴力\(dp\)

\(dp[x][l]\)表示\(x\)点子树内所有叶子节点到\(x\)的路径上都有\(l\)和黑点时最多能染多个黑点

转移就是

\[dp[x][l]=\max(\sum_{v\in son(x)}dp[v][l],1+\sum_{v\in son(x)}dp[v][l-1])\]

转移是\(O(n^2)\)的,复杂度跟深度有关,或许可以长剖但是不会

瞎猜一波不难发现最优情况下,深度最小的叶子节点到根的路径上肯定是都染成黑色了,即所有叶子节点到根的路径上的黑色节点个数都等于深度最小的叶子节点的深度,设这个最小叶子节点深度为\(k\)

而一个点染成黑色,那么这个点子树里所有叶子节点都会产生影响,我们要尽量多得将节点染黑,那么就需要让黑色节点的深度尽量大

我们将所有叶子节点按照深度排序,先将深度最小的叶子节点到根的路径染成黑色,同时维护\(res[x]\)表示\(x\)节点到根的路径上一共染了多少个黑点

接下来一次处理所有叶子节点,暴力往上跳即可,直到跳到一个节点\(x\)\(res[x]!=0\)

那么就说明从这个叶子节点到\(x\)的路径上还需要染上\(k-res[x]\)个黑点,我们贪心地染\(k-res[x]\)个深度较大的节点就好了

复杂度的瓶颈在于排序

代码

#include
#define re register#define min(a,b) ((a)<(b)?(a):(b))const int maxn=1e5+5;inline int read() { char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar(); while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;}struct E{int v,nxt;}e[maxn<<1];int n,num,head[maxn],fa[maxn],res[maxn],lve[maxn],deep[maxn],ans,tot;inline int cmp(int A,int B) {return deep[A]

转载于:https://www.cnblogs.com/asuldb/p/11452685.html

你可能感兴趣的文章
js判断手指的上滑,下滑,左滑,右滑,事件监听
查看>>
《那些年啊,那些事——一个程序员的奋斗史》八
查看>>
投票协议:发送和接收
查看>>
git命令总结
查看>>
机器学习算法与Python实践之(五)k均值聚类(k-means)
查看>>
Android - 向服务器发送数据(POST) - HTTPClient.
查看>>
selenium2 TestNG参数化
查看>>
[题解]火柴排队
查看>>
bzoj 2834: 回家的路
查看>>
python之ORM的使用(1)
查看>>
JS中的函数与闭包
查看>>
checking for gcc... no
查看>>
(js、css压缩)YUIcompressor的批处理应用
查看>>
tableView中cell的复用机制
查看>>
轻松搭建CAS 5.x系列(9)-登录后显示通知信息
查看>>
STM32 串口
查看>>
jquery.pagination +JSON 动态无刷新分页
查看>>
Oracle 要点摘录
查看>>
Redis-消息
查看>>
vue 表单校验 一
查看>>