bzoj 2097: [Usaco2010 Dec]Exercise 奶牛健美操【二分+树形dp】
二分答案,然后dp判断是否合法
具体方法是设f[u]为u点到其子树中的最长链,每次把所有儿子的f值取出来排序,如果某两条能组合出大于mid的链就断掉f较大的一条
a是全局数组!!所以要先dfs完子树才能填a!!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1000005;
int n,m,h[N],cnt,f[N],a[N];
struct qwe
{
    int ne,to;
}e[N<<1];
int read()
{
    int r=0,f=1;
    char p=getchar();
    while(p>'9'||p<'0')
    {
        if(p=='-')
            f=-1;
        p=getchar();
    }
    while(p>='0'&&p<='9')
    {
        r=r*10+p-48;
        p=getchar();
    }
    return r*f;
}
void add(int u,int v)
{
    cnt++;
    e[cnt].ne=h[u];
    e[cnt].to=v;
    h[u]=cnt;
}
int dfs(int u,int fa,int w)
{
    int tot=0,r=0,l;
    for(int i=h[u];i;i=e[i].ne)
        if(e[i].to!=fa)
            r+=dfs(e[i].to,u,w);
    for(int i=h[u];i;i=e[i].ne)
        if(e[i].to!=fa)
        {
            if(f[e[i].to]+1>w)
                r++;
            else
                a[++tot]=f[e[i].to];
        }
    if(!tot)
        return r;
    sort(a+1,a+1+tot);
    l=tot;
    while(l>1&&a[l]+a[l-1]+2>w)
        l--,r++;
    f[u]=a[l]+1;
    return r;
}
bool ok(int w)
{
    memset(f,0,sizeof(f));
    // cerr<<dfs(1,0,w)<<" "<<w<<endl;
    // for(int i=1;i<=n;i++)
        // cerr<<f[i]<<" ";
    // cerr<<endl;
    return dfs(1,0,w)<=m;
}
int main()
{
    n=read(),m=read();
    for(int i=1;i<n;i++)
    {
        int x=read(),y=read();
        add(x,y),add(y,x);
    }
    int l=0,r=n-1,ans;
    while(l<=r)
    {
        int mid=(l+r)>>1;
        if(ok(mid))
            r=mid-1,ans=mid;
        else
            l=mid+1;
    }
    printf("%d\n",ans);
    return 0;
}
bzoj 2097: [Usaco2010 Dec]Exercise 奶牛健美操【二分+树形dp】的更多相关文章
- BZOJ 2097: [Usaco2010 Dec]Exercise 奶牛健美操 二分 + 贪心 + 树上问题
		Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in",& ... 
- BZOJ 2097  [Usaco2010 Dec]Exercise 奶牛健美操
		[题意] 给出一棵树.现在可以在树中删去m条边,使它变成m+1棵树.要求最小化树的直径的最大值. [题解] 二分答案.$Check$的时候用$DP$,记录当前节点每个儿子的直径$v[i]$,如果$v[ ... 
- BZOJ——T 2097: [Usaco2010 Dec]Exercise 奶牛健美操
		http://www.lydsy.com/JudgeOnline/problem.php?id=2097 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: ... 
- 【bzoj2097】[Usaco2010 Dec]Exercise 奶牛健美操  二分+贪心
		题目描述 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点之间恰好有一条简单路径. ... 
- BZOJ_2097_[Usaco2010 Dec]Exercise 奶牛健美操_二分答案+树形DP
		BZOJ_2097_[Usaco2010 Dec]Exercise 奶牛健美操_二分答案+树形DP Description Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的 ... 
- [Usaco2010 Dec]Exercise 奶牛健美操
		[Usaco2010 Dec]Exercise 奶牛健美操 题目 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连 ... 
- [bzoj2097][Usaco2010 Dec]Exercise 奶牛健美操_贪心_树形dp_二分
		Exercise bzoj-2097 Usaco-2010 Dec 题目大意:题目链接 注释:略. 想法:题目描述生怕你不知道这题在考二分. 关键是怎么验证?我们想到贪心的删边. 这样的策略是显然正确 ... 
- BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会 树形DP
		[Usaco2010 Mar]gather 奶牛大集会 Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会.每个奶牛居住在 N(1 ... 
- BZOJ2097: [Usaco2010 Dec]Exercise 奶牛健美操 贪心+伪树dp+二分
		//论全局变量的杀伤力....QAQ#include<cstdio> #include<iostream> #include<cstdlib> #include&l ... 
随机推荐
- Webdriver测试脚本1(打开网页并打印标题)
			案例: 启动火狐浏览器 首页打开博客园页面,打印网页标题,等待3秒 打开百度首页,打印网页标题,再等待2秒 关闭浏览器 from selenium import webdriver from time ... 
- POJ-1274The Perfect Stall,二分匹配裸模板题
			The Perfect Stall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 23313 Accepted: 103 ... 
- 前端开发:JavaScript---DOM & BOM
			DOM:Document Object Model 文档对象类型 模态框案例 <!DOCTYPE html> <html lang="en"> <h ... 
- 从零开始写STL-容器-双端队列
			从零开始写STL-容器-双端队列 什么是双端队列?在介绍vector源码,我们发现在vector前端插入元素往往会引起大量元素的重新分配,双端队列(deque)就是为了解决这一问题,双端队列中在首端和 ... 
- SOJ 2930_积木城堡
			[题意]若干个城堡,给定每个城堡的积木数及每块积木的棱长.从城堡中抽出积木使每块城堡高度相同,求最大高度 [分析]城堡的积木选择可以看成01背包问题,从最矮的城堡高度开始依次递减,求出使每个背包都能装 ... 
- [bzoj2506]calc_分块处理
			calc bzoj-2506 题目大意:给一个长度为n的非负整数序列A1,A2,…,An.现有m个询问,每次询问给出l,r,p,k,问满足l<=i<=r且Ai mod p = k的值i的个 ... 
- P1160 队列安排   洛谷
			https://www.luogu.org/problem/show?pid=1160 题目描述 一个学校里老师要将班上N个同学排成一列,同学被编号为1-N,他采取如下的方法: 1.先将1号同学安排进 ... 
- Ext-js使用指南(总结)
			一.获取元素(Getting Elements) 1.Ext.get var el = Ext.get('myElementId');//获取元素,等同于document.getElementById ... 
- Java正则表达式过滤出字母、数字和中文
			原文:http://blog.csdn.net/k21325/article/details/54090066 1.Java中过滤出字母.数字和中文的正则表达式 (1)过滤出字母的正则表达式 [^(A ... 
- 纤程(FIBER)
			Indy 10 还包含对纤程的支持.纤程是什么?简单来说,它也是 一个“线程”,但是它是由代码控制的,而不是由操作系统控制的.实际上,可以认为线程 是一个高级纤程.纤程和 Unix 用户线程(Unix ... 
