题目链接:戳我

【线段树分治版本代码】

这里面的线段树是时间线段树,每一个节点都要开一个vector,记录当前时间区间中存在的边的标号qwq

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<stack>
#include<vector>
#define MAXN 1000010
using namespace std;
int n,m;
int fa[MAXN],siz[MAXN],tim[5010][5010];
struct Node{int x,y;};
struct Que{int op,x,y;}q[MAXN];
struct Seg{
int l,r;
vector<int>v;
}t[MAXN<<2];
stack<Node>s;
//map<pair<int,int>,int>tim;
inline int ls(int x) {return x<<1;}
inline int rs(int x) {return x<<1|1;}
inline int find(int x){return fa[x]==x?x:find(fa[x]);}
inline void build(int x,int l,int r)
{
t[x].l=l,t[x].r=r;
if(l==r) return;
int mid=(l+r)>>1;
build(ls(x),l,mid);
build(rs(x),mid+1,r);
}
inline void merge(int x,int y)
{
x=find(x),y=find(y);
if(x==y) return;
if(siz[x]>siz[y]) swap(x,y);
fa[x]=y;
s.push((Node){x,y});
siz[y]+=siz[x];
}
inline void del(int x)
{
while((int)s.size()>x)
{
Node cur=s.top(); s.pop();
siz[cur.y]-=siz[fa[cur.x]=cur.x];
}
}
inline void insert(int x,int ll,int rr,int k)
{
int l=t[x].l,r=t[x].r;
if(ll<=l&&r<=rr)
{
t[x].v.push_back(k);
return;
}
int mid=(l+r)>>1;
if(ll<=mid) insert(ls(x),ll,rr,k);
if(mid<rr) insert(rs(x),ll,rr,k);
}
inline void solve(int x)
{
int cur=s.size();
for(int i=0,len=t[x].v.size();i<len;i++)
merge(q[t[x].v[i]].x,q[t[x].v[i]].y);
if(t[x].l==t[x].r)
{
if(q[t[x].l].op==2)
{
if(find(q[t[x].l].x)==find(q[t[x].l].y))
printf("Y\n");
else printf("N\n");
}
}
else solve(ls(x)),solve(rs(x));
del(cur);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
//freopen("ce.out","w",stdout);
#endif
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) fa[i]=i,siz[i]=1;
build(1,1,m);
for(int i=1;i<=m;i++)
{
int op,x,y;
scanf("%d%d%d",&op,&x,&y);
if(x>y) swap(x,y);
q[i]=(Que){op,x,y};
if(op==1)
{
insert(1,tim[x][y],i,i);
tim[x][y]=0;
}
else if(op==0) tim[x][y]=i;
}
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
if(tim[i][j])
insert(1,tim[i][j],m,tim[i][j]);
solve(1);
return 0;
}

请不要用map!!!会T死的!!!

【LCT版本代码】(咕咕咕)

强制在线的还不会写。。暂且也咕着吧qwqwq

LOJ121 【离线可过】动态图连通性的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. hex文件和bin文件区别

    HEX文件和BIN文件是我们经常碰到的2种文件格式.因为自己也是新手,所以一直对这两个文件懵懵懂懂,不甚了解,最近在做STM32单片机的IAP更新,其中要考虑HEX文件和BIN文件,所以需要学习下这两 ...

  2. PIN 引脚类型

    一个 capture filter 通常有两个或更多个输出相同类型数据的输出引脚,例如预览引脚和捕捉引脚.因此,媒体类型不是区分引脚的好方法. //相反,这些引脚通过它们的功能来区分,这些功能是使用称 ...

  3. sdm 使用阿里云域名申请 Let’s Encrypt 通配符 域名证书

    安装acme 进入 套件中心 点击安装 Git Server 之后进入SSh会使用git命令 方法1--------------------------------------- 获取代码 git c ...

  4. 读取指定路径的Properties文件

    1.读取项目内的properties文件,项目内的properties文件一般都放在resource文件夹下面, 通过getClassLoader().getResourceAsStream()来获取 ...

  5. 深入理解Spring的容器内事件发布监听机制

    目录 1. 什么是事件监听机制 2. JDK中对事件监听机制的支持 2.1 基于JDK实现对任务执行结果的监听 3.Spring容器对事件监听机制的支持 3.1 基于Spring实现对任务执行结果的监 ...

  6. SQLite介绍

    优点:轻量级.绿色组件.单一文件.跨平台.查询效率极高.使用事务插入速度极快.支持limit分页. 适合查询速度要求较高,内存占用较少的场合,尤其是嵌入式操作系统,如各种手机操作系统,低并发web(9 ...

  7. JavaScript Math.floor() 方法

    定义和用法: floor() 方法可对一个数进行下舍入. 语法: Math.floor(x); x:必须参数,可以是任意数值或表达式: 返回值: 小于等于 x,且与 x 最接近的整数. 说明: flo ...

  8. PBYTE

    typedef BYTE near           *PBYTE;

  9. nvidia 驱动下载地址

    http://www.nvidia.com/Download/index.aspx?lang=en-us

  10. .net手动编写Windows服务

    1,打开VS,新建一个windows服务程序.项目名称自定义,我这里用的默认名称:Service1 2,打开Service1,按F7查看代码.代码里有三个方法:public Service1().pr ...