【UOJ139】【UER #4】被删除的黑白树
题意:
很久很久以前,有一棵树加入了 UOJ 群。
这天,在它讨论“一棵树应该怎么旋转”的时候一不小心被删除了,变成了被删除的树。
突然间,它突然发现它失去了颜色,变成了一棵纯白的树。这让它感觉很焦躁,于是它来拜托你给自己染上一些颜色。
我们可以把它描述成一棵n个节点的有根树(默认树的根为1号节点),所有非根的度数为1的节点被称为叶子节点。最开始所有的点都是白色的。
现在你需要选出一些节点并把这些节点染成黑色的。为了迎合树的审美,你的染色方案必须要满足所有叶子节点到根路径上的黑色节点个数相同。
你发现黑色节点个数越多,树就会越高兴,所以你想要知道在所有合法的染色方案中,黑色节点总个数最多是多少。
题解:
神题。(感觉UOJ Round的题全是神题)
$O(n^2)$的DP大家都会,但是跟正解并没有什么关系;
显然题目要求相当于使白色节点最少;
有几个结论:
1.如果一种合法方案中根节点到所有叶节点的路径上都经过白色节点,那么dfs一遍这棵树,在遇到白色节点时染黑并回溯,这样必定可以使得白色节点变少或不变且依然合法;
2.如果一种合法方案中根节点到深度最浅的叶节点的路径上经过白色节点,那么根节点到所有叶节点的路径上必定都经过白色节点;假定根节点深度为1,因为其他叶节点的深度不小于到最浅叶节点的深度,而根节点到其他叶节点路径上的黑节点数等于到最浅叶节点路径上的黑节点数,而小于他们的深度,因此根节点到其他叶节点的路径上都会经过至少一个白点;
综上,一种最优的合法方案必定满足根节点到最浅叶节点的路径上没有白点;
这样一种构造方法就是先把根节点到最浅叶节点的路径全部染黑,然后递归判断根节点的其他子树跟是否要染白再往下做即可;
简化到每个点,实际上一个点被染白当且仅当该节点子树中最浅叶节点的深度>整棵树的最浅叶节点深度+该节点到根节点路径上的白点个数;
预处理每个点子树中的最浅叶节点深度,再一次dfs判断即可,时间复杂度$O(n)$。
代码:
1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 #include<queue> 7 #define inf 2147483647 8 #define eps 1e-9 9 using namespace std; 10 typedef long long ll; 11 typedef double db; 12 struct edge{ 13 int v,next; 14 }a[200001]; 15 int n,u,v,ans=0,tot=0,du[100001],mid[100001],head[100001]; 16 void add(int u,int v){ 17 a[++tot].v=v; 18 a[tot].next=head[u]; 19 head[u]=tot; 20 } 21 void dfs(int u,int fa,int dpt){ 22 if(u!=1&&du[u]==1)mid[u]=dpt; 23 for(int tmp=head[u];tmp!=-1;tmp=a[tmp].next){ 24 int v=a[tmp].v; 25 if(v!=fa){ 26 dfs(v,u,dpt+1); 27 mid[u]=min(mid[u],mid[v]); 28 } 29 } 30 } 31 void _dfs(int u,int fa,int nwd){ 32 if(nwd<mid[u]){ 33 nwd++; 34 ans++; 35 } 36 for(int tmp=head[u];tmp!=-1;tmp=a[tmp].next){ 37 int v=a[tmp].v; 38 if(v!=fa){ 39 _dfs(v,u,nwd); 40 } 41 } 42 } 43 int main(){ 44 memset(head,-1,sizeof(head)); 45 memset(mid,0x7f,sizeof(mid)); 46 memset(du,0,sizeof(du)); 47 scanf("%d",&n); 48 for(int i=1;i<n;i++){ 49 scanf("%d%d",&u,&v); 50 add(u,v); 51 add(v,u); 52 du[u]++,du[v]++; 53 } 54 dfs(1,0,1); 55 _dfs(1,0,mid[1]); 56 printf("%d",n-ans); 57 return 0; 58 }
转载于:https://www.cnblogs.com/dcdcbigbig/p/10356923.html
【UOJ139】【UER #4】被删除的黑白树相关推荐
- 【uoj#139】[UER #4]被删除的黑白树 贪心
题目描述 给出一个 $n$ 个节点的树,$1$ 号点为根.现要将其中一些点染成黑色,使得每个叶子节点(不包括根节点)到根节点路径上的黑点数相同.求最多能够染多少个黑点. 题解 贪心 显然有结论:选择的 ...
- 【每日一题】4月8日题目精讲 黑白树
试题链接 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format:%lld 题目描述 一棵n个点的有根树,1号点为根,相邻的 ...
- 【JavaScript】appendChild一个的注意点之会删除原dom树节点
最近在研究学习vue原理,其中使用createDocumentFragment()方法,是用来创建一个虚拟的节点对象,那问题来了,创建了虚拟dom树,且最后只渲染了虚拟dom树里面的节点,那原dom树 ...
- 3319: 黑白树_外观:设计中的黑白
黑白也是自然界中最动人的视觉效果. 极端相反,两者似乎也代表相反的隐喻. 黑色通常被视为黑暗,是权威和权力的象征,偶尔也被视为邪恶的象征. 白色是纯度和亮度的标志,是与对手抗衡的天然天真. 这两种阴影 ...
- bzoj3192: [JLOI2013]删除物品(树状数组)
既然要从一个堆的堆顶按顺序拿出来放到第二个堆的堆顶,那么我们就可以把两个堆顶怼在一起,这样从一个堆拿到另一个堆只需要移动指针就好了. 换句话说,把1~n倒着,n+1到n+m正着,用一个指针把两个序列分 ...
- 黑白树(牛客网+树形dp)
链接:https://ac.nowcoder.com/acm/problem/13249 来源:牛客网 题目描述 一棵n个点的有根树,1号点为根,相邻的两个节点之间的距离为1.树上每个节点i对应一个值 ...
- php删除树结构文件,树型结构列出目录中所有文件的php代码
以树型结构列出指定目录里的所有文件,这样的话,目录下的所有文件便结构清晰的呈现在你的面前,有什么文件你一看便知,很方便的哦. 示例, php; auto-links:false;"> ...
- CodeM美团点评编程大赛 初赛B轮 A 黑白树 贪心 E 子串 暴力
A题类似想到给多个区间,求最少多少个区间可以覆盖全部的问题,求法就是从当前这步能够到达的区间里,选一个下一步能到的最大值,对于本题,区别一是树形结构,不是一维的直线了,区别二是点都是连续的,不是离散的 ...
- ZJOI2019一轮停课刷题记录
Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...
最新文章
- Android镜像文件的拆解
- 移动应用开发必备工具盘点
- “团队禁止使用Lombok”,被我狠狠的反驳了!
- HTML轮播图全宽,jq全兼容自适应宽度图片轮播(新手适用)
- ajax post提交数据_第三十五天JavaScript中的ajax
- php7.2.2 配置数据库连接,Tp5连接sql server数据库(更新:PHP7.2加载不懂sqlsrv扩展)...
- Java 控制 Windows 系统音量
- 光伏发电系统——mppt最大功率点追踪
- python 报表打印预览_python学习笔记之wxpython打印预览
- 登录注册的业务逻辑流程梳理
- Securing Gateways with HTTPS(0.8)
- 【交易架构day9】阿里交易系统演进之路
- 网易云音乐歌单监控 IOS捷径
- 【转】常用的版本控制软件
- 为什么华为,腾讯,阿里等大公司都有外包员工?
- 2015,走上人生巅峰,让APK编辑器祝您一臂之力!
- 【CVPR 2021】搜索网络宽度:BCNet: Searching for Network Width with Bilaterally Coupled Network
- 二维动画毕业论文参考文献精选
- Unity Hub和Unity项目的关系
- hub_probe()
热门文章
- 收藏 | 各种Optimizer梯度下降优化算法回顾和总结
- ECCV 2020最佳论文讲了什么?作者为ImageNet一作、李飞飞高徒
- “哪吒”出世!华为开源中文版BERT模型
- 我是如何拿到百度计算机视觉暑期实习offer的?百度面经(成功上岸!已拿offer)
- pta最长连续递增子序列C语言,pta 习题集 5-5 最长连续递增子序列 (dp)
- python把模块装到文件夹中_把模块有关联的放在一个文件夹中 在python2中调用文件夹名会直接失败 在python3中调用会成功,但是调用不能成功的解决方案...
- java项目_好程序员Java分享从入门到服务端项目开发的过程
- Zookeeper工作原理(详细)
- 2021年下半年系统集成项目管理工程师案例分析真题及答案解析
- 湖北省计算机技能高考c语言试题及答案,最新湖北省技能高考C语言测试题