题目

不难发现有一个暴力\(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. 用java进行测试php写的接口

    <?php /* * @Author: anchen * @Date: 2018-07-06 13:53:19 * @Last Modified by: anchen * @Last Modif ...

  2. git分布式版本控制系统权威指南学习笔记(三):简单了解git对象、head以及sha1sum

    文章目录 git对象(简单了解) 对象是存在哪里的? head和master分支 上面的hash值怎么来的? git对象(简单了解) 每次提交都有tree.parent.author.committe ...

  3. c#网络通信框架networkcomms内核解析之一 消息传送2

    networkcomms.net 来自英国的网络通信框架 官方网址 www.networkcomms.net 中文网址www.networkcomms.cn 在网络通信程序中,本地的类或者对象,要传输 ...

  4. 1、siege安装

    1.下载最新版本的siege wget http://download.joedog.org/siege/siege-latest.tar.gz 2.解压并进入siege路径 tar -zxvf si ...

  5. 剑指offer第二版面试题2:数组中重复的数字(JAVA版)

    题目:在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的.请找出数组中任意一个重复的数字,但是不能修改输入的数组.例如,如果输入长度为8的数组{2,3,5,4,3 ...

  6. LeetCode K个一组翻转链表

    题目链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/ 题目大意 略. 分析 逆转每一段,然后和上一段与下一段衔接即可,加头结点 ...

  7. 专题:LFS构建逻辑理解

    严格来说,LFS只能称为“pseudo LFS”,WHY? 因为LFS归根结底,还是基于已有的操作系统平台构建而来,并非真正的从0开始,它没有突破所谓“鸡与蛋”的死循环:但它确实有助于理解Linux的 ...

  8. Netty 源码学习——客户端流程分析

    Netty 源码学习--客户端流程分析 友情提醒: 需要观看者具备一些 NIO 的知识,否则看起来有的地方可能会不明白. 使用版本依赖 <dependency> <groupId&g ...

  9. background-size的值cover、contain和100%

    图1 给一个宽600px,高600px的div添加一张宽480px,高360px的背景图片.不重复显示的情况下,默认显示为图1. 1.background-size: 100% 100%; 会将图片的 ...

  10. 008-Java的StringBuilder和StringBuffer

    StringBuffer 和 StringBuilder 与String的不同 String Java中十分重要的类;被声明为final class.除了hash这个属性, 其他属性也均声明为fina ...