[atARC088F]Christmas Tree
合并具有交换律,因此即将一个连通块(初始为空)与一条链合并(其中各选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的更多相关文章
- POJ3013 Big Christmas Tree[转换 最短路]
Big Christmas Tree Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 23387 Accepted: 5 ...
- poj 3013 Big Christmas Tree (最短路径Dijsktra) -- 第一次用优先队列写Dijsktra
http://poj.org/problem?id=3013 Big Christmas Tree Time Limit: 3000MS Memory Limit: 131072K Total S ...
- poj 3013 Big Christmas Tree Djistra
Big Christmas Tree 题意:图中每个节点和边都有权值,图中找出一颗树,树根为1使得 Σ(树中的节点到树根的距离)*(以该节点为子树的所有节点的权值之和) 结果最小: 分析:直接求出每个 ...
- POJ 3013 Big Christmas Tree(最短Dijkstra+优先级队列优化,SPFA)
POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意: 圣诞树是由n个节点和e个边构成的,点编号1-n. ...
- POJ Big Christmas Tree(最短的基础)
Big Christmas Tree 题目分析: 叫你构造一颗圣诞树,使得 (sum of weights of all descendant nodes) × (unit price of the ...
- poj 3013 Big Christmas Tree
Big Christmas Tree Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 20974 Accepted: 4 ...
- Big Christmas Tree(poj-3013)最短路
Big Christmas Tree Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 25823 Accepted: 5 ...
- POJ3013 Big Christmas Tree(最短路径树)
题目大概说给一张点和边都有权的图,现在要求其一棵以1结点为根的生成树使树的边权和最小,树边权 = 对应的图边权 * 树边末端点为根的子树所有结点对于图顶点的点权和. 要求∑(边权*子树点权和),等价于 ...
- HDU - 5156 Harry and Christmas tree
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=5156 题意 : 给一颗编号为1-n的以1为根的树, 已知有m个颜色的礼物分布在某些节点上(同一节点 ...
随机推荐
- 使用node-gyp编写简单的node原生模块
通过样例,让我们了解如何编写一个node的原生模块.当然,这篇文章还有一个目的,是为了方便以后编写关于node-gyp的文章,搭建初始环境. 基于node-addon-api 基于node-addon ...
- js Promise用法
Promise 英文意思是 承诺的意思,是对将来的事情做了承诺, Promise 有三种状态, Pending 进行中或者等待中 Fulfilled 已成功 Rejected 已失败 Promise ...
- Data Interoperability Tools
这里的工具貌似没有对应函数~~~
- 洛谷2120 [ZJOI2007]仓库建设(斜率优化dp)
感觉和锯木厂那个题很类似的. 其实这个题还那个题唯一的区别就是\(dp\)转移式子中的\(f\)变成了\(g\) qwq不想多说了 直接看我的前一篇题解吧qwq #include<iostrea ...
- selenium3 利用cookie实现免登陆
1.首先访问要操作的页面 2.登陆一次,使用Fiddle等工具抓取出cookie 3.按照如下代码,即可成功登陆 from selenium import webdriver url = " ...
- LeetCode:BFS/DFS
BFS/DFS 在树专题和回溯算法中其实已经涉及到了BFS和DFS算法,这里单独提出再进一步学习一下 BFS 广度优先遍历 Breadth-First-Search 这部分的内容也主要是学习了labu ...
- Java:线程池
Java:线程池 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 获取多线程的方法: 实现 Runnable 接口 实现 Callable 接口 实例化 Thre ...
- 【二食堂】Alpha - Scrum Meeting 11
Scrum Meeting 11 例会时间:4.21 18:00~18:20 进度情况 组员 进度 今日任务 李健 1. 登录注册页面前后端对接issue 1. 登录注册页面前后端对接issue2. ...
- SpringBoot整合多个RabbitMQ
一.背景 最近项目中需要用到了RabbitMQ来监听消息队列,监听的消息队列的 虚拟主机(virtualHost)和队列名(queueName)是不一致的,但是接收到的消息格式相同的.而且可能还存 ...
- DDD领域驱动设计-项目包结构说明-Ⅳ
基于DDD领域驱动设计的思想,在开发具体系统时,需要先建立不同的层级包.主要是梳理不同层面(应用层,领域层,基础设施层,展示层)包括的功能目录,每一个层面应该包括哪些模块.本例所讲述的分层是DDD落 ...