Ztxz16学图论

Ztxz16面临一道由算法之神Zjr506给出的图论题,涉及在N个点M条无向边的图中,处理Q个询问,每个询问涉及L到R的边,要求求解连通块数量。本文介绍了两种解决方案:一是使用LCT(线性链状组合树)维护最大生成树,二是应用莫队算法处理添边和删边操作。两种方法的时间复杂度分别为O(n log n)和O(n√n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

众所周知,Zjr506是算法之神,因此Ztxz16经常向他请教算法。这一天,Zjr506在教导了Ztxz16关于图论方面的一些算法后,给他出了一道图论题作为家庭作业:
给定N个点,M条无向边,Q个询问,每个询问给定L, R,问连上第L~R条边后,图中有多少联通块(询问之间互不影响)。
Ztxz16智商太低,百思不得其解,只好向你请教这个问题。

数据范围

N, M, Q <= 200000, L <= R

LCT

把编号为i的边的权值赋值为i。
我们把要连的边连上后做一遍最大生成树可以得到一个森林,答案就是树的个数。
假设当前要新添加一条边i,边i连接的点为x和y,如果x和y不在同一棵树里,那么直接连边,若在同一棵树里,我们可以找到x到y的路径中权值最小的边把它删去后再连边,这个可以用lct来维护。
那么我们可以处理出ans数组,ans[i]表述1~i的边都添加后的答案。
同时我们还要维护n棵主席树为权值线段树,一条边若对ans[i]有贡献,则在第i棵主席树的值为1。
那么对于一个询问l和r,则答案为ans[r]+第r棵主席树在区间1~l-1的权值和。
复杂度O(n log n)
(有点麻烦啊,至少3Kb)

莫队

如果只有添边,是很容易做的,朴素的莫队。
然而有删边的操作,那我们可以考虑每次把l指针还原到l所在块的块末,那么下次只会有添加操作(r指针本身就是递增的了)。l到一个新的块的时候再重构一下。
还原并查集要打标记(具体见代码)
复杂度O(n√n)(时限开了3秒,而且实际跑的跟lct差不多,因为lct常数大)
(没那么麻烦,不到2Kb)

代码

#include<cstdio>
<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值