题目链接

AtCoder:https://agc014.contest.atcoder.jp/tasks/agc014_e

洛谷:https://www.luogu.org/problemnew/show/AT2377

Solution

秒了\(O(n^2)\)不会优化是什么鬼...最后膜了大佬的题解才会写...

注意到最后一条边一定在蓝图上存在,在红图上也存在,那么我们可以找到任意一条这样的边,把两端的点合并起来,蓝图和红图都合并,剩下的是一个子问题,做\(n-1\)遍就好了,复杂度\(O(n^2)\)。

那么合并节点可以用并查集,然后每次暴力遍历点度小的那个点启发式合并就好了。

全程\(STL\)代码很恶心...注意并查集到处都要\(find\)一下,我就是挂的这里然后调了好久...

复杂度\(O(n\log ^2 n)\)。

#include<bits/stdc++.h>
using namespace std; void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
} void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');} #define lf double
#define ll long long
#define pb push_back #define pii pair<int,int >
#define mp make_pair
#define fr first
#define sc second #define iter_map map<int,int > :: iterator
#define iter_vec vector<int > :: iterator
#define iter_set set<int > :: iterator const int maxn = 5e5+10;
const int inf = 1e9;
const lf eps = 1e-8; struct DSU {
int fa[maxn];
void init(int n) {for(int i=1;i<=n;i++) fa[i]=i;}
int find(int x) {return fa[x]==x?x:fa[x]=find(fa[x]);}
}dsu; queue<pii > q;
set<int > e[maxn];
map<pii,int > s;
int n,d[maxn]; pii get(int x,int y) {return mp(min(x,y),max(x,y));} void ins(int x,int y) {
e[x].insert(y),e[y].insert(x);
pii now=get(x,y);s[now]++;
if(s[now]==2) q.push(now);
} int main() {
read(n);dsu.init(n);
for(int i=1,x,y;i<n*2-1;i++) read(x),read(y),ins(x,y);
for(int i=1,x,y;i<n;i++) {
while(1) {
if(q.empty()) {puts("NO");exit(0);}
x=dsu.find(q.front().fr),y=dsu.find(q.front().sc);q.pop(); //记得find...
if(x!=y) break;
}
if(e[x].size()>e[y].size()) swap(x,y);
dsu.fa[x]=y,s.erase(get(x,y)),e[y].erase(x);
for(iter_set it=e[x].begin();it!=e[x].end();it++) {
int t=dsu.find(*it);
if(t==y) continue;
s.erase(get(x,t));ins(t,y);
e[t].erase(x),e[x].erase(t);
}
}puts("YES");
return 0;
}

[AT2377] [agc014_e] Blue and Red Tree的更多相关文章

  1. AT2377 Blue and Red Tree

    AT2377 Blue and Red Tree 法一:正推 红色的边在蓝色的树上覆盖,一定每次选择的是覆盖次数为1的边的覆盖这条边的红色边连出来 覆盖次数可以树剖找到 这条红色边,可以开始的时候每个 ...

  2. AGC014E Blue and Red Tree

    题意 There is a tree with \(N\) vertices numbered \(1\) through \(N\). The \(i\)-th of the \(N−1\) edg ...

  3. AtCoder Grand Contest 014 E:Blue and Red Tree

    题目传送门:https://agc014.contest.atcoder.jp/tasks/agc014_e 题目翻译 有一棵有\(N\)个点的树,初始时每条边都是蓝色的,每次你可以选择一条由蓝色边构 ...

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

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

  5. 【AGC014E】Blue and Red Tree 并查集 启发式合并

    题目描述 有一棵\(n\)个点的树,最开始所有边都是蓝边.每次你可以选择一条全是蓝边的路径,删掉其中一条,再把这两个端点之间连一条红边.再给你一棵树,这棵树的所有边都是红边,问你最终能不能把原来的树变 ...

  6. AGC 014 E Blue and Red Tree [树链剖分]

    传送门 思路 官方题解是倒推,这里提供一种正推的做法. 不知道你们是怎么想到倒推的--感觉正推更好想啊QwQ就是不好码 把每一条红边,将其转化为蓝树上的一条路径.为了连这条红边,需要保证这条路径仍然完 ...

  7. AGC 014E.Blue and Red Tree(思路 启发式合并)

    题目链接 \(Description\) 给定两棵\(n\)个点的树,分别是由\(n-1\)条蓝边和\(n-1\)条红边组成的树.求\(n-1\)次操作后,能否把蓝树变成红树. 每次操作是,选择当前树 ...

  8. 【AGC014E】Blue and Red Tree

    Description 给定一棵\(n\)个节点的蓝边树,再给定一棵\(n\)个节点的红边树.请通过若干次操作将蓝树变成红树.操作要求和过程如下: 1.选定一条边全为蓝色的路径: 2.将路径上的一条蓝 ...

  9. [atAGC014E]Blue and Red Tree

    不断删除重边,然后将两个点的边集启发式合并(要考虑到两棵树),合并时发现重边就加入队列,最后判断是否全部删完即可 1 #include<bits/stdc++.h> 2 using nam ...

随机推荐

  1. MySQL入门篇(七)之Xtrabackup备份与恢复

    一.Xtrabackup介绍 MySQL冷备.mysqldump.MySQL热拷贝都无法实现对数据库进行增量备份.在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况 ...

  2. cf 448c Painting Fence

    http://codeforces.com/problemset/problem/448/C 题目大意:给你一个栅栏,每次选一横排或竖排染色,求把全部染色的最少次数,一个点不能重复染色. 和这道题有点 ...

  3. 前端 layui

    如果想实现类似 alert这种效果又不想阻塞html运行的话,就是用layer吧! http://www.layui.com/

  4. 第四篇 前端学习之JQuery基础

    一 jQuery是什么? jQuery就是一个JavaScript的库. <1> jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入 ...

  5. html的背景样式图片

    背景图片 如果背景图片小于当前的div的情况下 默认的是将平铺充满元素 background-image 设置背景图片. background-repeat 设置是否及如何重复背景图片. repeat ...

  6. node.js常用方法

    1.获取真实地址 function getClientIp(req) { return req.headers['x-forwarded-for'] || req.connection.remoteA ...

  7. 关于XML文档操作类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.X ...

  8. underscore.js源码解析(二)

    前几天我对underscore.js的整体结构做了分析,今天我将针对underscore封装的方法进行具体的分析,代码的一些解释都写在了注释里,那么废话不多说进入今天的正文. 没看过上一篇的可以猛戳这 ...

  9. 每日scrum--No.1

    Yesterday:无 Today: 查找学校的官方地图和亲自测试其准确性 Problem :不能使地图适应我们的软件;未解决地图上存在的问题: 明天继续加油.

  10. 201621123037 《Java程序设计》第6周学习总结

    作业06-接口.内部类 1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多 ...