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 ...
随机推荐
- Google发布A2A开源协议:“MCP+A2A”成未来标配?
就在刚刚Google Cloud Next 25大会上,谷歌重磅开源Agent2Agent(A2A)协议,这项被类比为"AI界的HTTP协议"的技术标准,彻底打破了智能体间的信息孤 ...
- Windows开机执行bat脚本
1.编写好bat脚本 2.将脚本复制到: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
- app自动化设计
一.在pom.xml引入依赖 testng:测试框架用例管理 appium:需要用到appium log4j:日志集成 allure:生成报告 二.po分层 分为基础层,page层,用例层,xml文件 ...
- symfony4.4加密密码时报错Libsodium is not available. You should either install the sodium extension, upgrade
报错: "Libsodium is not available. You should either install the sodium extension, upgrade to PHP ...
- 在Python后端项目FastApi中使用MongoDB进行数据处理
我在前面随笔<在SqlSugar的开发框架中增加对低代码EAV模型(实体-属性-值)的WebAPI实现支持>中介绍了对于EAV数据存储的时候,我们把变化字段的数据记录存储在MongoDB数 ...
- Hadoop和Spark大数据挖掘与实战
1.概述 本节将系统讲解大数据分析的完整流程,包括数据采集.预处理.存储管理.分析挖掘与结果可视化等核心环节.与此同时,我们还将对主流数据分析工具进行横向对比,帮助读者根据实际需求选用最合适的工具,提 ...
- 一行代码搞定防抖节流:JavaScript新特性解析
防抖(Debounce)和节流(Throttle)是两种前端开发中常用的性能优化技术,尤其在处理高频触发事件如滚动.调整窗口大小.输入等场景中.传统实现这些功能需要编写复杂的函数,但随着JavaScr ...
- WPF封装一个懒加载下拉列表控件(支持搜索)
因为项目中PC端前端针对基础数据选择时的下拉列表做了懒加载控件,PC端使用现成的组件,为保持两端的选择方式统一,WPF客户端上也需要使用懒加载的下拉选择. WPF这种懒加载的控件未找到现成可用的组件, ...
- 信息资源管理文字题之“航空集团从哪些方面改变企业的IT服务”
一.材料:某航空集团公司拥有一个地域分散.多厂商.多平台.多系统的复杂IT环境.IT系统运行复杂,业务系统故障多,技术人员的被动工作方式难以适应企业IT服务需要. 要求:是运用IT服务管理关联只是为该 ...
- 正点原子ALPHA开发板使用4.3寸触摸屏LCD驱动实验显示不正常
显示问题 裸机开发时,驱动教程的PDF里给了4.3寸LCD屏幕的设置参数.如下图所示: 但是按照这个设置,编写设备树dts文件,下载到开发板里,却出现了显示异常,具体来说就是帧率不对,图和字都是歪斜的 ...