题目

不难发现有一个暴力\(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<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】被删除的黑白树的更多相关文章

  1. 【uoj#139】[UER #4]被删除的黑白树 贪心

    题目描述 给出一个 $n$ 个节点的树,$1$ 号点为根.现要将其中一些点染成黑色,使得每个叶子节点(不包括根节点)到根节点路径上的黑点数相同.求最多能够染多少个黑点. 题解 贪心 显然有结论:选择的 ...

  2. uoj #139. 【UER #4】被删除的黑白树 dfs序 贪心

    #139. [UER #4]被删除的黑白树 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/139 Descript ...

  3. 【UOJ139】【UER #4】被删除的黑白树(贪心)

    点此看题面 大致题意: 请你给一棵树黑白染色,使每一个叶结点到根节点的路径上黑节点个数相同. 贪心 显然,按照贪心的思想,我们要让叶结点到根节点的路径上黑节点的个数尽量大. 我们可以用\(Min_i\ ...

  4. 【UOJ139】【UER #4】被删除的黑白树

    题意: 很久很久以前,有一棵树加入了 UOJ 群. 这天,在它讨论“一棵树应该怎么旋转”的时候一不小心被删除了,变成了被删除的树. 突然间,它突然发现它失去了颜色,变成了一棵纯白的树.这让它感觉很焦躁 ...

  5. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  6. 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...

  7. [BZOJ 3319] 黑白树

    3319: 黑白树 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 557  Solved: 194[Submit][Status][Discuss] ...

  8. CodeM美团点评编程大赛初赛B轮 黑白树【DFS深搜+暴力】

    [编程题] 黑白树 时间限制:1秒 空间限制:32768K 一棵n个点的有根树,1号点为根,相邻的两个节点之间的距离为1.树上每个节点i对应一个值k[i].每个点都有一个颜色,初始的时候所有点都是白色 ...

  9. 【BZOJ3319】黑白树 并查集

    [BZOJ3319]黑白树 Description 给定一棵树,边的颜色为黑或白,初始时全部为白色.维护两个操作:1.查询u到根路径上的第一条黑色边的标号.2.将u到v    路径上的所有边的颜色设为 ...

随机推荐

  1. error LNK2019: 无法解析的外部符号 __imp__GetStockObject@4该符号在函数_WinMain@16 中被引用

    编译链接报错 error LNK2019: 无法解析的外部符号 __imp__GetStockObject@4该符号在函数_WinMain@16 中被引用 解决方案: 在代码中添加链接库gdi32.l ...

  2. 搭建单机版spark

    二.下载软件 JDK,Scala,SBT,Maven 版本信息如下: JDK jdk-7u79-linux-x64.gz Scala scala-2.10.5.tgz 三.解压上述文件并进行环境变量配 ...

  3. 通过adb命令查看SN、CID码等信息

      用ADB命令来查看自己手机的相关硬件以及其他的参数信息,相信许多机友已经早已查看过,而新入门感兴趣的机友可以尝试一下. 运用这些ADB命令可以很直观的查看到你手机上的硬件与软件方面的详细信息. 下 ...

  4. C# 中如何输出双引号(转义字符的使用)

    实现效果: 输出这样的一个含有双引号的字符串 "hello" 方式一: 不用 @ 时转义      System.Console.WriteLine("\"he ...

  5. KMP概念上小结

    kmp算法的时间复杂度是O(m+n) 主要作用: 1.最长公共前后缀问题 2.原串中含有几个模式串问题 3.循环节问题

  6. maven surefire入门

    一.maven常用命令: mvn compile mvn install mvn test mvn clean mvn dependency:resolve -X   #查看完整的debug信息!!! ...

  7. Kibana < 6.6.1 代码执行漏洞复现CVE-2019-7609

    登陆kibana poc .es(*).props(label.__proto__.env.AAAA='require("child_process").exec("ba ...

  8. Java缓冲区读写

    缓冲区读 有两种方法从缓冲区读取数据: 绝对位置 相对位置 使用四个版本重载的get()方法用于从缓冲区读取数据. get(int index)返回给定索引处的数据. get()从缓冲区中的当前位置返 ...

  9. SOA(面向服务的体系结构)

    SOA(面向服务的体系结构) 面向服务的体系结构是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来.接口是采用中立的方式进行定义的,它应该独立于实现服务 ...

  10. tomcat服务器和HTTP协议

    tomcat:一个服务器的服务器软件,发布资源要用的 服务器组成: 1.服务器硬件 2.服务器软件 3.项目(一堆资源的集合) 4.资源tomcat本身是一个java程序,必须依赖jre运行eclip ...