loj121-动态图连通性
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-动态图连通性的更多相关文章
- LOJ121 动态图连通性(LCT)
用LCT维护一下删除时间的最大生成树即可.当然也可以线段树分治. #include<iostream> #include<cstdio> #include<cmath&g ...
- 【LOJ121】「离线可过」动态图连通性
[LOJ121]「离线可过」动态图连通性 题面 LOJ 题解 线段树分治的经典应用 可以发现每个边出现的时间是一个区间 而我们每个询问是一个点 所以我们将所有边的区间打到一颗线段树上面去 询问每个叶子 ...
- LOJ121 「离线可过」动态图连通性
思路 动态图连通性的板子,可惜我不会在线算法 离线可以使用线段树分治,每个边按照存在的时间插入线段树的对应节点中,最后再dfs一下求出解即可,注意并查集按秩合并可以支持撤销操作 由于大量使用STL跑的 ...
- [LOJ#121]动态图连通性
[LOJ#121]动态图连通性 试题描述 这是一道模板题. 你要维护一张无向简单图.你被要求加入删除一条边及查询两个点是否连通. 0:加入一条边.保证它不存在. 1:删除一条边.保证它存在. 2:查询 ...
- LOJ121 【离线可过】动态图连通性
题目链接:戳我 [线段树分治版本代码] 这里面的线段树是时间线段树,每一个节点都要开一个vector,记录当前时间区间中存在的边的标号qwq #include<iostream> #inc ...
- LOJ.121.[离线可过]动态图连通性(线段树分治 按秩合并)
题目链接 以时间为下标建线段树.线段树每个节点开个vector. 对每条边在其出现时间内加入线段树,即,把这条边按时间放在线段树的对应区间上,会影响\(O(\log n)\)个节点. 询问就放在线段树 ...
- LOJ#121. 「离线可过」动态图连通性(线段树分治)
题意 板子题,题意很清楚吧.. Sol 很显然可以直接上LCT.. 但是这题允许离线,于是就有了一个非常巧妙的离线的做法,好像叫什么线段树分治?? 此题中每条边出现的位置都可以看做是一段区间. 我们用 ...
- LOJ #121. 「离线可过」动态图连通性 LCT维护最大生成树
这个还是比较好理解的. 你考虑如果所有边构成一棵树的话直接用 LCT 模拟一波操作就行. 但是可能会出现环,于是我们就将插入/删除操作按照时间排序,然后依次进行. 那么,我们就要对我们维护的生成树改变 ...
- 【LOJ】#121. 「离线可过」动态图连通性
题解 和BZOJ4025挺像的 就是维护边权是时间的最大生成树 删边直接删 两点未联通时直接相连,两点联通则找两点间边权小的一条边删除即可 代码 #include <bits/stdc++.h& ...
- LOJ 121 「离线可过」动态图连通性——LCT维护删除时间最大生成树 / 线段树分治
题目:https://loj.ac/problem/121 离线,LCT维护删除时间最大生成树即可.注意没有被删的边的删除时间是 m+1 . 回收删掉的边的节点的话,空间就可以只开 n*2 了. #i ...
随机推荐
- 分布式缓存Hazelcast案例一
分布式缓存Hazelcast案例一 Hazelcast IMDG Architecture 今天先到这儿,希望对您技术领导力, 企业管理,物联网, 系统架构设计与评估,团队管理, 项目管理, 产品管 ...
- wkhtmltox实现网页转换成图片或pdf
1.先下载http://download.gna.org/wkhtmltopdf/obsolete/windows/wkhtmltox-0.11.0_rc1-installer.exe,安装 2.在命 ...
- JAVA IO流编程 实现文件的写入、写出以及拷贝
一.流的概念 流:数据在数据源(文件)和程序(内存)之间经历的路径. 输入流:数据从数据源(文件)到程序(内存)的路径. 输出流:数据从程序(内存)到数据源(文件)的路径. 以内存为参照,如果数据向内 ...
- git操作常用命令
一.使用git 1.git是什么? Git是目前世界上最先进的分布式版本控制系统. SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己 ...
- flex 圣杯布局
基本思路 圣杯布局分为3段:上.中.下. 中段被分为:左.中.右3块. 1:采用flex布局时,先把弹性容器主轴设置为垂直方向(flex-direction:column) 2:上.中.下3块弹性项 ...
- 48.Odoo产品分析 (五) – 定制板块(3) – 修改文件和报告(1)
查看Odoo产品分析系列--目录 不管ERP系统中的内置报表有多完善,大多数的公司仍然需要对文档和报表进行一些自定义的修改. 这一章节将介绍如何对报表的页眉和页脚做自定义修改:odoo框架如何组织报 ...
- OrmLite-更符合面向对象的数据库操作方式
1. jar包下载 下载地址:http://ormlite.com/releases/,一般用core和android包即可. 如果使用的是android studio,也可以直接通过module s ...
- Android 注解框架对比
Java的注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,标记可以加在包,类,属性,方法,本地变量上.然后你可以写一个注解处理器去解析处理这些注解(人称编译时注解 ...
- TextSwitcher 文本切换器的功能与用法
TextSwitcher集成了ViewSwitcher, 因此它具有与ViewSwitcher相同的特性:可以在切换View组件时使用动画效果.与ImageSwitcher相似的是,使用TextSwi ...
- 项目案例【Net Core】如何注入多个服务实现类
需求 库表保存时,需要校验逻辑. 提交时有更深层次校验. **状态,还有特殊校验 接口 写一个通用的校验接口,这里定义了校验时间.每个阶段校验可能需要考虑顺序,增加一个顺序字段. public int ...