历史 (并查集 按秩合并)

本文探讨了一种历史查询问题的解决方案,利用并查集按秩合并优化数据结构。首先介绍了30%的暴力解法,然后通过LCT(线段树连接树)实现100%正确率的解法。接着提出离线处理询问的30%解法,并结合在线修改以达到100%正确率。最后,通过可持久化并查集与线段树的结合,提出了一种处理强制在线询问的高效策略,复杂度为O(nlog2n)。代码示例提供了第三种方法的实现。
摘要由CSDN通过智能技术生成

历史(history.c/cpp/pas)

8.28
思路:
做法一:【数据结构优化暴力】
30%做法:由于只需要知道连通性,我们可以维护森林。有一个比较好的暴力方法是,连边时在边上记录这条边连上的时刻,询问时求两点之间最迟的边即可知道这两个点连通的时刻,暴力复杂度O(nm),能拿到30%的分数。【这个思路很重要!】
100%做法:套上个LCT即可。但由于数据范围较大,可能需要优化常数,由于数据有梯度,具体分数根据代码的丑陋程度而定。

做法二:【利用题目性质离线】
30%做法:对于特殊的另外30%,可以离线。那么把询问按时间排序,再套个并查集即可,复杂度O(m),能拿到30%的分数。和一个大暴力组合就能拿到60%的分数。【由于不太方便表示,将并查集的复杂度看作常数】
100%做法:此题只有修改强制在线,而询问不强制在线,实际上仔细观察,就可以发现仍然可以离线来做。复杂度O(m),能拿到100%的分数。

做法三:【简洁且能够处理询问也强制在线的情况】
30%做法:暴力存下每次的并查集。复杂度O(nm)。
70%做法:熟悉数据结构的同学应该很容易想到这个做法。这道题显然可以用可持久化并查集维护,用按秩合并套上一个可持久化线段树维护fa数组。复杂度O(nlog2n),由于数据有梯度,这个做法本地测试时给了70%的分数。但是要是又遇到跑得十分快的评测机,那我也

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值