Exercise bzoj-2097 Usaco-2010 Dec

题目大意题目链接

注释:略。


想法:题目描述生怕你不知道这题在考二分。

关键是怎么验证?我们想到贪心的删边。

这样的策略是显然正确的。

之后树形dp的时候维护一下就行。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100010
using namespace std;
inline char nc() {static char *p1,*p2,buf[100000]; return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}
int rd() {int x=0; char c=nc(); while(!isdigit(c)) c=nc(); while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=nc(); return x;}
int to[N<<1],nxt[N<<1],head[N],tot;
int cnt,max_dis[N],a[N];
inline void add(int x,int y)
{
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
inline bool cmp(int x,int y) {return x>y;}
void dfs(int pos,int fa,int limit)
{
bool flag=false;
max_dis[pos]=0;
for(int i=head[pos];i;i=nxt[i])
{
if(to[i]==fa) continue;
flag=true;
dfs(to[i],pos,limit);
max_dis[pos]=max(max_dis[pos],max_dis[to[i]]+1);
}
if(!flag) {max_dis[pos]=0; return;}
a[0]=0;
for(int i=head[pos];i;i=nxt[i])
{
if(to[i]==fa) continue;
a[++a[0]]=max_dis[to[i]]+1;
}
sort(a+1,a+a[0]+1,cmp);
for(int i=1;i<a[0];i++)
{
if(a[i]+a[i+1]>limit) cnt++,a[i]=0;
}
if(a[a[0]]>limit) cnt++,a[a[0]]=0;
sort(a+1,a+a[0]+1,cmp);
max_dis[pos]=a[1];
}
int n,m;
int calc(int limit)
{
cnt=0;
dfs(1,0,limit);
return cnt;
}
int find()
{
int l=0,r=n-1,ans=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(calc(mid)<=m) ans=mid,r=mid-1;
else l=mid+1;
}
return ans;
}
int main()
{
n=rd(),m=rd();
int x,y;
for(int i=1;i<n;i++)
{
x=rd(),y=rd();
add(x,y),add(y,x);
}
printf("%d\n",find());
}

小结:有意思...这种题发现直接上东西很艰难,有时候贪心可以适当地在我们的考虑范围之内。

[bzoj2097][Usaco2010 Dec]Exercise 奶牛健美操_贪心_树形dp_二分的更多相关文章

  1. BZOJ2097 [Usaco2010 Dec]Exercise 奶牛健美操 贪心

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2097 题解 显然二分一个 \(mid\) 表示每一块的直径长度的最大值,求最少需要多少连通块. ...

  2. BZOJ2097: [Usaco2010 Dec]Exercise 奶牛健美操 贪心+伪树dp+二分

    //论全局变量的杀伤力....QAQ#include<cstdio> #include<iostream> #include<cstdlib> #include&l ...

  3. BZOJ2097: [Usaco2010 Dec]Exercise 奶牛健美操

    n<=100000的树,砍S<n条边,求砍完后S+1棵树的最大直径的最小值. 树的直径要小小哒,那考虑一棵子树的情况吧!一棵子树的直径,就是子树根节点各儿子的最大深度+次大深度.就下面这样 ...

  4. BZOJ_2097_[Usaco2010 Dec]Exercise 奶牛健美操_二分答案+树形DP

    BZOJ_2097_[Usaco2010 Dec]Exercise 奶牛健美操_二分答案+树形DP Description Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的 ...

  5. [Usaco2010 Dec]Exercise 奶牛健美操

    [Usaco2010 Dec]Exercise 奶牛健美操 题目 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连 ...

  6. 【bzoj2097】[Usaco2010 Dec]Exercise 奶牛健美操 二分+贪心

    题目描述 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点之间恰好有一条简单路径. ...

  7. BZOJ 2097: [Usaco2010 Dec]Exercise 奶牛健美操 二分 + 贪心 + 树上问题

    Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in",& ...

  8. BZOJ——T 2097: [Usaco2010 Dec]Exercise 奶牛健美操

    http://www.lydsy.com/JudgeOnline/problem.php?id=2097 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit:  ...

  9. bzoj 2097: [Usaco2010 Dec]Exercise 奶牛健美操【二分+树形dp】

    二分答案,然后dp判断是否合法 具体方法是设f[u]为u点到其子树中的最长链,每次把所有儿子的f值取出来排序,如果某两条能组合出大于mid的链就断掉f较大的一条 a是全局数组!!所以要先dfs完子树才 ...

随机推荐

  1. 【洛谷2617_BZOJ1901】Dynamic Rankings(树套树)

    题目: 洛谷 2617 BZOJ 1901 是权限题,\(n=10^4\) ,内存 128 MB :洛谷 2617 \(n=10^5\) ,内存 1024 MB ,数据比较坑. 分析: 蒟蒻初学树套树 ...

  2. js实现水波纹背景

    <!DOCTYPE html> <html> <head> <title>水波背景</title> <meta charset=&qu ...

  3. 377 Combination Sum IV 组合之和 IV

    Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...

  4. mysql之replace into与 insert into duplicat key for update

    mysql实际应用中,我们在插入数据的时候,经常遇到主键冲突的情况,这是因为库中已经存在相同主键的数据,这时,我们只能更新数据:在判断是更新数据还是插入数据,我们还需要在此之前做一些必要的判断:在my ...

  5. scla-基础-函数-元组(0)

    //元组 class Demo2 extends TestCase { def test_create_^^(){ val yuana = (1,true,1.2,"c",&quo ...

  6. Linux shell命令之cat

    cat:查看文件的内容.连接文件.创建一个或多个文件和重定向输出到终端或文件  用法:cat [选项] [文件] 1. $ cat hello.txt 显示hello.txt文本文件中的内容 2. $ ...

  7. jquery.ajax之beforeSend方法使用介绍

    常见的一种效果,在用ajax请求时,没有返回前会出现前出现一个转动的loading小图标或者“内容加载中..”,用来告知用户正在请求数据.这个就可以用beforeSend方法来实现. 下载demo:a ...

  8. CAD使用GetXData读数据(网页版)

    主要用到函数说明: MxDrawEntity::GetXData 返回实体的扩展数据. js代码实现如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 ...

  9. JAVA程序员面试笔试宝典3

    1.什么是线程?它与进程有什么区别?为什么要使用多线程 线程是指程序在执行过程中,能够执行程序代码的一个执行单元.进程是指一段正在执行的程序. 使用多线程可以减少程序的相应时间 与进程相比,线程的创建 ...

  10. 代码静态分析工具-splint的学习与使用[转]

    代码静态分析工具--splint的学习与使用[转] 引言 最近在项目中使用了静态程序分析工具PC-Lint,体会到它在项目实施中带给开发人员的方便.PC-Lint是一款针对C/C++语言.window ...