题面

首先我们要有一个明确的构造思路

对于非根节点,我们把子树连上来的线两两配对,这样如果它有奇数个子树就会剩一个,这时候把这根线传给父亲即可。对于根节点还是两两配对,但是注意如果它也有奇数个子树就不能剩了,必须把这根线算上。这样第一问的答案就是每个非根节点贡献度数除以二下取整,根节点贡献度数除以二上取整

第二问我们先二分答案,仍然沿用这个思路,这时我们要让最长的最短,于是我们每次把子树里传上来的线塞进一个multiset。讨论:对于有奇数个子树的情况,从大到小枚举线,二分出和当前的线拼起来不超过二分的$mid$的最长的线,然后把它们删掉,最后剩下的那根传给父亲。注意如果有一根线找不到配对也不一定失败,我们先视为把它传给父亲,然后看看剩下的还能不能拼好。对于有偶数个子树的情况,我们直接塞一个零进multiset里去,然后按奇数的方法做,这是等价的。对于根节点,我们去除掉塞零和留线这两个操作判定即可。

 #include<set>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
int p[N],noww[*N],goal[*N],deg[N],dp[N];
int n,t1,t2,cnt,mins,l,r,mid,ans;
multiset<int> se;
multiset<int>::iterator it;
void link(int f,int t)
{
noww[++cnt]=p[f];
goal[cnt]=t,p[f]=cnt;
}
bool check(int nde,int fth)
{
if(deg[nde]==&&nde!=)
{dp[nde]=; return true;}
for(int i=p[nde];i;i=noww[i])
if(goal[i]!=fth&&!check(goal[i],nde))
return false;
se.clear();
for(int i=p[nde];i;i=noww[i])
if(goal[i]!=fth)
se.insert(dp[goal[i]]+);
if(nde==)
{
while(se.size()>)
{
long long mem=*(--se.end());
se.erase(--se.end()); it=se.upper_bound(mid-mem);
if(it!=se.begin()) it--; else return false;
if((*it)+mem>mid) return false; se.erase(it);
}
if(se.size()) return (*se.begin())<=mid;
else return true;
}
else
{
int must=;
if(se.size()%==) se.insert();
while(se.size()>)
{
long long mem=*(--se.end());
se.erase(--se.end()); it=se.upper_bound(mid-mem);
if(it!=se.begin()) it--; else return false;
if((*it)+mem>mid)
{
if(must) return false;
else
{
must=*(--se.end());
continue;
}
}
else se.erase(it);
}
return (dp[nde]=must?must:(*se.begin()))<=mid;
}
return true;
}
int main ()
{
scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%d%d",&t1,&t2);
link(t1,t2),link(t2,t1);
deg[t1]++,deg[t2]++;
}
mins+=(deg[]+)/;
for(int i=;i<=n;i++)
mins+=(deg[i]-)/;
l=,r=n;
while(l<=r)
{
mid=(l+r)/;
if(check(,)) r=mid-,ans=mid;
else l=mid+;
}
printf("%d %d",mins,ans);
return ;
}

解题:POI 2004 String的更多相关文章

  1. 解题:POI 2004 Bridge

    题面 小学数奥见祖宗(相信大多数人小学都看过这个玩意 如果你没看过这个问题,第一反应可能是让跑的最快的来回送火把,然而样例已经hack掉了这种做法,更优的做法是让跑的最快的和第二快的来回送火把.然后事 ...

  2. PAT 解题报告 1050. String Subtraction (20)

    1050. String Subtraction (20) Given two strings S1 and S2, S = S1 - S2 is defined to be the remainin ...

  3. [POI 2004]ZAW

    Description 在 Byte 山的山脚下有一个洞穴入口. 这个洞穴由复杂的洞室经过隧道连接构成. 洞穴的入口是 1 号点.两个洞室要么就通过隧道连接起来,要么就经过若干隧道间接的相连. 现在决 ...

  4. [POI 2004]SZP

    Description Byteotian 中央情报局 (BIA) 雇佣了许多特工. 他们每个人的工作就是监视另一名特工.Byteasar 国王需要进行一次秘密行动,所以他要挑选尽量多的信得过的特工. ...

  5. LeetCode解题报告—— Interleaving String

    Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. Example 1: Input: s1 = ...

  6. 解题:CF1063F String Journey

    题面 分析性质以进行DP 性质1:一定有一个最优解通过每次删除第一个或最后一个字符达到 这个脑补一下就能证明了 那么我们设$dp[i]$表示后缀$[i,n]$选出一个前缀所能达到的最大长度,从右往左D ...

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

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

  8. bzoj 2069 [ POI 2004 ] ZAW —— 多起点最短路 + 二进制划分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2069 首先,对于和 1 相连的点,一定是从某个点出发,回到另一个点: 所以需要枚举起点和终点 ...

  9. c++中string (MFC)

    题目:UVALive - 6439    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid= ...

随机推荐

  1. Python-RabbitMQ(简单发送模型)

    RabbitMQ需要 erlang 和pika 1.RabbitMQ和erlang版本必须匹配,否则就报没有进程错误 2.RabbitMQ的erlang.cookie和windows下的erlang. ...

  2. Extreme Learning Machine 翻译

    本文是作者这几天翻译的一篇经典的ELM文章,是第一稿,所以有很多错误以及不足之处. 另外由于此编辑器不支持MathType所以好多公式没有显示出来,原稿是word文档. 联系:250101249@qq ...

  3. R软件中 文本分析安装包 Rjava 和 Rwordseg 傻瓜式安装方法四部曲

    这两天,由于要做一个文本分析的内容,所以搜索了一天R语言中的可以做文本分析的加载包,但是在安装包的过程,真是被虐千百遍,总是安装不成功.特此专门写一篇博文,把整个心塞史畅快的释放一下. ------- ...

  4. python爬虫项目(新手教程)之知乎(requests方式)

    -前言 之前一直用scrapy与urllib姿势爬取数据,最近使用requests感觉还不错,这次希望通过对知乎数据的爬取为 各位爬虫爱好者和初学者更好的了解爬虫制作的准备过程以及requests请求 ...

  5. python下graphviz安装

    参考链接:https://blog.csdn.net/u013250416/article/details/72790754 1.安装Graphviz 在graphviz的官网(网址:http://w ...

  6. Bing词典vs有道词典比对测试报告

    功能篇 核心功能测评:http://www.cnblogs.com/C705/p/4075554.html 细节与用户体验:http://www.cnblogs.com/C705/p/4077112. ...

  7. BugPhobia开发篇章:Scurm Meeting-更新至0x02

    0x01 :目录与摘要 If you weeped for the missing sunset, you would miss all the shining stars 索引 提纲 整理与更新记录 ...

  8. web07-jdbcBookStore

    新建web项目,名字 新建servlet,名字CreateDBServlet 内容为: ---- 配置web.xml 数据库的URL.driveclass.user.passWord都写在web.xm ...

  9. 作业3//Calculator::1

    计算器 作业博客 github 1.扯淡 代码其实是在十几号时打的,花了半晚上加半个下午.但是懒得打随笔,所以到现在才完成. 我的课程里没找到queue,是百度照着瞎打的. 2.总结 不大理解要求,S ...

  10. J2EE 13种技术规范

    J2EE平台由一整套服务(种技术规范进行简单的描述(限于篇幅,这里只能进行简单的描述): 1.JDBC(Java Database Connectivity):    JDBC API为访问不同的数据 ...