线段树分治总结

本文介绍线段树分治算法的应用场景与实现方法,包括处理时间区间操作、线段树上的区间更新与查询等问题。并通过多个实例讲解如何将线段树分治应用于不同类型的编程竞赛题目。
  • 有一些操作,每个操作只在 l∼r 的时间段内有效。
  • 有一些询问,每个询问某一个时间点所有操作的贡献。

对于这类问题,我们通过对时间建立线段树来解决。

对于每个操作,相当于在线段树上进行区间操作。

遍历整颗线段树,到达每个节点时执行相应的操作,然后继续向下递归,到达叶子节点时统计贡献,回溯时撤销操作即可。

P5787 二分图 /【模板】线段树分治

       

        是二分图和没有没有奇环是充要条件,所以可以用可撤销并查集(就是用一个栈把修改的操作记下来,然后再反着撤销一下就行了)来维护,每次连接u-v,我们把u和v+n合并,v和u+n合并,这样就可以通过判断a和b是否在同一集合内,来判断他们是不是在一个奇环。剩下的就是正常的线段树分治了。  代码

[CTSC2016]时空旅行 

题意:你要维护若干个集合,每个集合都是有一个编号比他小的集合扩展而来,扩展内容为加入一个新的元素(x,c)或者删除一个已有元素。集合的扩展关系之间构成一个树形结构。有m次询问,每次给出一个X,询问第s个集合中(x-X)^2+c的最小值。

分析:我们建出树形结构后,发现每个集合中的元素出现的位置是dfs序上连续的区间(第一次出现的子树扣掉删除它的子树),我们可以把这个作为时间,来计算贡献。

        代码

[FJOI2015]火星商店问题 

        这道题目需要对时间和空间两个维度处理,首先看到了异或最大,想到了用01trie,又因为有区间l-r的范围,需要可持久化trie。因为有时间d的限制,我们需要用线段树分治来处理,考虑一个商品影响到的时间跨度为放入到最后,我们把询问插入线段树,按照线段树的分治思想计算每个部分的答案,并最终贡献到询问中。 代码

CF938G Shortest Path Queries 

        这题需要用到线性基+可持久化并查集+线段树分治  待补

CF576E Painting Edges 

        是线段树分治模板的拓展,需要有k种颜色,还要考虑一个操作可能没有被进行  待补

其他习题

[HAOI2017]八纵八横

[SHOI2014]神奇化合物

[APIO2018]New Home 新家

[CF678F]Lena and Queries

[bzoj4311]向量

[bzoj4184]shallot

最后给出一种模板(其实

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值