/*codevs 3279 二分+dfs贪心检验 堆版本 re一个 爆栈了*/
#include<cstdio>
#include<queue>
#include<cstring>
#define pa pair<int,int>
#define mk make_pair
#define X first
#define Y second
#define maxn 100010
using namespace std;
int n,S,num,head[maxn],ans,f[maxn],mid,sum;
struct node{
int v,pre;
}e[maxn*];
priority_queue<pa>q;
int init(){
int x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
void Add(int from,int to){
num++;e[num].v=to;
e[num].pre=head[from];
head[from]=num;
}
void Dfs(int u,int from){
int cnt=;
for(int i=head[u];i;i=e[i].pre){
int v=e[i].v;if(v==from)continue;
Dfs(v,u);cnt++;
}
if(cnt==)return;
while(!q.empty())q.pop();
for(int i=head[u];i;i=e[i].pre){
int v=e[i].v;if(v==from)continue;
q.push(mk(f[v],v));
}
while(q.size()>=){
int x=q.top().X,xi=q.top().Y;q.pop();
int y=q.top().X,yi=q.top().Y;q.pop();
if(x+y+>mid){
f[xi]=;q.push(mk(y,yi));sum++;
}
else {
q.push(mk(x,xi));q.push(mk(y,yi));break;
}
}
if(q.size()==&&q.top().X+>mid){
f[q.top().Y]=;sum++;q.pop();
}
int mx=;
if(q.size())mx=q.top().X+;
f[u]=mx;
}
bool Judge(){
memset(f,,sizeof(f));
sum=;Dfs(,);
return sum<=S;
}
int main()
{
n=init();S=init();int u,v;
for(int i=;i<n;i++){
u=init();v=init();
Add(u,v);Add(v,u);
}
int l=,r=0x3f3f3f3f;
while(l<=r){
mid=l+r>>;
if(Judge()){
r=mid-;ans=mid;
}
else l=mid+;
}
printf("%d\n",ans);
return ;
}
/*codevs 3279 二分+dfs贪心检验 数组版本*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100010
using namespace std;
int n,S,num,head[maxn],ans,f[maxn],mid,sum;
struct node{
int v,pre;
}e[maxn*];
struct C{
int o,val;
bool operator < (const C &x)const{
return val>x.val;
}
}p[maxn];
int init(){
int x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
void Add(int from,int to){
num++;e[num].v=to;
e[num].pre=head[from];
head[from]=num;
}
void Dfs(int u,int from){
int cnt=;
for(int i=head[u];i;i=e[i].pre){
int v=e[i].v;if(v==from)continue;
Dfs(v,u);cnt++;
}
if(cnt==)return;cnt=;
for(int i=head[u];i;i=e[i].pre){
int v=e[i].v;if(v==from)continue;
p[++cnt]=(C){v,f[v]};
}
sort(p+,p++cnt);int p1=,p2=;
while(p2<=cnt){
int x=p[p1].val,xi=p[p1].o;
int y=p[p2].val,yi=p[p2].o;
if(x+y+>mid){
f[xi]=;sum++;p1++;p2++;
}
else break;
}
if(p1==cnt&&p[p1].val+>mid){
f[p[p1++].o]=;sum++;
}
int mx=;
if(p1<=cnt)mx=p[p1].val+;
f[u]=mx;
}
bool Judge(){
memset(f,,sizeof(f));
sum=;Dfs(,);
return sum<=S;
}
int main()
{
n=init();S=init();int u,v;
for(int i=;i<n;i++){
u=init();v=init();
Add(u,v);Add(v,u);
}
int l=,r=0x3f3f3f3f;
while(l<=r){
mid=l+r>>;
if(Judge()){
r=mid-;ans=mid;
}
else l=mid+;
}
printf("%d\n",ans);
return ;
}

Usaco 2010 Dec Gold Exercise(奶牛健美操)的更多相关文章

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

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

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

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

  3. [USACO 2017 Dec Gold] Tutorial

    Link: USACO 2017 Dec Gold 传送门 A: 为了保证复杂度明显是从终结点往回退 结果一开始全在想优化建边$dfs$……其实可以不用建边直接$multiset$找可行边跑$bfs$ ...

  4. [bzoj2097][Usaco2010 Dec]Exercise 奶牛健美操_贪心_树形dp_二分

    Exercise bzoj-2097 Usaco-2010 Dec 题目大意:题目链接 注释:略. 想法:题目描述生怕你不知道这题在考二分. 关键是怎么验证?我们想到贪心的删边. 这样的策略是显然正确 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. nesC 语言参考手册

    1 简介 nesC 是对 C 的扩展 ,它基于体现 TinyOS 的结构化概念和执行模型而设计. TinyOS 是为传感器网络节点而设计的一个事件驱动的操作系统,传感器网络节点拥有非常有限的资源 ( ...

  2. pragma指令简介

    整理日:2015年3月12日 资源来来自己网络 在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作. 下面介绍了一下该指令的一些常用参数,希望对大家 ...

  3. 从内部剖析C# 集合之---- HashTable

    这是我在博客园的第一篇文章,写的不好或有错误的地方,望各位大牛指出,不甚感激. 计划写几篇文章专门介绍HashTable,Dictionary,HashSet,SortedList,List 等集合对 ...

  4. python ^M 产生的原因 及 lxml 如何获取text的原因

    其实跟踪一下会发现,^M 是由于 /r/n 所造成的. article = dom_c.xpath('//td[@id="article_content"]//text()')co ...

  5. hadoop的一些重要配置参数

    hadoop集群管理内存设置 Mapreduce内存使用设置 hadoop job重要性能参数

  6. bzoj 2818: Gcd 歐拉函數

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1633  Solved: 724[Submit][Status] Descript ...

  7. cocos2d-iphone加入芒果广告

    cocos2d-iphone加入芒果广告的时候在模拟器上显示不出广告 真机上却可以.提示信息如下: AdsMoGo don't start alternate ADDRESPONSE - ADDING ...

  8. new 与override 区别

    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Newover ...

  9. OA请假流程 -- 编码

    OA请假流程 -- 编码 凡是内容不会发生变化的,都要写在xml配置文件中.需要定义如下内容: <process>标签 id英文命名 和 name 中文命名,然后只要与该流程相关的资源均以 ...

  10. Ajax的简单小例子

    1.首先下载ajax.dll,一个百度一下都有下载的!自行查找. 2.把ajax.dll导入到工程.右键工程-->添加引用--->浏览,找到下载好的ajax.dll文件,点击确定,这时候在 ...