CF1946C Tree Cutting 题解
容易发现,如果连通块含有节点数的最小值为 \(x\),并且使用的刀数多于或等于 \(k\),那么 \(x\) 一定可以成为最后的结果。原因是我们可以通过减少一部分刀数,保留一个最小值的连通块,减少其他的刀数。由于 \(k\ge1\),所以一定可以保留一个最小值的连通块。
基于这一点,我们发现,连通块含有节点数的最小值为 \(x\) 具有单调性。因此,我们对 \(x\) 使用二分算法。
对于每一个 \(x\),我们考虑一种刀法。显然,我们需要使用最优的刀法。我们考虑如何最小化刀数。
我们通过深度优先搜索,在回溯的过程中,每当我们发现一个子树的节点数超过 \(x\),就直接割断它。可以发现这样做是最优的,因为一个子树的节点数超过 \(x\),已经构成了一个点数超过 \(x\) 的连通块,没有必要再往里面增加节点。
注意需要特判根节点的连通块点数小于 \(x\) 的情况,直接返回不可能。原因是在最优化的情况下都无法解决,其余情况更不能解决。
时间复杂度 \(O(n\log n)\)。
#include <bits/stdc++.h>
using namespace std;
struct edge
{
long long v,nxt;
}e[400000];
long long t,n,k,u,v,h[400000],cnt=0,tol=0,ans=0;
void add_edge(long long u,long long v)
{
e[++cnt].nxt=h[u];
e[cnt].v=v;
h[u]=cnt;
}
long long dfs(long long x,long long f,long long c)
{
long long siz=1;
for(int i=h[x];i;i=e[i].nxt)
if(e[i].v!=f)siz+=dfs(e[i].v,x,c);
if(siz>=c&&x!=1)
{
tol++;
return 0;
}
if(x==1&&siz<c&&tol==k)tol=0;
return siz;
}
int main()
{
scanf("%lld",&t);
while(t--)
{
scanf("%lld%lld",&n,&k);
ans=0,cnt=0;
for(int i=1;i<=n;i++)h[i]=0;
for(int i=1;i<=n-1;i++)
{
scanf("%lld%lld",&u,&v);
add_edge(u,v),add_edge(v,u);
}
long long l=1,r=n;
while(l<=r)
{
long long mid=(l+r)>>1;
tol=0,dfs(1,0,mid);
if(tol>=k)ans=mid,l=mid+1;
else r=mid-1;
}
printf("%lld\n",ans);
}
return 0;
}
CF1946C Tree Cutting 题解的更多相关文章
- 【HDU 5909】 Tree Cutting (树形依赖型DP+点分治)
Tree Cutting Problem Description Byteasar has a tree T with n vertices conveniently labeled with 1,2 ...
- BZOJ3391: [Usaco2004 Dec]Tree Cutting网络破坏
3391: [Usaco2004 Dec]Tree Cutting网络破坏 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 47 Solved: 37[ ...
- 3391: [Usaco2004 Dec]Tree Cutting网络破坏
3391: [Usaco2004 Dec]Tree Cutting网络破坏 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 76 Solved: 59[ ...
- 【HDU5909】Tree Cutting(FWT)
[HDU5909]Tree Cutting(FWT) 题面 vjudge 题目大意: 给你一棵\(n\)个节点的树,每个节点都有一个小于\(m\)的权值 定义一棵子树的权值为所有节点的异或和,问权值为 ...
- HDU 5909 Tree Cutting 动态规划 快速沃尔什变换
Tree Cutting 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5909 Description Byteasar has a tree T ...
- BZOJ 3391: [Usaco2004 Dec]Tree Cutting网络破坏( dfs )
因为是棵树 , 所以直接 dfs 就好了... ---------------------------------------------------------------------------- ...
- Tree Cutting
Tree Cutting Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/131072 K (Java/Others) Prob ...
- hdu 5909 Tree Cutting [树形DP fwt]
hdu 5909 Tree Cutting 题意:一颗无根树,每个点有权值,连通子树的权值为异或和,求异或和为[0,m)的方案数 \(f[i][j]\)表示子树i中经过i的连通子树异或和为j的方案数 ...
- POJ 2378.Tree Cutting 树形dp 树的重心
Tree Cutting Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4834 Accepted: 2958 Desc ...
- POJ 2378 Tree Cutting 3140 Contestants Division (简单树形dp)
POJ 2378 Tree Cutting:题意 求删除哪些单点后产生的森林中的每一棵树的大小都小于等于原树大小的一半 #include<cstdio> #include<cstri ...
随机推荐
- PriorityQueue作用和源码
一.PriorityQueue作用和源码 PriorityQueue跟前几个阻塞队列不一样,并没有实现BlockingQueue接口,只是实现了Queue接口,Queue接口中定义了几组放数据和取数据 ...
- VSCode输出框中文乱码问题
vscode输出中文的时候,总是出现乱码.找了一个一劳永逸解决问题的方法,转载的,原教程地址:https://blog.csdn.net/a19990412/article/details/90270 ...
- grequests,并发执行接口请求的方法(简易版)
有时候需要处理很多请求,显然,一个一个去处理是要花费很多时间的 我们就需要用到并发的方式,python并发请求的方法很多,从简单到复杂. 本案例,介绍一个超级简单,使用grequests库,实现并发请 ...
- Java 单元测试简单扫盲
前言 仔细回想起来,上次认真编写单元测试已经是两年前的事了.那时候觉得写单元测试是种负担. 为了应付代码覆盖率要求,常常依赖工具自动生成测试用例,有时需要启动Spring容器,有时又不需要(当时还分不 ...
- Vue3 中的5种常见的组件传值方式,Vue3事件总线(无需插件)
Vue3 中常见的组件传值方式: Props:这是 Vue 中最常见的组件传值方式,即在父组件中定义 prop 并将数据传递给子组件. Event Bus:可以通过事件总线在两个组件之间进行通信,即定 ...
- 记一次SQL隐式转换导致精度丢失问题的排查 → 不规范就踩坑
开心一刻 刚毕业的侄子给我发消息侄子:叔,人生太难了我:怎么呢?侄子:工作太难了,感情也太难了,怎么什么都这么难我:你还小啊侄子:大了就不难了?我:大了你就习惯了 问题复现 先准备表:数据源( tbl ...
- windows 滑动关机
可以参考:https://zhuanlan.zhihu.com/p/90087401
- ModelForm验证实例
程序目录 models.py from django.db import models# Create your models here.class UserType(models.Model): ...
- C#中扩展方法无法获得多态性的行为
在C#中,扩展方法(Extension Methods)是一种用于给现有类型添加新方法的技术.但是,扩展方法无法实现多态性的行为,因为它们是静态方法,它们的行为是在编译时确定的,而不是在运行时. 多态 ...
- Add Two Numbers--LeetCode进阶路②
题目描述: You are given two non-empty linked lists representing two non-negative integers. The digits ar ...