Solution

线段树分治, 然后直接在线段树上dfs, 在进入/回溯的过程中维护并查集的merge/split.

对于split操作, 可以在merge时按秩合并, 然后利用栈记录, split时恢复即可.

Code

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
using namespace std;
#define rep(i,l,r) for(register int i=(l);i<=(r);++i)
#define repdo(i,l,r) for(register int i=(l);i>=(r);--i)
#define il inline
typedef double db;
typedef long long ll; //---------------------------------------
const int nsz=5050,msz=5e5+50;
int n,m;
int edno[nsz][nsz],pe=0,pq=0,pq1=1;
struct te{int f,t,l,r;}edge[msz];
struct tq{int a,b,t,ans;}que[msz]; int fa[nsz],dep[nsz];
int stk[msz][2],top=0;//0 y; 1 dep[x]
int find(int p){return p==fa[p]?p:find(fa[p]);}
bool conn(int a,int b){return find(a)==find(b);}
void merge(int a,int b){
a=find(a),b=find(b);
if(a==b)return;
if(dep[a]<dep[b])swap(a,b);
stk[++top][0]=b,stk[top][1]=dep[a];
fa[b]=a,dep[a]=max(dep[a],dep[b]+1);
}
void del(int top1){
for(;top!=top1;--top){
int a=stk[top][0],b=stk[top][1];
dep[fa[a]]=b,fa[a]=a;
}
} vector<int> ee[msz*4];
#define ls(p) ((p)<<1)
#define rs(p) ((p)<<1|1)
void insert(int v,int l,int r,int rt,int rl,int rr){
if(l<=rl&&rr<=r){ee[rt].push_back(v);return;}
int mid=(rl+rr)>>1;
if(l<=mid)insert(v,l,r,ls(rt),rl,mid);
if(mid<r)insert(v,l,r,rs(rt),mid+1,rr);
}
void dfs(int rt,int rl,int rr){
int now=top;
for(int i:ee[rt])merge(edge[i].f,edge[i].t);
if(rl==rr){
while(pq1<=pq&&que[pq1].t==rl)que[pq1].ans=conn(que[pq1].a,que[pq1].b),++pq1;
}
else{
int mid=(rl+rr)>>1;
dfs(ls(rt),rl,mid);
dfs(rs(rt),mid+1,rr);
}
del(now);
} int main(){
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
ios::sync_with_stdio(0),cin.tie(0);
cin>>n>>m;
int a,b,c;
rep(i,1,m){
cin>>a>>b>>c;
if(b>c)swap(b,c);
if(a==0){
edge[++pe]=(te){b,c,i,m};
edno[b][c]=pe;
}
else if(a==1){
edge[edno[b][c]].r=i;
}
else{
que[++pq]=(tq){b,c,i,0};
}
}
rep(i,1,n)fa[i]=i,dep[i]=1;
rep(i,1,pe)insert(i,edge[i].l,edge[i].r,1,1,m);
dfs(1,1,m);
rep(i,1,pq){cout<<(que[i].ans?"Y":"N")<<'\n';}
return 0;
}

loj121-动态图连通性的更多相关文章

  1. LOJ121 动态图连通性(LCT)

    用LCT维护一下删除时间的最大生成树即可.当然也可以线段树分治. #include<iostream> #include<cstdio> #include<cmath&g ...

  2. 【LOJ121】「离线可过」动态图连通性

    [LOJ121]「离线可过」动态图连通性 题面 LOJ 题解 线段树分治的经典应用 可以发现每个边出现的时间是一个区间 而我们每个询问是一个点 所以我们将所有边的区间打到一颗线段树上面去 询问每个叶子 ...

  3. LOJ121 「离线可过」动态图连通性

    思路 动态图连通性的板子,可惜我不会在线算法 离线可以使用线段树分治,每个边按照存在的时间插入线段树的对应节点中,最后再dfs一下求出解即可,注意并查集按秩合并可以支持撤销操作 由于大量使用STL跑的 ...

  4. [LOJ#121]动态图连通性

    [LOJ#121]动态图连通性 试题描述 这是一道模板题. 你要维护一张无向简单图.你被要求加入删除一条边及查询两个点是否连通. 0:加入一条边.保证它不存在. 1:删除一条边.保证它存在. 2:查询 ...

  5. LOJ121 【离线可过】动态图连通性

    题目链接:戳我 [线段树分治版本代码] 这里面的线段树是时间线段树,每一个节点都要开一个vector,记录当前时间区间中存在的边的标号qwq #include<iostream> #inc ...

  6. LOJ.121.[离线可过]动态图连通性(线段树分治 按秩合并)

    题目链接 以时间为下标建线段树.线段树每个节点开个vector. 对每条边在其出现时间内加入线段树,即,把这条边按时间放在线段树的对应区间上,会影响\(O(\log n)\)个节点. 询问就放在线段树 ...

  7. LOJ#121. 「离线可过」动态图连通性(线段树分治)

    题意 板子题,题意很清楚吧.. Sol 很显然可以直接上LCT.. 但是这题允许离线,于是就有了一个非常巧妙的离线的做法,好像叫什么线段树分治?? 此题中每条边出现的位置都可以看做是一段区间. 我们用 ...

  8. LOJ #121. 「离线可过」动态图连通性 LCT维护最大生成树

    这个还是比较好理解的. 你考虑如果所有边构成一棵树的话直接用 LCT 模拟一波操作就行. 但是可能会出现环,于是我们就将插入/删除操作按照时间排序,然后依次进行. 那么,我们就要对我们维护的生成树改变 ...

  9. 【LOJ】#121. 「离线可过」动态图连通性

    题解 和BZOJ4025挺像的 就是维护边权是时间的最大生成树 删边直接删 两点未联通时直接相连,两点联通则找两点间边权小的一条边删除即可 代码 #include <bits/stdc++.h& ...

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

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

随机推荐

  1. c++性能测试工具:google benchmark入门(一)

    如果你正在寻找一款c++性能测试工具,那么这篇文章是不容错过的. 市面上的benchmark工具或多或少存在一些使用上的不便,那么是否存在一个使用简便又功能强大的性能测试工具呢?答案是google/b ...

  2. CentOS 7.4 下 如何部署 AspNetCore 结合 consul

    上篇我们讲到consul的概念,以及在WIN下如何使用:http://www.cnblogs.com/szlblog/p/9162557.html 步骤如下: 1.安装虚拟机VM 2.下载安装 Cen ...

  3. C#实现注册表 LocalMachine 目录下CURD工具类

    [1]注册表是什么?         百度百科 https://baike.baidu.com/item/%E6%B3%A8%E5%86%8C%E8%A1%A8/101856?fr=aladdin [ ...

  4. MySQL 笔记整理(10) --MySQL为什么有时会选错索引?

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 10) --MySQL为什么有时会选错索引? MySQL中的一张表上可以 ...

  5. 一个简易的Python爬虫,将爬取到的数据写入txt文档中

    代码如下: import requests import re import os #url url = "http://wiki.akbfun48.com/index.php?title= ...

  6. 验证码的设计与记住我存储用户名密码cookie的技术及单选按钮选择登录人身份的实现

    login.jsp页面 <head> <script type="text/javascript" src="js/captcha.js"&g ...

  7. 折腾Java设计模式之备忘录模式

    原文地址:折腾Java设计模式之备忘录模式 备忘录模式 Without violating encapsulation, capture and externalize an object's int ...

  8. 【设计模式】原型模式 Pototype Pattern

    前面讲了创建一个对象实例的方法单例模式Singleton Pattern, 创造多个产品的工厂模式(简单工厂模式 Simple Factory Pattern, 工厂方法模式 FactoryMothe ...

  9. 获取OlapConnection连接

    目录: 1.获取org.olap4j.OlapConnection对象 2.获取mondrian.olap.Connection对象 一.org.olap4j.OlapConnection对象 说明: ...

  10. Ubuntu 18.04中截图工具Shutter的编辑按钮不可用的解决办法

    Shutter是一个由第三方提供的在Ubuntu上运行的截图工具,相对于系统自带的截图工具(默认可通过Ctrl + Shift + Print快捷键启动截图),最大的优点就是可以即时对图片进行编辑,在 ...