题目大意:给你一棵树,让你对叶节点分组,保证每组中,任意两个叶节点之间的距离不大于K,求最小的组数

手动yy的贪心竟然对的

对于每个节点,维护一个$ma[i]$,表示在$i$节点的子树内 未被分组的叶节点到$i$节点的最长距离

那么,对于每个节点,把它的子节点按照$ma[i]$排序,那么如果这个点的子树不需要额外的分组,就要保证最大的$ma[v1]$和次大的$ma[v2]$之间的距离小于等于K

如果不满足,说明需要对子树内的节点进行额外分组

根据贪心的思想,选择ma最大的子节点$v1$,那么就从小往大一直找满足$ma[v1]+ma[vj]<=K$的点,当不满足条件时,说明刚才找过的小节点和那个较大的节点可以分成一组。接下来,要看次大$v2$的点能否满足更次大$v3$能否满足$ma[v2]+ma[v3]<=K$,找到说明可行,回溯。否则要继续刚才的过程,直到剩余子节点之间的最长距离<=K

因为每个节点只会以这种方式被遍历到一次,所以并不需要二分

1号节点可能是叶节点,所以不能直接把1当成根

另外,如果根节点的ma>1,说明根节点还剩下一些节点没被分组,把它们分到一组即可

 #include <vector>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define ll long long
#define N 1001000
#define uint unsigned int
#define inf 0x3f3f3f3f3f3f3fll
using namespace std;
//re
int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=(ret<<)+(ret<<)+c-'';c=getchar();}
return ret*fh;
} int n,m,cte,num,S;
int head[N],fa[N],inc[N];
struct Edge{int to,nxt;}edge[N*]; void ae(int u,int v){
cte++;edge[cte].to=v,inc[v]++;
edge[cte].nxt=head[u],head[u]=cte;
} vector<int>to[N];
int ma[N];
int cmp(int x,int y){return ma[x]<ma[y];}
int solve(int u){
int ans=,l,r;
for(int j=head[u];j;j=edge[j].nxt)
{
int v=edge[j].to;
if(v==fa[u]) continue;
to[u].push_back(v);
ans+=solve(v);
}
int tot=to[u].size();
sort(to[u].begin(),to[u].end(),cmp);
if(!tot){ma[u]=;return ;}
if(tot==){ma[u]=ma[to[u][tot-]];}
else if(ma[to[u][tot-]]+ma[to[u][tot-]]<=m)
ma[u]=ma[to[u][tot-]];
else{
l=,r=tot-;
while(r>&&l<r&&ma[to[u][r]]+ma[to[u][r-]]>m){
for(;l<r&&ma[to[u][r]]+ma[to[u][l]]<=m;l++);
r--,ans++;
}ma[u]=ma[to[u][r]];
}ma[u]+=(ma[u]>?:);return ans;
} int main()
{
scanf("%d%d",&n,&m);
int x,y;
for(int i=;i<n;i++)
x=gint(),y=gint(),ae(x,y),ae(y,x);
for(int i=;i<=n;i++)
if(inc[i]!=) {S=i;break;}
dep[S]=,dfs1(S,-);
tp[S]=,dfs2(S);
int ans=solve(S);
if(ma[S]->) ans++;
printf("%d\n",ans);
return ;
}

CF1042F Leaf Sets (贪心+树上构造)的更多相关文章

  1. cf1042F. Leaf Sets(贪心)

    题意 题目链接 给出一棵树,删除一些边,使得任意联通块内的任意点距离不超过$k$ sol 考场上想的贪心是对的:考虑一棵子树,如果该子树内最深的两个节点的距离相加$>k$就删掉最深的那个点,向上 ...

  2. CodeForces 1042 F Leaf Sets 贪心

    Leaf Sets 题意:给你一棵树,树上有n个点,只有一条边的点叫做叶子,现在要求把所有的叶子分组,每个组内的所有叶子的距离都不能大于k. 题解: 我们可以随意找一个不是叶子的节点当做这颗树的根节点 ...

  3. [CF1042F]Leaf Sets

    题意:给定一棵$n$个点的树,将叶子节点分为数个集合使集合里点对最长距离不超过$k$,求最少集合数.($n\le1000000$) 首先我们可以想到,这道题并不是让你构造最优方案,因为只要把所有叶子节 ...

  4. 【CF1042F】Leaf Sets

    [CF1042F]Leaf Sets 题面 洛谷 题解 对于一个根节点\(x\),考虑其子树内的所有\(lca\)为它的叶子节点到它的距离\(d_1<d2<...<d_m\). 那么 ...

  5. CF 1042 F. Leaf Sets

    F. Leaf Sets http://codeforces.com/contest/1042/problem/F 题意: 将所有的叶子节点分配到尽量少的集合,一个可行的集合中两两叶子节点的距离< ...

  6. 「CF1042F」Leaf Sets

    传送门 Luogu 解题思路 比较显然的一种做法: 我们把一个点的子树高度抠出来并排序记为 \(L_i\),找到最大的 \(i\) 使得 \(L_{i-1}+L_i\le K\). 于是我们把前 \( ...

  7. CF #296 (Div. 1) B. Clique Problem 贪心(构造)

    B. Clique Problem time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  8. CF722D. Generating Sets[贪心 STL]

    D. Generating Sets time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  9. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) D. Generating Sets 贪心

    D. Generating Sets 题目连接: http://codeforces.com/contest/722/problem/D Description You are given a set ...

随机推荐

  1. vue 2.0 购物车小球抛物线

    备注:此项目模仿 饿了吗.我用的是最新的Vue, 视频上的一些写法已经被废弃了. 布局代码 <div class="ball-container"> <trans ...

  2. PHP学习总结(6)——PHP入门篇之PHP语句结束符

    PHP语句结束符 有的小伙伴们是不是已经注意在每一条PHP代码行结尾处都会有一个分号:.对的,这点注意,在PHP编程中需要在每条语句的末尾加入分号:.但要注意,分号:一定在半角状态下输入噢.

  3. [Asp.net]EF更新之后要 保存

    数据库那边保存表 项目里保存模型

  4. Apache负载均衡与Tomcat集群配置学习(Windows环境)

    本文主要参考自http://www.iteye.com/topic/985404?dhcc,经由实际操作配置操并记录而成. 由于最近的一个Java开发项目用到了Tomcat中间件作为web服务器,刚开 ...

  5. Grace Hopper 葛丽丝 霍普

    Grace Murray Hopper(1906-1992), COBOL之母, Debug之母, A ship in port is safe, but that is not what ships ...

  6. http协议区分头信息和正文

    http协议中的头信息和正文是採用空行分开,什么是空行呢?简单来说,就是\r\n\r\n. 所以将server返回的数据用\r\n\r\n分开后的结果,一个是头信息.一个是正文信息. C#的代码例如以 ...

  7. UVA 12124 UVAlive 3971 Assemble(二分 + 贪心)

    先从中找出性能最好的那个数, 在用钱比較少的去组合,能组出来就表明答案在mid的右边,反之在左边, #include<string.h> #include<map> #incl ...

  8. 微软ASP.NET网站部署指南(3):使用Web.Config文件的Transformations

    1. 综述 大多数程序里都会在Web.config里设置參数,而且在部署的时候须要更改. 每次都手工更改这些配置非常乏味,也easy出错. 该章节将会告诉你假设通过自己主动化更新Web.config文 ...

  9. 王立平--TF卡

    最终知道TF卡是什么了... TF卡又称microSD,是一种极细小的快闪存储器卡,由SanDisk(闪迪)公司发明创立. 这样的卡主要于手机使用.但因它拥有体积极小的长处,随着不断提升的容量. 它慢 ...

  10. 巧用select延时

    在LINUX用户态的情况下.假设想要延时的话.用sleep是最合适的,可是,在有些情况下,须要更小单位的延时,ms  us 也是要的.用循环获取到的延时是不精确的. 幸好,select函数巧用的话,是 ...