Ztxz16学图论

题目描述

众所周知,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>
#include<cstring>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值