#分块,可撤销并查集#洛谷 5443 [APIO2019]桥梁
分析
最直接的做法就是在线一边修改边权,询问直接全部重排,
然后用可撤销并查集维护连通块大小,这样时间复杂度为 \(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]桥梁的更多相关文章
- [BZOJ4537][Hnoi2016]最小公倍数 奇怪的分块+可撤销并查集
4537: [Hnoi2016]最小公倍数 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1474 Solved: 521[Submit][Stat ...
- 【简单数据结构】并查集--洛谷 P1111
题目背景 AA地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 题目描述 给出A地区的村庄数NN,和公路数MM,公路是双向的.并告诉你每条公路的连着哪两个村庄,并告诉你 ...
- bzoj2049 线段树 + 可撤销并查集
https://www.lydsy.com/JudgeOnline/problem.php?id=2049 线段树真神奇 题意:给出一波操作,拆边加边以及询问两点是否联通. 听说常规方法是在线LCT, ...
- CodeForces892E 可撤销并查集/最小生成树
http://codeforces.com/problemset/problem/892/E 题意:给出一个 n 个点 m 条边的无向图,每条边有边权,共 Q 次询问,每次给出 ki 条边,问这些边 ...
- BZOJ4358: permu(带撤销并查集 不删除莫队)
题意 题目链接 Sol 感觉自己已经老的爬不动了.. 想了一会儿,大概用个不删除莫队+带撤销并查集就能搞了吧,\(n \sqrt{n} logn\)应该卡的过去 不过不删除莫队咋写来着?....跑去学 ...
- 【离线 撤销并查集 线段树分治】bzoj1018: [SHOI2008]堵塞的交通traffic
本题可化成更一般的问题:离线动态图询问连通性 当然可以利用它的特殊性质,采用在线线段树维护一些标记的方法 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常 ...
- codeforces 892E(离散化+可撤销并查集)
题意 给出一个n个点m条边的无向联通图(n,m<=5e5),有q(q<=5e5)个询问 每个询问询问一个边集{Ei},回答这些边能否在同一个最小生成树中 分析 要知道一个性质,就是权值不同 ...
- 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)
题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...
- 【BZOJ4025】二分图(可撤销并查集+线段树分治)
题目: BZOJ4025 分析: 定理:一个图是二分图的充要条件是不存在奇环. 先考虑一个弱化的问题:保证所有边出现的时间段不会交叉,只会包含或相离. 还是不会?再考虑一个更弱化的问题:边只会出现不会 ...
- 算法笔记--可撤销并查集 && 可持久化并查集
可撤销并查集模板: struct UFS { stack<pair<int*, int>> stk; int fa[N], rnk[N]; inline void init(i ...
随机推荐
- dd命令创建文件
dd if=... of=... bs=... count=... if表示输入文件,of表示输出文件,bs默认指定了以字节为单位的块大小(单位有字节c,字w,块B,千字节m,兆字节m,吉字节G),c ...
- 记录一个错误: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 ...
- 【Azure App Service】Local Git App Service的仓库代码遇见卡住不Clone代码的问题
问题描述 启用App Service Local Git 部署,在Clone 代码库到本地时候,卡在Clone 'xxxxxx' ... ... 一动不动的问题? 问题解答 因为Git Clone没有 ...
- 【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,发现两则在 ...
- Jupyter Notebook 遇上 NebulaGraph,可视化探索图数据库
在之前的<手把手教你用 NebulaGraph AI 全家桶跑图算法>中,除了介绍了 ngai 这个小工具之外,还提到了一件事有了 Jupyter Notebook 插件: https:/ ...
- PHP项目&TP框架&SQL&XSS&架构&路由&调试&写法
开发基础-TP框架-入口&调试&路由&写法等 参考手册-TP5开发手册-为了掌握了解框架 首页文件看APP_PATH定义-为了后期分析核心代码 全局搜索:THINK_VERSI ...
- [Linux] 无显示器 无键盘 网线直连传输文件
有显示器可以操作 这种情况下要简单的多,基本思想是,网线直连之后让其中一方当作网关,分配好ip地址,比如说192.168.8.1,网关也是192.168.8.1即可,如果要填写子网掩码就写255.25 ...
- Java 异常处理(2) : 异常处理的方式二:throws + 异常类型
1 package com.bytezero.throwable; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 impor ...
- 2023 Gartner RPA魔力象限报告解读:国产厂商“破纪录”跃升意味着什么?
2023 Gartner RPA魔力象限报告解读:象限跃升彰显国产RPA厂商实力 2023 Gartner RPA魔力象限报告四大行业趋势,国产RPA厂商已在践行 文/王吉伟 8月3日,全球著名咨询调 ...
- 速存,详细罗列香橙派AIpro外设接口样例大全(附源码)
本文分享自华为云社区<香橙派AIpro外设接口样例大全(附源码)>,作者:昇腾CANN. Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能 AI 开发板,其搭载了昇 ...