Usaco 2010 Dec Gold Exercise(奶牛健美操)
/*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(奶牛健美操)的更多相关文章
- BZOJ_2097_[Usaco2010 Dec]Exercise 奶牛健美操_二分答案+树形DP
BZOJ_2097_[Usaco2010 Dec]Exercise 奶牛健美操_二分答案+树形DP Description Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的 ...
- [Usaco2010 Dec]Exercise 奶牛健美操
[Usaco2010 Dec]Exercise 奶牛健美操 题目 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连 ...
- [USACO 2017 Dec Gold] Tutorial
Link: USACO 2017 Dec Gold 传送门 A: 为了保证复杂度明显是从终结点往回退 结果一开始全在想优化建边$dfs$……其实可以不用建边直接$multiset$找可行边跑$bfs$ ...
- [bzoj2097][Usaco2010 Dec]Exercise 奶牛健美操_贪心_树形dp_二分
Exercise bzoj-2097 Usaco-2010 Dec 题目大意:题目链接 注释:略. 想法:题目描述生怕你不知道这题在考二分. 关键是怎么验证?我们想到贪心的删边. 这样的策略是显然正确 ...
- 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为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点之间恰好有一条简单路径. ...
- BZOJ2097: [Usaco2010 Dec]Exercise 奶牛健美操 贪心+伪树dp+二分
//论全局变量的杀伤力....QAQ#include<cstdio> #include<iostream> #include<cstdlib> #include&l ...
- BZOJ2097: [Usaco2010 Dec]Exercise 奶牛健美操
n<=100000的树,砍S<n条边,求砍完后S+1棵树的最大直径的最小值. 树的直径要小小哒,那考虑一棵子树的情况吧!一棵子树的直径,就是子树根节点各儿子的最大深度+次大深度.就下面这样 ...
- bzoj 2097: [Usaco2010 Dec]Exercise 奶牛健美操【二分+树形dp】
二分答案,然后dp判断是否合法 具体方法是设f[u]为u点到其子树中的最长链,每次把所有儿子的f值取出来排序,如果某两条能组合出大于mid的链就断掉f较大的一条 a是全局数组!!所以要先dfs完子树才 ...
随机推荐
- Android ListView列表控件的简单使用
ListView 列表是我们经常会使用的控件, 如果想要自定义里面的显示的话是挺麻烦的, 需要新建XML.Class SimpleAdapter这两个文件, 较为麻烦. 如果我们只是想显示两.三行文字 ...
- node场景
http://www.zhihu.com/question/19653241 http://www.csdn.net/article/2012-05-03/2805296 http://limu.it ...
- RemixOS Player 让用户在 Windows 上运行 Android App
http://www.oschina.net/news/77154/remixos-player-windows-andriod-app
- win7中的Uac与开机自动启动(好几种办法,特别是用不带UAC的程序启动UAC程序是一个简单的好办法,写驱动自启动更是了不得)
在另一篇文章中已经介绍了给Exe加上Uac的方法,在使用的过程中我们会发现,如果把带Uac的Exe写入注册表的Run中,是无法实现开机自动启动的,原因就是带Uac的exe需要申请管理员权限,以便运行执 ...
- java基础随笔-overload和override
今天重温了一下方法重载和方法重写. 首先是方法重写(override)的几点要求: 1.必须继承父类或者实现某接口的方法. 2.方法名称和参数必须和父类(或者实现的接口方法)完全一致. 3.重写的修饰 ...
- 【HDOJ】2386 Dart Challenge
纯粹母函数+滚动数组,水之. /* 2386 */ #include <iostream> #include <string> #include <map> #in ...
- 【HDOJ】1728 逃离迷宫
题目大坑,注意行列顺序式反的,另外注意起点和终点相同. #include <iostream> #include <cstdio> #include <cstring&g ...
- configure: error: cannot find protoc, the Protocol Buffers compiler
centos 6 安装mosh 1.2 2012-05-07 17:21:41标签:centos mosh 关于mosh(引用于) 芬兰研究员Tatu Ylönen于1995年设计出最早的SSH协议, ...
- Linux学习笔记19——信号2
上一节中讲到了sigprocmask函数,它的作用是检查或修改它的进程信号掩码,这一节我们主要学习捕捉与忽略信号的函数sigaction和等待信号函数. 一 sigaction函数的作用 定义在接收 ...
- 《Linear Algebra and Its Applications》-chaper6-正交性和最小二乘法-最小二乘问题
最小二乘问题: 结合之前给出向量空间中的正交.子空间W.正交投影.正交分解定理.最佳逼近原理,这里就可以比较圆满的解决最小二乘问题了. 首先我们得说明一下问题本身,就是在生产实践过程中,对于巨型线性方 ...