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. Data Lake Analytics + OSS数据文件格式处理大全

    0. 前言 Data Lake Analytics是Serverless化的云上交互式查询分析服务.用户可以使用标准的SQL语句,对存储在OSS.TableStore上的数据无需移动,直接进行查询分析 ...

  2. spring beans源码解读之--总结篇

    spring beans下面有如下源文件包: org.springframework.beans, 包含了操作java bean的接口和类.org.springframework.beans.anno ...

  3. [MySQL] mysql的逻辑分层

    mysql逻辑分层:1.client ==>连接层 ==>服务层==>引擎层==>存储层 server2.连接层: 提供与客户端连接的服务3.服务层: 1.提供各种用户使用的接 ...

  4. Django学习之六:Django 常用模块导入记忆

    Django 常用模块导入记忆 django相关 1. urls相关操作 from django.urls import path, re_path, include from django.urls ...

  5. CSS在IE6中常见的兼容性问题

    1.在IE6中png24格式的图片不透明 解决办法:写一个条件注释语句,引入一个js插件,然后调用一下js中的方法,把需要处理的元素的类名写在括号中,如下 (插件下载地址:http://www.dil ...

  6. Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll

    Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll 在使用Anaconda创建一个虚拟环境出来,然后安装了scikit-learn.nump ...

  7. Android防止按钮快速重复点击

    在用户使用 Android 应用的时候,经常会出现过快且多次点击同一按钮的情况,一方面这是因为应用或手机当前有些卡顿,另一方面也可能是由于很多应用并没有设置按钮点击时的 selector 或者其它按钮 ...

  8. Android视频录制从不入门到入门系列教程(一)————简介

    一.WHY Android SDK提供了MediaRecorder帮助开发者进行视频的录制,不过这个类很鸡肋,实际项目中应该很少用到它,最大的原因我觉得莫过于其输出的视频分辨率太有限了,满足不了项目的 ...

  9. Java:配置环境(Mac)——Eclipse;修改JDK版本后,Eclipse打不开

    1.官网下载 选择一个速度快的镜像 推荐东软这个 2.双击下载的安装包,下一步 其中有一步是选择Eclipse版本,SE选第一个,EE第二个.仔细审题吧. 3.配置JDK 应用.关闭 4.测试:写个H ...

  10. Jmeter调用自定义jar包

    一. 场景 在测试过程中, 可能需要调用第三方jar包来生成测试数据或者使用java工具类来实现业务场景, 普遍的做法是手动调用jar包, 再把这些值赋给jmeter中的某个参数, 以满足业务测试需求 ...