Description

  
   给定一棵\(n\)个节点的蓝边树,再给定一棵\(n\)个节点的红边树。请通过若干次操作将蓝树变成红树。操作要求和过程如下:
  
   1.选定一条边全为蓝色的路径;
  
   2.将路径上的一条蓝边断开,并将路径的两个端点之间连一条红边。
  
   问能否实现目标。
  
  
  

Solution

  
   我们发现这个过程只会做恰好\(n-1\)次,因为每次都会减少一条蓝边、增加一条红边。
  
   考虑红树上的一条边\((u,v)\),显然在蓝树上操作时,我们选择了一条以\(u\)和\(v\)为端点的路径,才造就了这条边。因此红树上的每条边和蓝树上的每次操作一一对应。
  
   我们相当于要以某种顺序执行这些操作:对于操作\((u,v)\),保证操作前\(u\)和\(v\)连通,然后我们断开\(u\)到\(v\)路径上的一条边。问所有操作能否执行完。
  
   如果我们要执行一个操作A,那么对于当下该路径上的所有边,我们只能断开只有A占用的边。形式化地讲,如果对于每一个未执行操作,都将路径上的边+1;那么当前我们只能断开边权为1的边。
  
   我们想用树剖的方式维护并模拟这个操作,但这非常难实现。因为寻找边权为1的边这个操作,或许还需要树套树来维护,非常麻烦。
  
   正难则反,考虑整个过程反向进行:
  
   对于最后一次操作,树上一定只剩下一条边\((u,v)\),且最后一次操作也是\((u,v)\)。考虑倒数第二次操作,它要么是\((u,z)\),\(z\)是从最后一次操作的\((u,v)\)这条边延伸出的另一条边\((v,z)\),要么是另成的一条独立的边\((x,y)\).....
  
   手玩一会,我们发现:如果把两棵树建在一起,那么每次可操作的边,就是两棵树中都存在的边。操作完之后,我们把操作边的两个端点缩点,继续重复上述操作。如果操作能够执行恰好\(n-1\)次,则有解,否则无解。
  
   接下来关键是怎么实现。我们根据想的方法,将两棵树实实在在地建在一起。用\(n\)个set维护每个点的出边到达点,用一个map维护两两点之间边的数量。如果某两个点之间的连边数量等于2,则肯定这条边在两棵树中间都出席那了,我们将这两个点组成的边塞进队列里,表示这个队列里的边在当前都可以操作。接下来,我们不断从队头拿出边,进行缩点操作:启发式合并set,删边或加边直接操作set和map就好。
  
   时间复杂度\(\mathcal O(n \log^2 n)\)
  
  
  

Code

#include <cstdio>
#include <set>
#include <queue>
#include <map>
#define mp make_pair
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef set<int> si;
typedef set<int>::iterator sit;
const int N=100005;
int n;
int bl[N];
si s[N];
queue<pii> q;
map<ll,int> g;
inline void swap(int &x,int &y){x^=y^=x^=y;
}
int find(int u){return bl[u]==u?u:(bl[u]=find(bl[u]));
}
inline ll getID(int x,int y){if(x>y) swap(x,y);return 1ll*n*y+x;
}
void addEdge(int u,int v){s[u].insert(v);s[v].insert(u);ll eid=getID(u,v);int t=g[eid]+1;g[eid]++;if(t==2)q.push(mp(u,v));
}
void removeEdge(int u,int v){s[u].erase(v);s[v].erase(u);g.erase(getID(u,v));
}
void readData(){scanf("%d",&n);int u,v;for(int i=1;i<=(n-1)<<1;i++){scanf("%d%d",&u,&v);addEdge(u,v);}
}
bool solve(){for(int i=1;i<=n;i++) bl[i]=i;for(int i=1;i<n;i++){int u,v;if(q.empty())return false;u=q.front().first;v=q.front().second;q.pop();u=find(u); v=find(v);if(s[u].size()>s[v].size())swap(u,v);bl[u]=v;removeEdge(u,v);for(sit i=s[u].begin(),j;i!=s[u].end();i=j){j=i;j++;int x=*i;x=find(x);removeEdge(u,x);addEdge(v,x);}}return true;
}
int main(){readData();puts(solve()?"YES":"NO");return 0;
}

转载于:https://www.cnblogs.com/RogerDTZ/p/9582863.html

【AGC014E】Blue and Red Tree相关推荐

  1. 【SPOJ】Count On A Tree II(树上莫队)

    [SPOJ]Count On A Tree II(树上莫队) 题面 洛谷 Vjudge 洛谷上有翻译啦 题解 如果不在树上就是一个很裸很裸的莫队 现在在树上,就是一个很裸很裸的树上莫队啦. #incl ...

  2. 【机器学习】决策树(Decision Tree)

    [机器学习]k近邻算法(KNN) [机器学习]决策树(Decision Tree) [机器学习]朴素贝叶斯(Naive Bayes) 一.概述 决策树(Decision Tree)是有监督学习中的一种 ...

  3. 【ML】决策树(Decision tree)原理 + 实践 (基于sklearn)

    [ML]决策树(Decision tree)原理 + 实践 (基于sklearn) 原理介绍 简要介绍 原理 得分函数(信息熵) 实战 数据集 数据处理 训练 预测+评估 绘制决策树 原理介绍 简要介 ...

  4. 【LeetCode】222. Count Complete Tree Nodes 解题报告(Python)

    [LeetCode]222. Count Complete Tree Nodes 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个 ...

  5. 【Leetcode】431. Encode N-ary Tree to Binary Tree(困难)

    一.题目 1.题目描述 Design an algorithm to encode an N-ary tree into a binary tree and decode the binary tre ...

  6. 【VK Cup 2016 - Round 1 (Div 2 Edition)C】【构造】Bear and Forgotten Tree 3 构造一棵树直径为d且点1的深度为h

    Bear and Forgotten Tree 3 time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  7. 【UOJ170】Picks loves segment tree VIII

    [题目链接] 点击打开链接 [前置阅读] [BZOJ4695]最假女选手 [BZOJ3064][TYVJ1518]CPU监控 [UOJ169][UR #11]元旦老人与数列 [思路要点] 前置阅读中的 ...

  8. AtCoder AGC014E Blue and Red Tree (启发式合并)

    题目链接 https://atcoder.jp/contests/agc014/tasks/agc014_e 题解 完了考场上树剖做法都没想到是不是可以退役了... 首先有一个巨难写的据说是\(O(n ...

  9. 【转】XGBoost 与 Boosted Tree

    XGBoost 与 Boosted Tree http://www.52cs.org/?p=429 作者:陈天奇,毕业于上海交通大学ACM班,现就读于华盛顿大学,从事大规模机器学习研究. 注解:tru ...

最新文章

  1. python dlib实现面部标志识别
  2. CF703D Mishka and Interesting sum(求区间出现次数偶数次数的异或和)
  3. Linux服务器内核参数优化
  4. 3D竞技比赛或成数字娱乐新里程碑
  5. 66319d电源使用说明书_蒸汽熨斗怎么用 蒸汽熨斗使用方法及注意事项【介绍】...
  6. 静态页面之间的转发与json与ajax做到动态数据
  7. vs 2019 aspx灰色_蛇纹当道,豹纹在侧:穿成动物园是2019时尚大势?
  8. HTTP、TCP、UDP、Socket (转)
  9. Angular 自动编译部署 Tomcat Jboss
  10. 豆瓣评分9.2,GitHub 3.3k的学霸笔记终于出书了!获得李宏毅等大佬好评 -- 文末送书...
  11. 如何将一个数据库中的一个表复制到另一个数据库的表中去
  12. 便利蜂门店网络与 Rust 落地实践
  13. win10 开机软件自动启动设置
  14. Metaq的一些简单机制
  15. java中正则表达式以及Pattern和Matcher
  16. VIM中ctags的简单使用教程
  17. 机器学习之K近邻(KNN)模型
  18. 购买计算机的作文英语,电脑英语作文_电脑,computer,英文_高中英语作文_作文地带...
  19. 使用 vue2 制作一个知乎日报
  20. 图像去噪(包含修正的阿尔法均值滤波及通用滤波方法代码)

热门文章

  1. python 登陆开心网图片批量下载-selenium实现
  2. CSU1632Repeated Substrings(后缀数组/最长公共前缀)
  3. aop对请求后端的参数修改_Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理...
  4. python写数据结构书_有哪些用 Python 语言讲算法和数据结构的书?
  5. linux 安装 tao环境,linux环境安装hbase------不一定需要hadoop
  6. idea tomcat热部署_IDEA设置热部署
  7. ubuntu 14.04 安装oracle 11g,ubuntu 14.04 安装 oracle 11g
  8. hive查询where join_Hive系列(4):常用函数where,join
  9. linux配置英文,linux 系统配置命令(国外英文资料).doc
  10. signature=65a5d6b0ac441e09ae68e9bbee76cba1,Bortezomib