CF891C-Envy【可撤销并查集】
正题
题目链接:https://www.luogu.com.cn/problem/CF891C
题目大意
\(n\)个点\(m\)条边的一张无向联通图,每次询问一个边集能否同时出现在同一棵最小生成树上。
\(1\leq n,m,q,w_i,\sum k\leq 5\times 10^5\)
解题思路
考虑\(Kruskal\)的做法,每次找一条最小的边然后判断是否能够加入最小生成树。
考虑到边权相同的边可以任意排序,我们把它称之为同一层的边,并且无论任意排序最后产生的图的连通情况都不会改变。
我们把一个询问的边按照边分层,那么每层的边都合法这个询问就合法。
然后对于一个询问同一层的边,直接离线,然后把前面的层都加入之后,再把所有这些询问边加入判断是否合法即可。因为前面的层不能重新插,所以做完要撤销回去。
时间复杂度:\(O(n\log n)\)(全部同级的话)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
const int N=5e5+10;
struct node{
int x,y,w;
}e[N],b[N];
int n,m,Q,k,cnt,fa[N],dep[N],mk[N];
bool ans[N];
vector<node> q[N];
vector<int> h[N];
stack<node> cl;
int find(int x)
{return (fa[x]==x)?x:find(fa[x]);}
void unionn(int x,int y){
if(dep[x]>dep[y])swap(x,y);
cl.push((node){x,y,dep[y]});
fa[x]=y;dep[y]=max(dep[y],dep[x]+1);
return;
}
bool cmp(node x,node y)
{return x.w<y.w;}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].w);
scanf("%d",&Q);
for(int i=1;i<=Q;i++){
int k;scanf("%d",&k);
for(int j=1,x;j<=k;j++)
scanf("%d",&x),b[j]=e[x];
sort(b+1,b+1+k,cmp);ans[i]=1;
for(int j=1;j<=k;j++){
if(b[j].w!=b[j-1].w)
++cnt,h[b[j].w].push_back(cnt),mk[cnt]=i;
q[cnt].push_back(b[j]);
}
}
sort(e+1,e+1+m,cmp);
for(int i=1;i<=n;i++)fa[i]=i;
for(int l=1,r=1;l<=m;l=r+1){
while(e[r+1].w==e[l].w)r++;
int w=e[l].w;
while(!cl.empty())cl.pop();
for(int j=0;j<h[w].size();j++){
int p=h[w][j];
for(int i=0;i<q[p].size();i++){
int x=q[p][i].x,y=q[p][i].y;
x=find(x);y=find(y);
if(x==y){ans[mk[p]]=0;break;}
unionn(x,y);
}
while(!cl.empty()){
node x=cl.top();cl.pop();
dep[x.y]=x.w;fa[x.x]=x.x;
}
}
for(int i=l;i<=r;i++){
int x=find(e[i].x),y=find(e[i].y);
if(x==y)continue;
unionn(x,y);
}
}
for(int i=1;i<=Q;i++)
if(ans[i])puts("YES");
else puts("NO");
return 0;
}
CF891C-Envy【可撤销并查集】的更多相关文章
- bzoj2049 线段树 + 可撤销并查集
https://www.lydsy.com/JudgeOnline/problem.php?id=2049 线段树真神奇 题意:给出一波操作,拆边加边以及询问两点是否联通. 听说常规方法是在线LCT, ...
- CodeForces892E 可撤销并查集/最小生成树
http://codeforces.com/problemset/problem/892/E 题意:给出一个 n 个点 m 条边的无向图,每条边有边权,共 Q 次询问,每次给出 ki 条边,问这些边 ...
- BZOJ4358: permu(带撤销并查集 不删除莫队)
题意 题目链接 Sol 感觉自己已经老的爬不动了.. 想了一会儿,大概用个不删除莫队+带撤销并查集就能搞了吧,\(n \sqrt{n} logn\)应该卡的过去 不过不删除莫队咋写来着?....跑去学 ...
- 【离线 撤销并查集 线段树分治】bzoj1018: [SHOI2008]堵塞的交通traffic
本题可化成更一般的问题:离线动态图询问连通性 当然可以利用它的特殊性质,采用在线线段树维护一些标记的方法 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常 ...
- codeforces 892E(离散化+可撤销并查集)
题意 给出一个n个点m条边的无向联通图(n,m<=5e5),有q(q<=5e5)个询问 每个询问询问一个边集{Ei},回答这些边能否在同一个最小生成树中 分析 要知道一个性质,就是权值不同 ...
- 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)
题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...
- 【BZOJ4025】二分图(可撤销并查集+线段树分治)
题目: BZOJ4025 分析: 定理:一个图是二分图的充要条件是不存在奇环. 先考虑一个弱化的问题:保证所有边出现的时间段不会交叉,只会包含或相离. 还是不会?再考虑一个更弱化的问题:边只会出现不会 ...
- 算法笔记--可撤销并查集 && 可持久化并查集
可撤销并查集模板: struct UFS { stack<pair<int*, int>> stk; int fa[N], rnk[N]; inline void init(i ...
- 2019牛客第八场多校 E_Explorer 可撤销并查集(栈)+线段树
目录 题意: 分析: @(2019牛客暑期多校训练营(第八场)E_Explorer) 题意: 链接 题目类似:CF366D,Gym101652T 本题给你\(n(100000)\)个点\(m(1000 ...
- Codeforces 938G 线段树分治 线性基 可撤销并查集
Codeforces 938G Shortest Path Queries 一张连通图,三种操作 1.给x和y之间加上边权为d的边,保证不会产生重边 2.删除x和y之间的边,保证此边之前存在 3.询问 ...
随机推荐
- [转]用C++实现插件体系结构
本文讨论一种简单却有效的插件体系结构,它使用C++,动态链接库,基于面向对象编程的思想.首先来看一下使用插件机制能给我们带来哪些方面的好处,从而在适当时候合理的选择使用. 1. 增强代码的透明度与一致 ...
- RabbitMQ 的使用
MiaoshaMessage 类 ---------------------------------------------------------------- import com.imooc. ...
- 解决servlet中get方式中中文乱码问题(二):装饰者模式使用
注意,这里是针对Tomcat容器中get方式提交的servlet中获得参数,参数中有中文的时候乱码的问题: 之前我已经讲过,Tomcat8.0及以上URIEncoding都是utf-8的默认编码,不会 ...
- Dapper同时操作任意多张表的实现
1:Dapper的查询帮助类,部分代码,其它新增更新删除可以自行扩展 using Microsoft.Extensions.Configuration; using System; using Sys ...
- js在不同页面的导航背景不同 (设置网站公共头的导航)
<script type="text/javascript" src="js/jquery.min.js"></script> < ...
- mini-ndn0.5.0 安装教程 (避免踩坑)
写在前面 首先需要确定一些配置,因为在安装的过程中需要编译一些内容,所以需要提前准备好. 本人之前ubuntu系统可能比较乱,在尝试很多次安装后,仍然失败,所以就直接重装了一下.说一下我自己的一些配置 ...
- Python之requests模块-hook
requests提供了hook机制,让我们能够在请求得到响应之后去做一些自定义的操作,比如打印某些信息.修改响应内容等.具体用法见下面的例子: import requests # 钩子函数1 def ...
- 第17章-x86-64寄存器
不同的CPU都能够解释的机器语言的体系称为指令集架构(ISA,Instruction Set Architecture),也可以称为指令集(instruction set).Intel将x86系列CP ...
- MySQL——MySQL安装
1.rpm yum安装:安装方便.速度快.无法定制 2.二进制安装:解压即可使用,不能定制功能 3.编译安装: 可定制.安装慢: MySQL5.5之前:./configure make make in ...
- C# List集合类常用操作 (一)
所有操作基于以下类 class Employees { public int Id { get; set; } public string Name { get; set; } public stri ...