合并具有交换律,因此即将一个连通块(初始为空)与一条链合并(其中各选1点,初始直接替换)

把插入改为染色,等价于对树上的一条链(包括点和边)染色,其中恰好有1个已经被染色的点(初始任意)

对于”恰有1个已被染色的点“这个条件,其实是可以忽略的,证明如下:

由于染色的点必然是一个完整的连通块,即如果包含两个被染色的点,这两个点之间的路径也已经被染色,完全可以在第一次添加时延长下去

对于存在被染色的点,只需要找到一个已经被染色的点(仍有出边未被染色),先操作经过其的操作即可

由此,题目即变为通过$A$次染长度不超过$B$的链,使得所有点和边(其实仅需要考虑边)都被染色

先考虑最小的$A$,若有$s$个奇数度数的点,则$A\ge \frac{s}{2}$(显然$s$为偶数),这是因为每一条链至多改变两个点度数的奇偶性,而初始都为偶数,因此至少$\frac{s}{2}$条链

同时,每一次选择两个奇数度数的点连结,类似重心的构造方法也可以得到一组合法方案

最小的$B$同noip2018D1T3,总时间复杂度为$o(n\log^{2}n)$

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 struct ji{
5 int nex,to;
6 }edge[N<<1];
7 vector<int>v;
8 int E,n,x,y,sum,ans,head[N],r[N],g[N],f[N];
9 void add(int x,int y){
10 edge[E].nex=head[x];
11 edge[E].to=y;
12 head[x]=E++;
13 }
14 int calc(int k){
15 int s=0;
16 for(int i=v.size()-1,j=0;i>=j;i--){
17 if (i==k)i--;
18 if (j==k)j++;
19 if (i>=j){
20 s++;
21 if (v[i]+v[j]<=ans)j++;
22 }
23 }
24 return s;
25 }
26 void dfs(int k,int fa){
27 for(int i=head[k];i!=-1;i=edge[i].nex)
28 if (edge[i].to!=fa){
29 dfs(edge[i].to,k);
30 f[k]+=f[edge[i].to];
31 }
32 v.clear();
33 for(int i=head[k];i!=-1;i=edge[i].nex)
34 if (edge[i].to!=fa){
35 if (g[edge[i].to]+1==ans)f[k]++;
36 else v.push_back(g[edge[i].to]+1);
37 }
38 if (!v.size())return;
39 sort(v.begin(),v.end());
40 int l=-1,r=v.size()-1,s=calc(r);
41 while (l<r){
42 int mid=(l+r>>1);
43 if (calc(mid)==s)r=mid;
44 else l=mid+1;
45 }
46 f[k]+=s;
47 if (l<0)g[k]=0;
48 else g[k]=v[l];
49 }
50 bool pd(int k){
51 ans=k;
52 memset(f,0,sizeof(f));
53 memset(g,0,sizeof(g));
54 dfs(1,0);
55 return (f[1]+(g[1]>0)<=sum/2);
56 }
57 int main(){
58 scanf("%d",&n);
59 memset(head,-1,sizeof(head));
60 for(int i=1;i<n;i++){
61 scanf("%d%d",&x,&y);
62 add(x,y);
63 add(y,x);
64 r[x]^=1;
65 r[y]^=1;
66 }
67 for(int i=1;i<=n;i++)
68 if (r[i])sum++;
69 printf("%d ",sum/2);
70 int l=1,r=n;
71 while (l<r){
72 int mid=(l+r>>1);
73 if (pd(mid))r=mid;
74 else l=mid+1;
75 }
76 printf("%d",l);
77 }

[atARC088F]Christmas Tree的更多相关文章

  1. POJ3013 Big Christmas Tree[转换 最短路]

    Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 23387   Accepted: 5 ...

  2. poj 3013 Big Christmas Tree (最短路径Dijsktra) -- 第一次用优先队列写Dijsktra

    http://poj.org/problem?id=3013 Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total S ...

  3. poj 3013 Big Christmas Tree Djistra

    Big Christmas Tree 题意:图中每个节点和边都有权值,图中找出一颗树,树根为1使得 Σ(树中的节点到树根的距离)*(以该节点为子树的所有节点的权值之和) 结果最小: 分析:直接求出每个 ...

  4. POJ 3013 Big Christmas Tree(最短Dijkstra+优先级队列优化,SPFA)

    POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意:  圣诞树是由n个节点和e个边构成的,点编号1-n. ...

  5. POJ Big Christmas Tree(最短的基础)

    Big Christmas Tree 题目分析: 叫你构造一颗圣诞树,使得 (sum of weights of all descendant nodes) × (unit price of the ...

  6. poj 3013 Big Christmas Tree

    Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 20974   Accepted: 4 ...

  7. Big Christmas Tree(poj-3013)最短路

    Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 25823   Accepted: 5 ...

  8. POJ3013 Big Christmas Tree(最短路径树)

    题目大概说给一张点和边都有权的图,现在要求其一棵以1结点为根的生成树使树的边权和最小,树边权 = 对应的图边权 * 树边末端点为根的子树所有结点对于图顶点的点权和. 要求∑(边权*子树点权和),等价于 ...

  9. HDU - 5156 Harry and Christmas tree

    题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=5156 题意 : 给一颗编号为1-n的以1为根的树, 已知有m个颜色的礼物分布在某些节点上(同一节点 ...

随机推荐

  1. dev分支和release是什么

    master(主分支) 存在一条主分支(master).所有用户可见的正式版本,都从master发布(也是用于部署生产环境的分支,确保master分支稳定性).主分支作为稳定的唯一代码库,不做任何开发 ...

  2. 看动画学算法之:平衡二叉搜索树AVL Tree

    目录 简介 AVL的特性 AVL的构建 AVL的搜索 AVL的插入 AVL的删除 简介 平衡二叉搜索树是一种特殊的二叉搜索树.为什么会有平衡二叉搜索树呢? 考虑一下二叉搜索树的特殊情况,如果一个二叉搜 ...

  3. 如何做好 NodeJS 框架选型?

    作为一个有一定工作经验的工程师,工作中经常会遇到技术选型的问题.比如当我们在工作中需要使用到 NodeJS 时,第一个要解决的问题就是如何选择一个合适的框架. 不同的框架有不同的特点,如果我们仅仅从框 ...

  4. Golang通脉之函数

    函数是组织好的.可重复使用的.用于执行指定任务的代码块. Go语言中支持函数.匿名函数和闭包,并且函数在Go语言中属于"一等公民". 函数定义 Go语言中定义函数使用func关键字 ...

  5. PyCharm中目录directory与包package的区别及相关import详解

    一.概念介绍 在介绍目录directory与包package的区别之前,先理解一个概念---模块 模块的定义:本质就是以.py结尾的python文件,模块的目的是为了其他程序进行引用. 目录(Dire ...

  6. JVM:参数调优

    JVM:参数调优 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 前言 查看 JVM 系统默认值:使用 jps 和 jinfo 进行查看 -Xms:初始堆空间 - ...

  7. TDengine在数益工联工业物联采集平台建设中的初步实践

    作者:易永耀 夏杭泰 邓炜兴 公司介绍 数益工联致力于打造基于数据流+价值流的离散制造业数字化软件:应用新一代的物联网技术与丰富的现场交互手段,融合工业工程精益思想,为离散制造业客户的数字化升级提供从 ...

  8. stm32学习笔记之串口通信

    在基础实验成功的基础上,对串口的调试方法进行实践.硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中. b) 初始化函数定义: void USART_Confi ...

  9. 你真的了解电子邮件系统的组成和结构吗?(SMTP、POP3、IMAP、MIME……)

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105896201 学习课程:<2019王道考研计算机网络> 学习目的 ...

  10. iPhone SE切换颜色特效

    Apple 网站的特效, iPhone SE 共有黑.白.红三种颜色,在卷动页面的时候会逐步替换,看起来效果非常时尚,在此供上代码学习. <!DOCTYPE html> <html& ...