正解:二分+贪心

解题报告:

传送门$QwQ$

题目大意就说有一棵树,然后要用若干条线覆盖所有边且不能重叠.问最少要用几条线,在用线最少的前提下最长的线最短是多长.

昂首先最少用多少条线这个还是蛮$easy$的$QwQ$?显然答案就$1+\sum \frac{d_i-1}{2}$.考虑每个点的儿子都两两匹配,多出来的部分直接到父亲处做就成$QwQ$.加一是因为根节点本来不应该减一的因为没有父亲节点,所以就加回来$QwQ$.

然后看第二问.

首先显然先二分出一个长度.然后$check$就$dfs$,对每个点记录一个$dis_i$表示从这个点传来的链的长度.然后每$dfs$到一个点,先把它的子树处理完,将所有传上来的链按长度排序.

然后考虑分类讨论,对于有奇数个儿子的节点,就二分传上去的链的长度最小值是多少

然后对于有偶数个儿子的节点,如果可以一一匹配就直接一一匹配掉.否则考虑可以将最大值单独覆盖后当作奇数个儿子的节点做.昂因为这里我还理解了下才$get$的所以大概港下$QwQ$.

考虑每个点是有个向上传一条链的权限的,所以当有偶数个儿子节点时,就有一个让一条链落单匹配的权限,所以就可以把最长的那条链单独处理之后当作奇数儿子节点的做$QwQ$

$over$

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define t(i) edge[i].to
#define ri register int
#define rc register char
#define rb register bool
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
#define e(i,x) for(ri i=head[x];i;i=edge[i].nxt) const int N=10000+10,inf=1e9+10;
int n,head[N],in[N],ed_cnt,as=1,mid,dis[N],stck[N],top;
bool flg,gdgs=1;
struct ed{int to,nxt;}edge[N<<1]; il int read()
{
rc ch=gc;ri x=0;rb y=1;
while(ch!='-' && (ch>'9' || ch<'0'))ch=gc;
if(ch=='-')ch=gc,y=0;
while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=gc;
return y?x:-x;
}
il void ad(ri x,ri y){edge[++ed_cnt]=(ed){x,head[y]};head[y]=ed_cnt;++in[x];}
il bool jud(ri dat)
{ri l=1,r=top;while(gdgs){if(l==dat)++l;if(r==dat)--r;if(l>=r)return 1;if(stck[l]+stck[r]>mid)return 0;++l,--r;}}
void dfs(ri nw,ri fa)
{
if(!flg)return;
e(i,nw)if(t(i)^fa)dfs(t(i),nw);
top=0;e(i,nw)if(t(i)^fa)stck[++top]=dis[t(i)]+1;
sort(stck+1,stck+1+top);if(stck[top]>mid){flg=0;return;}
if(!(top&1)){rp(i,1,top/2)if(stck[i]+stck[top-i+1]>mid){if(nw==1){flg=0;return;}--top;break;}}
if(top&1)
{
ri l=1,r=top;if(!jud(top)){flg=0;return;}
while(l<r){ri md=(l+r)>>1;if(jud(md))r=md;else l=md+1;}
dis[nw]=stck[l];
}
}
il bool check(){memset(dis,0,sizeof(dis));flg=1;dfs(1,1);return flg;} int main()
{
freopen("2067.in","r",stdin);freopen("2067.out","w",stdout);
n=read();rp(i,1,n-1){ri x=read(),y=read();ad(x,y);ad(y,x);}rp(i,1,n)as+=(in[i]-1)/2;
ri l=1,r=n;while(l<r){mid=(l+r)>>1;if(check())r=mid;else l=mid+1;}printf("%d %d\n",as,l);
return 0;
}

随机推荐

  1. 阿里云MaxCompute 2019-4月刊

    摘要: 4月新功能发布,精彩技术好文推荐,5月线上线下活动抢先知道,尽在4月刊. 您好,MaxCompute 2019.4月刊为您带来产品最新动态和丰富的产品技术内容,欢迎阅读. 导读 [功能发布]4 ...

  2. laravel setxxAttribute和getxxAttribute的使用

    setxxAttribute 在设置(sql: insert update) 的时候 会将$obj->xx = 'value'的时候, 操作数据库之前 自动转化一下 getxxAttribute ...

  3. Mac 安装homebrew,pkgutil --pkgs列出安装包

    Mac 安装homebrew Homebrew官网 http://brew.sh/index_zh-cn.html Homebrew是神马 Linux系统有个让人蛋疼的通病,软件包依赖,好在当前主流的 ...

  4. oracle整合简单,无关联的数据库访问

    如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系) 例如: SELECT NAME FROM EMP WHERE EMP_NO = 1234; SELECT NAM ...

  5. [kuangbin带你飞]专题九 连通图B - Network UVA - 315

    判断割点的性质: 如果点y满足 low[y]>=dfn[x] 且不是根节点 或者是根节点,满足上述式子的有两个及其以上. 就是割点 如果是起点,那么至少需要两个子节点满足上述条件,因为它是根节点 ...

  6. php 向数组 首位插入 和 尾部插入

    首位插入: <?php$queue = array("orange", "banana");array_unshift($queue, "app ...

  7. SSM整合 上传下载之添加商品

    上传下载细节: 导入xml配置文件!! Controller中要配置存储路径,调用transferto上传文件 上传图片 要将图片的类设置为 MultipartFile 图片下载: 源码: 页面展示: ...

  8. Centos 6.5 配置hadoop2.7.1

    1 Centos 6.5 编译hadoop2.7.1 主机配置: sudo yum install gcc gcc-c++ sudo yum install ncurses-devel sudo yu ...

  9. CodeForces 1204E"Natasha, Sasha and the Prefix Sums"(动态规划 or 组合数学--卡特兰数的应用)

    传送门 •参考资料 [1]:CF1204E Natasha, Sasha and the Prefix Sums(动态规划+组合数) •题意 由 n 个 1 和 m 个 -1 组成的 $C_{n+m} ...

  10. Ralasafe配置手册

    Ralasafe访问控制(权限管理)中间件的配置工作非常少.因为项目发起人非常讨厌配置.因此,"己所不欲,勿施于人",Ralasafe的配置也非常少. Ralasafe配置工作只有 ...