uoj139 【UER #4】被删除的黑白树
不难发现有一个暴力\(dp\)
设\(dp[x][l]\)表示\(x\)点子树内所有叶子节点到\(x\)的路径上都有\(l\)和黑点时最多能染多个黑点
转移就是
\]
转移是\(O(n^2)\)的,复杂度跟深度有关,或许可以长剖但是不会
瞎猜一波不难发现最优情况下,深度最小的叶子节点到根的路径上肯定是都染成黑色了,即所有叶子节点到根的路径上的黑色节点个数都等于深度最小的叶子节点的深度,设这个最小叶子节点深度为\(k\)
而一个点染成黑色,那么这个点子树里所有叶子节点都会产生影响,我们要尽量多得将节点染黑,那么就需要让黑色节点的深度尽量大
我们将所有叶子节点按照深度排序,先将深度最小的叶子节点到根的路径染成黑色,同时维护\(res[x]\)表示\(x\)节点到根的路径上一共染了多少个黑点
接下来一次处理所有叶子节点,暴力往上跳即可,直到跳到一个节点\(x\)有\(res[x]!=0\)
那么就说明从这个叶子节点到\(x\)的路径上还需要染上\(k-res[x]\)个黑点,我们贪心地染\(k-res[x]\)个深度较大的节点就好了
复杂度的瓶颈在于排序
代码
#include<bits/stdc++.h>
#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]<deep[B];}
inline void add(int x,int y) {e[++num].v=y;e[num].nxt=head[x];head[x]=num;}
void dfs(int x) {
int flag=0;
for(re int i=head[x];i;i=e[i].nxt) {
if(deep[e[i].v]) continue;
flag|=1;deep[e[i].v]=deep[x]+1;
dfs(e[i].v);fa[e[i].v]=x;
}
if(!flag) lve[++tot]=x;
}
int main() {
n=read();
for(re int y,x,i=1;i<n;i++)
x=read(),y=read(),add(x,y),add(y,x);
deep[1]=1;dfs(1);
std::sort(lve+1,lve+tot+1,cmp);
int x=lve[1];
while(x) res[x]=deep[x],x=fa[x],++ans;
for(re int i=2;i<=tot;i++) {
int x=lve[i];
while(x&&!res[fa[x]]) x=fa[x];
int k=deep[lve[1]]-res[fa[x]];
x=lve[i];int now=0;
while(x&&!res[x]) {
if(now<k) ++ans,res[x]=deep[lve[1]]-now;
else res[x]=deep[lve[1]]-k;
x=fa[x];++now;
}
}
printf("%d\n",ans);
return 0;
}
uoj139 【UER #4】被删除的黑白树的更多相关文章
- 【uoj#139】[UER #4]被删除的黑白树 贪心
题目描述 给出一个 $n$ 个节点的树,$1$ 号点为根.现要将其中一些点染成黑色,使得每个叶子节点(不包括根节点)到根节点路径上的黑点数相同.求最多能够染多少个黑点. 题解 贪心 显然有结论:选择的 ...
- uoj #139. 【UER #4】被删除的黑白树 dfs序 贪心
#139. [UER #4]被删除的黑白树 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/139 Descript ...
- 【UOJ139】【UER #4】被删除的黑白树(贪心)
点此看题面 大致题意: 请你给一棵树黑白染色,使每一个叶结点到根节点的路径上黑节点个数相同. 贪心 显然,按照贪心的思想,我们要让叶结点到根节点的路径上黑节点的个数尽量大. 我们可以用\(Min_i\ ...
- 【UOJ139】【UER #4】被删除的黑白树
题意: 很久很久以前,有一棵树加入了 UOJ 群. 这天,在它讨论“一棵树应该怎么旋转”的时候一不小心被删除了,变成了被删除的树. 突然间,它突然发现它失去了颜色,变成了一棵纯白的树.这让它感觉很焦躁 ...
- 【BZOJ】3319: 黑白树
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...
- 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...
- [BZOJ 3319] 黑白树
3319: 黑白树 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 557 Solved: 194[Submit][Status][Discuss] ...
- CodeM美团点评编程大赛初赛B轮 黑白树【DFS深搜+暴力】
[编程题] 黑白树 时间限制:1秒 空间限制:32768K 一棵n个点的有根树,1号点为根,相邻的两个节点之间的距离为1.树上每个节点i对应一个值k[i].每个点都有一个颜色,初始的时候所有点都是白色 ...
- 【BZOJ3319】黑白树 并查集
[BZOJ3319]黑白树 Description 给定一棵树,边的颜色为黑或白,初始时全部为白色.维护两个操作:1.查询u到根路径上的第一条黑色边的标号.2.将u到v 路径上的所有边的颜色设为 ...
随机推荐
- (转)OpenFire源码学习之二:Mina基础知识
转:http://blog.csdn.net/huwenfeng_2011/article/details/43413009 Mina概述 Apache MINA(Multipurpose Infra ...
- 比较器CompareTo的使用
比较器CompareTo的使用 源码 package test; import java.text.SimpleDateFormat; import java.util.Date; public cl ...
- CoreDump analyse
1 Found core dump files: -rw------- 1 root root 1019645952 Dec 14 01:56 core.7002-rw------- 1 root r ...
- Codeforces 340B - Maximal Area Quadrilateral (计算几何)
Codeforces Round #198 (Div. 2) 题目链接:Maximal Area Quadrilateral Iahub has drawn a set of \(n\) points ...
- PAT_A1016#Phone Bills
Source: PAT A1016 Phone Bills (25 分) Description: A long-distance telephone company charges its cust ...
- Django框架(八)—— 模板层:模板导入、模板继承、静态文件
目录 模板导入.继承.静态文件 一.模板导入 1.语法 2.使用 二.模板的继承 1.使用模板的继承 2.强调(注意点) 三.静态文件 1.在配置文件settings中配置过静态文件 2.导入使用静态 ...
- java-day22
数据库设计的范式 * 概念:设计数据库时,需要遵循的一些规范.要遵循后边的范式要求,必须先遵循前边的所有范式要求 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不 ...
- c# mvc 简洁大气官网---源码
结构
- linux6查看时间同步服务器的匹配源
当服务器时间与设定好的同步时间源的时间有差异的时候,一般都需要先查看本机的时间同步服务功能是否在正常的运转,以及同步的时间源是哪里,在这里为大家提供一个检查时间用的命令. linux/centos 6 ...
- 最基础知识 sql之left join、right join、inner join的区别
sql之left join.right join.inner join的区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括 ...