[CF1042F]Leaf Sets
题意:给定一棵$n$个点的树,将叶子节点分为数个集合使集合里点对最长距离不超过$k$,求最少集合数。($n\le1000000$)
首先我们可以想到,这道题并不是让你构造最优方案,因为只要把所有叶子节点的集合任意合并至无法操作,就一定是最优答案了
这个感性理解一下就是那么回事,我一开始做的时候就想到的
然后其实我们把叶子结点向上合并即可,只要子树内两个集合的距离不超过$k$,就把他们合起来,记成到当前点距离较大的那个集合
这样对于子树两两合并,我们可以用启发式合并的堆来实现,复杂度是$nlog^2n$,并不足以通过这道题
再想想看,其实如果一个集合和当前最小的集合已经无法合并了,就不用再往上推了,因为上边的集合的最远点只会更远,所以把这个集合留住在这,答案加一
然后我们可以把子树内两个集合的距离不超过$k$的集合合并起来,这样我们每次向上传递的只有一个集合了,复杂度$nlogn$
就从一道大数据结构题变成了一道思维难度更大的题了
代码:
#include<iostream>
#include<cstdio>
#include<queue>
#define M 1000010
using namespace std;
int read()
{
char ch=getchar();int x=;
while(ch>''||ch<'') ch=getchar();
while(ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x;
}
int n,num,ans,k;
int head[M],in[M];
struct point{int to,next;}e[M<<];
void add(int from,int to)
{
e[++num].next=head[from];
e[num].to=to;
head[from]=num;
}
int dfs(int x,int fa)
{
if(in[x]==) return ;
priority_queue<int>q;
for(int i=head[x];i;i=e[i].next)
{
int to=e[i].to;
if(to==fa) continue;
q.push(dfs(to,x)+);
}
int maxn=q.top();q.pop();
while(!q.empty())
{
if(q.top()+maxn<=k) return maxn;
ans++;
maxn=q.top();
q.pop();
}
return maxn;
}
int main()
{
n=read(); k=read();
for(int i=;i<n;i++)
{
int a=read(),b=read();
add(a,b); add(b,a);
in[a]++; in[b]++;
}
for(int i=;i<=n;i++) if(in[i]!=){dfs(i,);break;}
printf("%d",ans+);
return ;
}
[CF1042F]Leaf Sets的更多相关文章
- cf1042F. Leaf Sets(贪心)
题意 题目链接 给出一棵树,删除一些边,使得任意联通块内的任意点距离不超过$k$ sol 考场上想的贪心是对的:考虑一棵子树,如果该子树内最深的两个节点的距离相加$>k$就删掉最深的那个点,向上 ...
- CF1042F Leaf Sets (贪心+树上构造)
题目大意:给你一棵树,让你对叶节点分组,保证每组中,任意两个叶节点之间的距离不大于K,求最小的组数 手动yy的贪心竟然对的 对于每个节点,维护一个$ma[i]$,表示在$i$节点的子树内 未被分组的叶 ...
- 【CF1042F】Leaf Sets
[CF1042F]Leaf Sets 题面 洛谷 题解 对于一个根节点\(x\),考虑其子树内的所有\(lca\)为它的叶子节点到它的距离\(d_1<d2<...<d_m\). 那么 ...
- CF 1042 F. Leaf Sets
F. Leaf Sets http://codeforces.com/contest/1042/problem/F 题意: 将所有的叶子节点分配到尽量少的集合,一个可行的集合中两两叶子节点的距离< ...
- CodeForces 1042 F Leaf Sets 贪心
Leaf Sets 题意:给你一棵树,树上有n个点,只有一条边的点叫做叶子,现在要求把所有的叶子分组,每个组内的所有叶子的距离都不能大于k. 题解: 我们可以随意找一个不是叶子的节点当做这颗树的根节点 ...
- 「CF1042F」Leaf Sets
传送门 Luogu 解题思路 比较显然的一种做法: 我们把一个点的子树高度抠出来并排序记为 \(L_i\),找到最大的 \(i\) 使得 \(L_{i-1}+L_i\le K\). 于是我们把前 \( ...
- Leaf Sets CodeForces - 1042F (树,最小划分)
大意: 给定树, 求叶子的最小划分, 使得每个划分内任意两个叶子距离不超过k. 任选一个非叶结点, 贪心合并. #include <iostream> #include <sstre ...
- [CF]Round510
由于我的codeforces的帐号登不上,所以我错过了这场比赛,只好赛后再抄题解自己做. A Benches 最大的情况就是所有人都挤在那个人最多的长椅上,最小的情况是所有人尽量平均的坐. #incl ...
- TOJ 4008 The Leaf Eaters(容斥定理)
Description As we all know caterpillars love to eat leaves. Usually, a caterpillar sits on leaf, eat ...
随机推荐
- SAS9.4安装
安装教程请查看博客https://blog.csdn.net/qq_38960682/article/details/80567686 启动SAS时就报下面的错了:WARNING: 连接逻辑库“SAS ...
- 解决IOS7在TableView 被导航栏挡住的BUG!!
self.edgesForExtendedLayout = UIRectEdgeNone; 就这么简单!
- Windows平台下解决Oracle12c使用PDB数据库创建SDE的问题 分类: oracle sde 2015-06-12 11:03 88人阅读 评论(0) 收藏
Windows平台下解决Oracle12c使用PDB数据库创建SDE的问题 Oracle 12C中引入了CDB与PDB的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant ...
- Golang开发支持平滑升级(优雅重启)的HTTP服务
Golang开发支持平滑升级(优雅重启)的HTTP服务 - tabalt的博客 http://tabalt.net/blog/graceful-http-server-for-golang/ http ...
- Python量化常用函数
# -*- coding: utf-8 -*- # @Author: fangbei # @Date: 2017-08-26 # @Original: price_str = '30.14, 29.5 ...
- git学习——<五>git分支
git学习——<一>git安装 git学习——<二>git配置文件 git学习——<三>git操作 git学习——<四>git版本管理 一.提出问题 今 ...
- python widows安裝scipy
https://blog.csdn.net/github_39611196/article/details/76718707 Python3.x直接运行pip install scipy即可.Pyth ...
- alexnet,VGG,googlenet,resnet
非常好的一篇:https://my.oschina.net/u/876354/blog/1637819 alexnet和VGG没什么特别的,VGG深一些. Deep learning 实际上是一种 f ...
- 【JVM】启动脚本的参数设置
dump文件生成 JVM会在遇到OutOfMemoryError时拍摄一个“堆转储快照”,并将其保存在一个文件中. 1.配置方法 在JAVA_OPTIONS变量中增加 -XX:+HeapDumpOnO ...
- Flask-Session SQLAlchemy Script Migrate wtforms
Flask-session Flask-session跟框架自带的session有什么区别呢~ 框架自带的session是通过请求上下文~放入到Local中的~那如果我们想把session放入别的地方 ...