题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2067

最少的线段可以贪心地想出来。(结果还是写错了)就是偶数孩子可以自己配对,奇数孩子要带一个上去;算条数的时候在该条拐弯或截止的时候算,就是每个点的度数减1除以2求和,最后加上1表示根节点。

还以为第二问能贪心做呢。结果WA。奇数孩子带一个最小的上去是不行的;偶数孩子都不带上去也是不行的。

于是二分一下答案。结果WA。偶数孩子带一个尽量小的上去还能贪心,奇数孩子并不是用中间那个孩子与别的孩子配对使得自己带一个尽量小的孩子上去。

奇数孩子不知带哪个孩子上去,像这种就应该考虑枚举、二分之类暴力一点的做法。枚举的话可能n^2,所以二分一下,判断就是去掉这个孩子,剩下的贪心配对。

顺便把偶数孩子的那个“带0上去”也作为一个孩子加进去,就很方便了。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. const int N=1e4+;
  7. int n,hd[N],xnt,to[N<<],nxt[N<<],rt,l,r,mid;
  8. int deg[N],dis[N],ans,sta[N],top;
  9. bool flag;
  10. int rdn()
  11. {
  12. int ret=;bool fx=;char ch=getchar();
  13. while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
  14. while(ch>=''&&ch<='') ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
  15. return fx?ret:-ret;
  16. }
  17. void add(int x,int y)
  18. {
  19. to[++xnt]=y; nxt[xnt]=hd[x]; hd[x]=xnt;
  20. to[++xnt]=x; nxt[xnt]=hd[y]; hd[y]=xnt;
  21. deg[x]++; deg[y]++;
  22. }
  23. void dfs(int cr,int fa)
  24. {
  25. for(int i=hd[cr],v;i;i=nxt[i])
  26. if((v=to[i])!=fa)
  27. {
  28. dfs(v,cr);
  29. if(flag)return;
  30. }
  31.  
  32. top=;
  33. for(int i=hd[cr];i;i=nxt[i])
  34. if(to[i]!=fa)
  35. sta[++top]=dis[to[i]]+;
  36. if(deg[cr]&) sta[++top]=;//偶数孩子可以0地向上
  37. sort(sta+,sta+top+);
  38.  
  39. if(cr==)
  40. {
  41. for(int i=,j=top;i<j;i++,j--)
  42. if(sta[i]+sta[j]>mid)
  43. {flag=;return;}
  44. return;
  45. }
  46.  
  47. int tl=,tr=top,ret=-;
  48. while(tl<=tr)
  49. {
  50. int tmid=tl+tr>>; bool fg=;
  51. for(int i=,j=top;i<j;i++,j--)
  52. {
  53. if(i==tmid) i++; if(j==tmid) j--;
  54. if(sta[i]+sta[j]>mid){fg=;break;}
  55. }
  56. if(!fg) ret=tmid,tr=tmid-;
  57. else tl=tmid+;
  58. }
  59. if(ret==-)flag=;
  60. else dis[cr]=sta[ret];
  61. }
  62. int main()
  63. {
  64. n=rdn();
  65. for(int i=,u,v;i<n;i++)
  66. {
  67. u=rdn(); v=rdn(); add(u,v);
  68. }
  69. // for(int i=2;i<=n;i++) ans+=deg[i]>>1;
  70. // ans+=(deg[1]==1?0:(deg[1]+1)>>1);
  71. for(int i=;i<=n;i++) ans+=((deg[i]-)>>);
  72. printf("%d ",ans+);
  73. r=n;
  74. while(l<=r)
  75. {
  76. mid=l+r>>; flag=;
  77. dfs(,);
  78. if(!flag) ans=mid,r=mid-;
  79. else l=mid+;
  80. }
  81. printf("%d\n",ans);
  82. return ;
  83. }

bzoj 2067 [Poi2004]SZN——二分+贪心的更多相关文章

  1. bzoj 2067: [Poi2004]SZN【贪心+二分+树形dp】

    第一问就是Σ(deg[u]-1)/2+1 第二问是二分,判断的时候考虑第一问的贪心规则,对于奇度数的点,两两配对之后一条延伸到上面:对于欧度数的点,两两配对或者deg[u]-2的点配对,然后一条断在这 ...

  2. 2067: [Poi2004]SZN——树上贪心+二分

    题目大意: 给一棵树.求用最少的链覆盖这棵树(链不能相交),在这个基础上求最长的链最短可以是多少. n<=10000 题解: 肯定先处理第一问: 答案:$\sum_(du[i]-1)/2+1$ ...

  3. 【BZOJ2067】[Poi2004]SZN 二分+树上贪心

    [BZOJ2067][Poi2004]SZN Description String-Toys joint-stock 公司需要你帮他们解决一个问题. 他们想制造一个没有环的连通图模型. 每个图都是由一 ...

  4. $bzoj2067\ szn$ 二分+贪心

    正解:二分+贪心 解题报告: 传送门$QwQ$ 题目大意就说有一棵树,然后要用若干条线覆盖所有边且不能重叠.问最少要用几条线,在用线最少的前提下最长的线最短是多长. 昂首先最少用多少条线这个还是蛮$e ...

  5. bzoj 2067 [ Poi 2004 ] SZN —— 二分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2067 问题1:贪心考虑,应该是每个点的儿子尽量两两配对,如果剩一个就和自己合并向上,所以 a ...

  6. Codeforces Gym 100231B Intervals 线段树+二分+贪心

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...

  7. 2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 二分+贪心

    /** 题目:2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 链接:http://codeforces.com/gym/101194 题意:给n个木块,堆 ...

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

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

  9. Codeforces_732D_(二分贪心)

    D. Exams time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

随机推荐

  1. 软件工程第2次作业——Visual Studio 2017下基于C/C++的VSTS单元测试实践

    Write one minute, test all day long. 环境确定 IDE:Microsoft Visual Studio 2017 Community 语言:C++ 单元测试工具:V ...

  2. 分布式服务框架 Zookeeper(一)介绍

    一.概述 ZooKeeper(动物园管理员),顾名思义,是用来管理Hadoop(大象).Hive(蜜蜂).Pig(小猪)的管理员,同时Apache Hbase.Apache Solr.LinkedIn ...

  3. HDFS中数据节点数据块存储示例

    数据块在数据节点上是按照如下方式存储的. 首先是一个存储的根目录/Hadoop/data/dfs/dn,如下图所示: 接着进入current目录,如下图所示: 再进入后续的BP-433072574-1 ...

  4. 向oracle中插入date时,持久层sql怎么写???

    public class EmpDao { public void addEmp(Emp emp) throws SQLException { QueryRunner runner = new Que ...

  5. sqlite3常用操作命令 和mysql的区别及优缺点

    SQLite 的数据库权限只依赖于文件系统,没有用户帐户的概念. sqlite3 testdb.db .databases 命令查看数据库列表 create table tbl(name char(1 ...

  6. Ubuntu/CentOS下源码编译安装Php 5.6基本参数

    先确认安装libxml2 apt-get install libxml2 libxml2-dev或者yum install libxml2 libxml2-dev ./configure --pref ...

  7. 模式识别之svm()---支持向量机svm 简介1995

    转自:http://www.blogjava.net/zhenandaci/archive/2009/02/13/254519.html 作者:Jasper 出自:http://www.blogjav ...

  8. COGS1752. [BOI2007]摩基亚Mokia

    1752. [BOI2007]摩基亚Mokia ★★☆   输入文件:mokia.in   输出文件:mokia.out   简单对比时间限制:5 s   内存限制:128 MB [题目描述] 摩尔瓦 ...

  9. git拉取远程分支到本地分支或者创建本地新分支

    git fetch origin branchname:branchname 可以把远程某各分支拉去到本地的branchname下,如果没有branchname,则会在本地新建branchname g ...

  10. CALL FUNCTION 'BAPI_GOODSMVT_CREATE'-(物料凭证创建)

    *&---------------------------------------------------------------------* *& Report  YTST_RAI ...