题目


分析

最直接的做法就是在线一边修改边权,询问直接全部重排,

然后用可撤销并查集维护连通块大小,这样时间复杂度为 \(O(qm)\)

同样尽量让大部分的边不需要修改边权,那么每 \(B\) 个操作整体进行一次,

那么最多只有 \(B\) 条边会修改,剩下的边直接用双指针加入并查集。

这 \(B\) 条边直接每次询问修改边权,然后排序加入并查集,询问完与剩下的边归并排序

那么时间复杂度为 \(O(qB\log n+\frac{m^2}{B}\log n)\),实际上 \(B\) 取 \(\sqrt{m\log n}\) 跑得比较快。

注意可撤销并查集不能通过siz的大小合并,只是为了方便,但可能会被卡。


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=100011; struct node{int x,y,w;}e[N]; struct rec{int x,y,rk;}q[N],a[N];
int n,m,Q,bl,f[N],rk[N],siz[N],ans[N],Fa[N],tod,Fb[N],v[N],Rk[N],RK[N],rK[N];
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
bool cmp0(int x,int y){return e[x].w>e[y].w;}
bool cmp1(int x,int y){return q[x].y>q[y].y;}
int getf(int u){return f[u]==u?u:getf(f[u]);}
void Merge(int x,int y){
int fa=getf(x),fb=getf(y);
if (siz[fa]>siz[fb]) swap(fa,fb);
if (fa==fb) return;
f[fa]=fb,siz[fb]+=siz[fa],Fa[++tod]=fa,Fb[tod]=fb;
}
int main(){
n=iut(),m=iut();
for (int i=1;i<=m;++i) e[i]=(node){iut(),iut(),iut()};
for (int i=1;i<=n;++i) f[i]=i,siz[i]=1;
for (int i=1;i<=m;++i) rk[i]=i;
Q=iut(),bl=sqrt(m*log(n)),sort(rk+1,rk+1+m,cmp0);
for (int l=1,r;l<=Q;l+=bl){
if (l+bl>Q) r=Q; else r=l+bl-1;
int tot=0,cnt=0,TOT=0,ToT=0;
for (int i=l;i<=r;++i){
int opt=iut(),x=iut(),y=iut();
if (opt==1) ++tot,a[tot]=(rec){x,y,tot},v[x]=l;
else q[++cnt]=(rec){x,y,tot},Rk[cnt]=cnt;
}
if (!cnt) continue;
for (int i=1;i<=m;++i) if (v[i]==l) rK[++TOT]=i;
sort(Rk+1,Rk+1+cnt,cmp1);
for (int i=1,j=1;i<=cnt;++i){
for (;j<=m&&e[rk[j]].w>=q[Rk[i]].y;++j)
if (v[rk[j]]!=l) Merge(e[rk[j]].x,e[rk[j]].y);
for (int k=1;k<=q[Rk[i]].rk;++k) swap(e[a[k].x].w,a[k].y);
int Tod=tod;
for (int k=1;k<=TOT;++k)
if (e[rK[k]].w>=q[Rk[i]].y)
Merge(e[rK[k]].x,e[rK[k]].y);
ans[Rk[i]]=siz[getf(q[Rk[i]].x)];
for (;tod>Tod;--tod) siz[Fb[tod]]-=siz[Fa[tod]],f[Fa[tod]]=Fa[tod];
for (int k=q[Rk[i]].rk;k;--k) swap(e[a[k].x].w,a[k].y);
}
for (;tod;--tod) siz[Fb[tod]]-=siz[Fa[tod]],f[Fa[tod]]=Fa[tod];
for (int k=1;k<=tot;++k) swap(e[a[k].x].w,a[k].y);
sort(rK+1,rK+1+TOT,cmp0);
int I=1,J=1;
while (I<=TOT){
while (J<=m&&v[rk[J]]==l) ++J;
if (J<=m&&e[rk[J]].w>=e[rK[I]].w) RK[++ToT]=rk[J++];
else RK[++ToT]=rK[I++];
}
for (;J<=m;++J) if (v[rk[J]]!=l) RK[++ToT]=rk[J];
for (int i=1;i<=ToT;++i) rk[i]=RK[i];
for (int i=1;i<=cnt;++i) print(ans[i]),putchar(10);
}
return 0;
}

#分块,可撤销并查集#洛谷 5443 [APIO2019]桥梁的更多相关文章

  1. [BZOJ4537][Hnoi2016]最小公倍数 奇怪的分块+可撤销并查集

    4537: [Hnoi2016]最小公倍数 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1474  Solved: 521[Submit][Stat ...

  2. 【简单数据结构】并查集--洛谷 P1111

    题目背景 AA地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 题目描述 给出A地区的村庄数NN,和公路数MM,公路是双向的.并告诉你每条公路的连着哪两个村庄,并告诉你 ...

  3. bzoj2049 线段树 + 可撤销并查集

    https://www.lydsy.com/JudgeOnline/problem.php?id=2049 线段树真神奇 题意:给出一波操作,拆边加边以及询问两点是否联通. 听说常规方法是在线LCT, ...

  4. CodeForces892E 可撤销并查集/最小生成树

    http://codeforces.com/problemset/problem/892/E 题意:给出一个 n 个点 m 条边的无向图,每条边有边权,共 Q 次询问,每次给出 ki​ 条边,问这些边 ...

  5. BZOJ4358: permu(带撤销并查集 不删除莫队)

    题意 题目链接 Sol 感觉自己已经老的爬不动了.. 想了一会儿,大概用个不删除莫队+带撤销并查集就能搞了吧,\(n \sqrt{n} logn\)应该卡的过去 不过不删除莫队咋写来着?....跑去学 ...

  6. 【离线 撤销并查集 线段树分治】bzoj1018: [SHOI2008]堵塞的交通traffic

    本题可化成更一般的问题:离线动态图询问连通性 当然可以利用它的特殊性质,采用在线线段树维护一些标记的方法 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常 ...

  7. codeforces 892E(离散化+可撤销并查集)

    题意 给出一个n个点m条边的无向联通图(n,m<=5e5),有q(q<=5e5)个询问 每个询问询问一个边集{Ei},回答这些边能否在同一个最小生成树中 分析 要知道一个性质,就是权值不同 ...

  8. 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)

    题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...

  9. 【BZOJ4025】二分图(可撤销并查集+线段树分治)

    题目: BZOJ4025 分析: 定理:一个图是二分图的充要条件是不存在奇环. 先考虑一个弱化的问题:保证所有边出现的时间段不会交叉,只会包含或相离. 还是不会?再考虑一个更弱化的问题:边只会出现不会 ...

  10. 算法笔记--可撤销并查集 && 可持久化并查集

    可撤销并查集模板: struct UFS { stack<pair<int*, int>> stk; int fa[N], rnk[N]; inline void init(i ...

随机推荐

  1. dd命令创建文件

    dd if=... of=... bs=... count=... if表示输入文件,of表示输出文件,bs默认指定了以字节为单位的块大小(单位有字节c,字w,块B,千字节m,兆字节m,吉字节G),c ...

  2. 记录一个错误:Traceback (most recent call last): from pip._internal.cli.main import main ImportError: No module named pip._internal.cli.main

    问题描述 在安装yaml时得到报错如下 root@ag-virtual-machine:/home/ag/test_script# pip install pyyaml Traceback (most ...

  3. 【Azure App Service】Local Git App Service的仓库代码遇见卡住不Clone代码的问题

    问题描述 启用App Service Local Git 部署,在Clone 代码库到本地时候,卡在Clone 'xxxxxx' ... ... 一动不动的问题? 问题解答 因为Git Clone没有 ...

  4. 【Azure Spring Cloud】在Azure Spring Apps上看见 App Memory Usage 和 jvm.menory.use 的指标的疑问及OOM

    问题描述 在Azure的Spring Cloud服务 (官名为:Spring Apps)中,在Metrics 页面中查看 App Memory Usage 和 jvm.memory.use,发现两则在 ...

  5. Jupyter Notebook 遇上 NebulaGraph,可视化探索图数据库

    在之前的<手把手教你用 NebulaGraph AI 全家桶跑图算法>中,除了介绍了 ngai 这个小工具之外,还提到了一件事有了 Jupyter Notebook 插件: https:/ ...

  6. PHP项目&TP框架&SQL&XSS&架构&路由&调试&写法

    开发基础-TP框架-入口&调试&路由&写法等 参考手册-TP5开发手册-为了掌握了解框架 首页文件看APP_PATH定义-为了后期分析核心代码 全局搜索:THINK_VERSI ...

  7. [Linux] 无显示器 无键盘 网线直连传输文件

    有显示器可以操作 这种情况下要简单的多,基本思想是,网线直连之后让其中一方当作网关,分配好ip地址,比如说192.168.8.1,网关也是192.168.8.1即可,如果要填写子网掩码就写255.25 ...

  8. Java 异常处理(2) : 异常处理的方式二:throws + 异常类型

    1 package com.bytezero.throwable; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 impor ...

  9. 2023 Gartner RPA魔力象限报告解读:国产厂商“破纪录”跃升意味着什么?

    2023 Gartner RPA魔力象限报告解读:象限跃升彰显国产RPA厂商实力 2023 Gartner RPA魔力象限报告四大行业趋势,国产RPA厂商已在践行 文/王吉伟 8月3日,全球著名咨询调 ...

  10. 速存,详细罗列香橙派AIpro外设接口样例大全(附源码)

    本文分享自华为云社区<香橙派AIpro外设接口样例大全(附源码)>,作者:昇腾CANN. Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能 AI 开发板,其搭载了昇 ...