Description

你要维护一张无向简单图。你被要求加入删除一条边及查询两个点是否连通。
0:加入一条边。保证它不存在。
1:删除一条边。保证它存在。
2:查询两个点是否联通。

Input

输入的第一行是两个数 N,M。N≤5000,M≤500000。
接下来 M行,每一行三个数 op x y。op表示操作编号。

Output

对于每一个 op=2的询问,输出一行 Y 或 N ,表示两个节点是否连通。

Sample Input

200 5

2 123 127

0 123 127

2 123 127

1 127 123

2 123 127

Sample Output

N

Y

N

Hint

样例输入2
4 10
0 1 2
0 2 3
0 3 1
2 1 4
0 4 3
2 1 4
1 2 3
2 1 4
1 1 3
2 1 4
样例输出2
N
Y
Y
N

图的连通性= =容易想到用并查集来维护,然而并查集不支持删除操作啊o((⊙﹏⊙))o

这里介绍一个套路——线段树分治。

首先,这是一个离线算法,是以时间进行的分治,一般用来搞添加(删除)容易但删除(添加)困难的题目。

然后,这里仅介绍一点点其应用,因为代码量略大敲着太痛苦(然而它号称只要不在线,什么都能可持久),dalao可以挑战。

嗯,我们就用线段树分治来搞这道题,再讲一下分治的模型:

1、根据时间给节点打标记

2、跑一遍线段树

感觉好像什么都没说233

#include<bits/stdc++.h>
using namespace std;
#define Inc(i,L,R) for(register int i=(L);i<=(R);++i)
#define Red(j,R,L) for(register int j=(R);j>=(L);--j)
const int N = 5010,M = 5e5+10;
struct Data{int x,y;
};
Data e[M],q[M];
int cnte,cntq;
struct Union{int p[N],siz[N];stack<Data>stk;//我们开一个栈来保存合并了哪些点 inline void Reset(int n){Inc(i,1,n)p[i]=i;Inc(i,1,n)siz[i]=1;}inline int Findfa(int x){while(x!=p[x])x=p[x];return x;}inline void Merge(int idx){int x=e[idx].x,y=e[idx].y;int fx=Findfa(x),fy=Findfa(y);if(fx==fy)return ;if(siz[fx]>siz[fy])swap(fx,fy);stk.push((Data){fx,fy});siz[p[fx]=fy]+=siz[fx];}inline void Delete(int Presiz){//撤销操作 while(stk.size()>Presiz){Data tmp=stk.top();stk.pop();siz[tmp.y]-=siz[p[tmp.x]=tmp.x];}}inline bool Connect(int idx){return Findfa(q[idx].x)==Findfa(q[idx].y);}
}u;
struct SegMent{struct Tree{bool Loc;int L,r,idx;vector<int>vec;//存储边的编号 }t[M<<2];#define Ls v<<1#define rs v<<1|1inline void build(int v,int L,int r){t[v]=(Tree){0,L,r,0};t[v].vec.clear();if(L==r)return ;int Mid=L+r>>1;build(Ls,L,Mid),build(rs,Mid+1,r);}inline void update(int v,int A,int b,int idx){//每条边在哪些时刻出现过 if(t[v].L>b||t[v].r<A)return ;if(A<=t[v].L&&t[v].r<=b)return t[v].vec.push_back(idx),void();update(Ls,A,b,idx),update(rs,A,b,idx);}inline void LocQ(int v,int Time,int idx){if(t[v].L>Time||t[v].r<Time)return ;t[v].Loc=1;//小加速?不用完全遍历整个区间 if(t[v].L==t[v].r)return t[v].idx=idx,void();//问题的编号 LocQ(Ls,Time,idx),LocQ(rs,Time,idx);}inline void Stat(int v){if(!t[v].Loc)return ;int tmpsiz=u.stk.size();if(t[v].vec.size())Inc(i,0,t[v].vec.size()-1)u.Merge(t[v].vec[i]);if(t[v].L==t[v].r)return u.Connect(t[v].idx)?puts("Y"):puts("N"),void();Stat(Ls),Stat(rs);u.Delete(tmpsiz);}
}t;
int n,m,pre[M];
#define pr pair
#define mkpr make_pair
map<pair<int,int>,int>op;
inline void init(){scanf("%d%d",&n,&m);t.build(1,1,m);//以时间分治u.Reset(n);Inc(i,1,m){int opt,x,y;scanf("%d%d%d",&opt,&x,&y);if(x>y)swap(x,y);//看样例 if(opt==0){e[op[mkpr(x,y)]=++cnte]=(Data){x,y};pre[cnte]=i;}else if(opt==1){//删除代表这条边只在之前的某个时刻到现在i(i-1)时间存在 int idx=op[mkpr(x,y)];t.update(1,pre[idx],i,idx);//-1无所谓 pre[idx]=-1;}else {q[++cntq]=(Data){x,y};t.LocQ(1,i,cntq);}}Inc(idx,1,m)if(~pre[idx])t.update(1,pre[idx],m,idx);
}
int main(){init();t.Stat(1);return 0;
}

#Loj121 动态图连通性相关推荐

  1. 动态图连通性(线段树分治+按秩合并并查集)

    在考场上遇到了这个的板子题,,,所以来学习了一下线段树分治 + 带撤销的并查集. 题目大意是这样的:有m个时刻,每个时刻有一个加边or撤销一条边的操作,保证操作合法,没有重边自环,每次操作后输出当前图 ...

  2. LOJ 121 「离线可过」动态图连通性——LCT维护删除时间最大生成树 / 线段树分治...

    题目:https://loj.ac/problem/121 离线,LCT维护删除时间最大生成树即可.注意没有被删的边的删除时间是 m+1 . 回收删掉的边的节点的话,空间就可以只开 n*2 了. #i ...

  3. 动态图或动态网络的表示

    动态图(动态网络)有多种形式的表示,以下对此进行一个系统的阐述. (接触序列-Contact Sequence) 在下图中,有 N N N个顶点 V V V在特定时间彼此交互,并且交互的持续时间可以忽 ...

  4. 【推荐系统->论文阅读】Dynamic Graph Neural Networks for Sequential Recommendation(用于序列推荐的动态图神经网络)

    Dynamic Graph Neural Networks for Sequential Recommendation(用于序列推荐的动态图神经网络) Mengqi Zhang, Shu Wu,Mem ...

  5. 动态图相册 android,‎App Store 上的“动态图相册”

    累计1000+"真实"五星好评 9大核心功能:GIF播放.GIF保存.GIF分享.GIF压缩.文件夹管理.全网GIF搜索.全网GIF浏览.导入导出.GIF制作 累计1000+&qu ...

  6. 兼容超大图片的处理_动态图适用性调研与兼容性方案

    背景 业务中大量使用gif动态图,动画不细腻,体积大,占用不必要的带宽,根据这几点,寻找能替代gif图的方案(动画流程,体积小) 动态图类型 GIF GIF 是一个非常古老的格式,1987 年诞生,最 ...

  7. 可能是最详尽的PyTorch动态图解析

    ↑ 点击蓝字 关注视学算法 作者丨Gemfield@@知乎 来源丨https://zhuanlan.zhihu.com/p/61765561.https://zhuanlan.zhihu.com/p/ ...

  8. 详尽 | PyTorch动态图解析

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:深度学习这件小事 背景 PyTorch的动态图框架主要是 ...

  9. dogdoggo搜索引擎_Giphy:专搜GIF动态图的搜索引擎

    无论是在社交网站.网络论坛还是聊天工具上,GIF动态图都是个可重口.可清新.可搞笑.可卖萌的好东西.但是,对于喜欢GIF的人们来说,搜索特定主题的高质量GIF却是一件很困难的事情--虽然百度图片也能搜 ...

最新文章

  1. 独家 | Python 3.10发布——你应该知道的五大新特性
  2. mysql 主从复制 双主从复制原理   防止主键重复问题(必看)
  3. 【Java Web开发指南】解析Spring中Ioc和DI(入门Demo)
  4. 存储管理之页式、段式、段页式存储
  5. 前端性能优化知识,包括css和js
  6. 计算机安全覆盖的内容有哪些,计算机网络的分类有哪些
  7. C# int转string 每三位加一个逗号
  8. 今天没发程序!HOHO!!!
  9. 在Java中通过线程池实现异步执行
  10. 鸡兔同笼c语言编程穷举,C语言程序设计100例之(1):鸡兔同笼
  11. 用python做产出数据分析案例_利用python进行数据分析——医院销售额案例
  12. 5款好用的时间管理软件推荐[2020年推荐]
  13. 电子签章服务器位置的确定,一文看懂如何实现服务端电子签章
  14. matlab编写正弦波mif,使用MATLAB一键制作mif文件
  15. https证书、公钥、私钥、签名介绍
  16. 百度界面代码及效果展示
  17. android 音频转mp3格式,音频 (六)- 安卓 ndk 将 pcm 转换为 mp3
  18. 全球四大卫星导航系统
  19. 带张光盘去装机(转)
  20. 致终将逝去的2021

热门文章

  1. xrdpdf卡片在哪可下载_含标准卡片的XRD多谱图制作教程完成版.pdf
  2. 【附源码】Java计算机毕业设计户籍管理系统(程序+LW+部署)
  3. 使用Python玩赤色要塞 初初初级版
  4. ​实用新型专利申请流程及费用?
  5. Cadence 17.2 软件使用(2)— OrCAD新建原理图工程和原理图库
  6. Windows(2003/2008/2012)弹性云系统盘扩容方法
  7. python写的mysql清库脚本,可根据表名分类
  8. 点击试剂CuAAC,标记生物分子用科研试剂供应
  9. B 站出面回应源码泄露门事件!裁员报复还是反抗 996?
  10. WebService 错误:无法加载协定为xxx的终结点配置部分,因为找到了该协定的多个终结点配置