题目链接

https://atcoder.jp/contests/agc014/tasks/agc014_e

题解

完了考场上树剖做法都没想到是不是可以退役了。。。

首先有一个巨难写的据说是\(O(n\log^3n)\)的树剖+树套树做法:

对于每条红边\((u,v)\), 给蓝树上两点间路径\(+1\), 然后每次选出一个值为\(1\)的边,找到覆盖它的红边然后把这条\(1\)的边断掉加上红边,再去掉红边的影响。

下面来说正解。

依然是上面的思路,然后发现假设断掉前\((i-1)\)条蓝边之后形成的联通块的集合是\(B_i\), 连上从第\(i\)条到第\(n\)条的红边之后形成的连通块集合是\(R_i\), 那么答案为YES当且仅当对于任意\(2\le i\le n\), \(R_i=B_i\).

于是可以得到如下转化: 一开始图上有\(n\)个点\(2(n-1)\)条边,若两条边重合则把其连接的两点缩成同一点,问整个图最后能不能缩成一个点。

启发式合并即可。维护目前所有重边的队列、每个点的相邻点以及图上所有的边。每次从队列里取出一条边,然后把度数较小的点的边全部转移到度数较大的点上。如果能如此重复做\((n-1)\)次,那么答案是YES, 否则为NO. 相邻点可以用set维护,图上边可以用map维护。

时间复杂度\(O(n\log^2n)\).

代码

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cassert>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<utility>
#define pii pair<int,int>
#define mkpr make_pair
using namespace std; const int N = 1e5;
multiset<int> ae[N+3];
map<pii,int> g;
queue<pii> que;
int n; void insertedge(int u,int v)
{
if(u==v) return;
if(u>v) swap(u,v);
ae[u].insert(v); ae[v].insert(u);
g[mkpr(u,v)]++;
if(g[mkpr(u,v)]==2) {que.push(mkpr(u,v));}
} void deleteedge(int u,int v)
{
ae[v].erase(ae[v].find(u));
if(u>v) swap(u,v);
if(g.count(mkpr(u,v))) {g.erase(mkpr(u,v));}
} int main()
{
scanf("%d",&n);
for(int i=1; i<=2*(n-1); i++)
{
int u,v; scanf("%d%d",&u,&v);
insertedge(u,v);
}
for(int i=1; i<n; i++)
{
while(1)
{
if(que.empty()) {puts("NO"); return 0;}
int u = que.front().first,v = que.front().second; que.pop();
if(!g.count(mkpr(u,v))) {continue;}
if(ae[u].size()<ae[v].size()) swap(u,v);
for(set<int>::iterator i=ae[v].begin(); i!=ae[v].end(); i++)
{
int x = *i;
deleteedge(v,x);
insertedge(u,x);
}
break;
}
}
puts("YES");
return 0;
}

AtCoder AGC014E Blue and Red Tree (启发式合并)的更多相关文章

  1. AGC014E Blue and Red Tree

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

  2. AT2377 Blue and Red Tree

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

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

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

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

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

  5. 【AGC014E】Blue and Red Tree

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

  6. [AT2377] [agc014_e] Blue and Red Tree

    题目链接 AtCoder:https://agc014.contest.atcoder.jp/tasks/agc014_e 洛谷:https://www.luogu.org/problemnew/sh ...

  7. [atAGC014E]Blue and Red Tree

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

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

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

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

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

随机推荐

  1. codeforce C. Success Rate

    写完这道题目才发现自己对二分的理解太浅了 这题是典型的利用二分“假定一个问题可行并求最优解” 二分是通过不断缩小区间来缩小解的范围,最终得出解的算法 我们定义一个c(x) 表示判断函数 如果对任意y& ...

  2. BZOJ4887可乐题解--矩阵运算

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4887 分析 话说这道题经常见到类似模型来计数算期望,概率啊,然而我太蒻了都不会做,今天看 ...

  3. 学习笔记--Tarjan算法之割点与桥

    前言 图论中联通性相关问题往往会牵扯到无向图的割点与桥或是下一篇博客会讲的强连通分量,强有力的\(Tarjan\)算法能在\(O(n)\)的时间找到割点与桥 定义 若您是第一次了解\(Tarjan\) ...

  4. pyquery 库的使用

    from pyquery import PyQuery as pq # 文件勿命名为 pyquery.py,会发生冲突 # 字符串初始化 html = ''' <div id="pag ...

  5. 微信小程序常用事件

    bind bind事件绑定不会阻止冒泡事件向上冒泡,catch事件绑定可以阻止冒泡事件向上冒泡. bindtap  跳转页面 bindchange  .value 改变时触发 change 事件 bi ...

  6. Hive的日志操作

    想要看hive的日志,我们查看/home/hadoop/hive/conf/hive-log4j2.properties # list of properties property.hive.log. ...

  7. Vue页面缓存和不缓存的方法

    第一步 在app中设置需要缓存的div //缓存的页面 <keep-alive> <router-view v-if="$route.meta.keepAlive" ...

  8. Windows环境中编译opencv3.0同时加入OPENCV_contrib库及解决遇到相关问题[contrib 必须要3.1以上的opencv才支持了]

    更新:现在contrib库必须要opencv3.1以上才能支持编译通过了. 方法和步骤还是和本篇文章一样. ############################################## ...

  9. Intellij IDEA导入java项目看不到左边的项目目录结构

    1 重新import项目 然后导入完成,就可以了,再不行的话,删除.idea文件,重新import整个Project

  10. js常用阻止冒泡事件

    原文链接:http://caibaojian.com/javascript-stoppropagation-preventdefault.html 防止冒泡 w3c的方法是e.stopPropagat ...