题意

  给出一个n个点m条边的无向联通图(n,m<=5e5),有q(q<=5e5)个询问

  每个询问询问一个边集{Ei},回答这些边能否在同一个最小生成树中

分析

  要知道一个性质,就是权值不同的边之间是独立的,即权值为x的所有边的选取不影响权值>x的边的选取

  于是我们可以把所有询问离线,按边权排序,对于当前处理的边权,如果有某个询问在其中,那么我们把这些边加进去看有没有环,如果有,那么这个询问就被叉掉了,当然处理完了还要把刚才的操作撤销掉

  处理了当前权值x的所有询问,最后别忘了把权值为x的边做kruskal算法加进去

  这样时间复杂度是带log的(按秩合并的可撤销并查集的复杂度)

  

 #include<bits/stdc++.h>
using namespace std;
const int maxn=5e5;
int f[maxn+],sz[maxn+];
int ans[maxn+];
struct Edge
{
int u,v,w;
}edge[maxn+];
vector<int> b[maxn+];
vector<int> q[maxn+];
struct question
{
int id,from,to;
};
vector<question> a[maxn+];
int n,m,Q;
bool cmp(const int x,const int y)
{
return edge[x].w<edge[y].w;
}
stack<pair<int,int> > s;
int find(int x)
{
if(f[x]==x) return x;else return find(f[x]);
}
void Union(int x,int y)
{
if(sz[x]<sz[y]) f[x]=y,sz[y]+=sz[x],s.push(make_pair(x,y));
else f[y]=x,sz[x]+=sz[y],s.push(make_pair(y,x));
}
void remove()
{
pair<int,int> u=s.top();
s.pop();
f[u.first]=u.first;
sz[u.second]-=sz[u.first];
}
bool check(int id,int from,int to)
{
bool ans=;
int sum=;
for(int i=from;i<=to;++i)
{
int p=q[id][i];
int x=find(edge[p].u),y=find(edge[p].v);
if(x!=y) Union(x,y),++sum;else ans=;
}
for(int i=;i<=sum;++i) remove();
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;++i)
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w),b[edge[i].w].push_back(i);
scanf("%d",&Q);
for(int i=;i<=Q;++i)
{
q[i].clear();
int num,x;
scanf("%d",&num);
while(num--)
{
scanf("%d",&x);
q[i].push_back(x);
}
sort(q[i].begin(),q[i].end(),cmp);
int from=;
for(int j=;j<q[i].size();++j)
if(edge[q[i][j]].w!=edge[q[i][j-]].w)
{
a[edge[q[i][j-]].w].push_back({i,from,j-});
from=j;
}
a[edge[q[i][q[i].size()-]].w].push_back({i,from,q[i].size()-});
}
for(int i=;i<=n;++i) f[i]=i,sz[i]=;
for(int i=;i<=maxn;++i)
{
for(int j=;j<a[i].size();++j)
if(!check(a[i][j].id,a[i][j].from,a[i][j].to)) ans[a[i][j].id]=;
for(int j=;j<b[i].size();++j)
{
int p=b[i][j];
int x=find(edge[p].u),y=find(edge[p].v);
if(x!=y) Union(x,y);
}
}
for(int i=;i<=Q;++i)
if(ans[i]) printf("NO\n");else printf("YES\n");
return ;
}

codeforces 892E(离散化+可撤销并查集)的更多相关文章

  1. Codeforces 938G 线段树分治 线性基 可撤销并查集

    Codeforces 938G Shortest Path Queries 一张连通图,三种操作 1.给x和y之间加上边权为d的边,保证不会产生重边 2.删除x和y之间的边,保证此边之前存在 3.询问 ...

  2. CodeForces892E 可撤销并查集/最小生成树

    http://codeforces.com/problemset/problem/892/E 题意:给出一个 n 个点 m 条边的无向图,每条边有边权,共 Q 次询问,每次给出 ki​ 条边,问这些边 ...

  3. 2019牛客第八场多校 E_Explorer 可撤销并查集(栈)+线段树

    目录 题意: 分析: @(2019牛客暑期多校训练营(第八场)E_Explorer) 题意: 链接 题目类似:CF366D,Gym101652T 本题给你\(n(100000)\)个点\(m(1000 ...

  4. POJ 1733 Parity game(离散化+带权并查集)

    离散化+带权并查集 题意:长度为n的0和1组成的字符串,然后问第L和R位置之间有奇数个1还是偶数个1. 根据这些回答, 判断第几个是错误(和之前有矛盾)的. 思路:此题同HDU 3038 差不多,询问 ...

  5. bzoj2049 线段树 + 可撤销并查集

    https://www.lydsy.com/JudgeOnline/problem.php?id=2049 线段树真神奇 题意:给出一波操作,拆边加边以及询问两点是否联通. 听说常规方法是在线LCT, ...

  6. BZOJ4358: permu(带撤销并查集 不删除莫队)

    题意 题目链接 Sol 感觉自己已经老的爬不动了.. 想了一会儿,大概用个不删除莫队+带撤销并查集就能搞了吧,\(n \sqrt{n} logn\)应该卡的过去 不过不删除莫队咋写来着?....跑去学 ...

  7. 【离线 撤销并查集 线段树分治】bzoj1018: [SHOI2008]堵塞的交通traffic

    本题可化成更一般的问题:离线动态图询问连通性 当然可以利用它的特殊性质,采用在线线段树维护一些标记的方法 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常 ...

  8. 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)

    题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...

  9. 【BZOJ4025】二分图(可撤销并查集+线段树分治)

    题目: BZOJ4025 分析: 定理:一个图是二分图的充要条件是不存在奇环. 先考虑一个弱化的问题:保证所有边出现的时间段不会交叉,只会包含或相离. 还是不会?再考虑一个更弱化的问题:边只会出现不会 ...

随机推荐

  1. like SQL注入与防止 (bin2hex unhex)

    普通的列表模糊查询,可能会被sql注入利用,造成数据泄漏,严重的甚至导致删表删库! 程序中sql语句拼装: $sql = 'student_name like '"%'.$name.'%&q ...

  2. ubuntu系统apache日志文件的位置

    Debian,Ubuntu或Linux Mint上的Apache错误日志位置 默认的错误日志 在基于Debian的Linux上,系统范围的Apache错误日志默认位置是/var/log/apache2 ...

  3. 如何用Chrome自带的截屏功能截取超过一个屏幕的网页

    提升程序员工作效率的工具/技巧推荐系列 推荐一个功能强大的文件搜索工具SearchMyFiles 介绍一个好用的免费流程图和UML绘制软件-Diagram Designer 介绍Windows任务管理 ...

  4. uva1228 Integer Transmission

    这道题思维很灵活.也有点套路的意思. 首先规定0,1分别按照原来的顺序接收,只是01换位.这样简化了思维.(否则并不会有更优结果它.,比较好想)最大值和最小值可以贪心得到.那么接下来就是给定一个整数P ...

  5. 1+1/2+1/3+...+1/n为素数的证明

    我们考虑不大于 n的最大的2 的幂 2^k. 令 有 其中 a/b是剩下的所有的项的和,由于乘以了最大的 2的幂,所以剩下的所有项的分母都是奇数,故而 b是奇数.如果 m是整数,那么就会导致等式右边的 ...

  6. VsCode使用之HTML 中 CSS Class 智能提示

    HTML 中 CSS Class 智能提示 安装插件:HTML CSS Support 设置中添加以下代码: "editor.parameterHints": true, &quo ...

  7. 自定义分隔符|/i|/x|/xs|需要转译

    小骆驼 第八章 用正则表达式进行匹配 #!/usr/bin/envperl use strict; use warnings; $_ ="#adchbehnyhme3534f\nvdh5ej ...

  8. Web前端技术体系大全搜索

    一.前端技术框架 1.Vue.js 官网:https://cn.vuejs.org/ Vue CLI:https://cli.vuejs.org/ 菜鸟教程:http://www.runoob.com ...

  9. 用户管理命令--useradd

    用户管理命令--useradd 作用:用于添加一个新的用户 格式:useradd [ 选项 ] 用户名 选项的常用介绍 -u: UID指定用户id,必须是唯一的,并且大于499 -c: 添加注释,可以 ...

  10. C#对象初始化的探讨

    最近在弄MQ的性能监测数据埋点,无疑中用到一个Nstatsd的客户端,看到里面写过里面一种嵌套类的写法.代码如下: 客户端Client是一个密封的类,并且构造函数私有访问.然后又用一个嵌套类Curre ...