浅谈近期用到的segment tree beats technology
是势能线段树的全称,泛指这种在某些情况下打tag,在某些情况暴力子树,复杂度通过势能分析证明的线段树。
主要用途:区间取 , 区间开根号 , 区间除 取整 之类不易打tag处理的区间操作。
虽然以前会一点,但是根本没做啥题,记一些题在此篇。
考虑每个点有一个“最大影响范围” ,那么每次操作就是对 区间取 , 需要维护的东西是 , 及其区间和 ,发现每个点可以影响的是一个区间。
考虑如何维护 的同时处理这种影响。
对 维护一棵 ,每个节点上套路地维护 , 接下来就是考虑每次操作对后面的影响 。
有一个线段树上对应的区间被修改,且取 值介于 之间 ,则需要打标记,这意味着这些 间的值都变成了 所以实际上是 少被覆盖了 次 , 再在一棵 上减就行了。
复杂度因为 分成了均摊 个区间,每次区间加 ,所以是 的。
单点修改就是看改长了还是改短了,进行区间加/减即可。
时间复杂度 。
(目测)
在线有神仙 线段树做法,然而我太菜了,没有想到,但是题解区貌似没有找到离线单 做法 。
考虑没有修改,静态问题是从前往后,数一遍 的个,本质就是每次把目前的最小值和 取 , 取成功了就记一次数。
在线不好处理,考虑离线,观察在时间上不具有太多特征,唯一的优点在于“单点查”,而在序列上有许多特征:单调性,前缀影响。
再加上刚刚静态问题的方法。
于是考虑时空转置,做扫描线,把时间轴看作序列,每一次修改就是在对应位置(时间) , 对生效时间段(区间)进行取 ,询问前缀可以看作在位置对应时间单点查询时间对应的位置被取 的次数。
维护一棵区间取 ,查询被取 的次数 的 即可。
将标记换成二元组 表示区间最大值被取 成了 , 取了 次,正常下放即可。
时间复杂度 ,实际运行速度略快于 做法。
NowCoder7615D
题意:求排列的极长上升子序列的个数 , 。
首先有个较为显然的 。
在序列开头填 , 末尾填 。
1~i 中 i 结尾的极长上升子序列的个数 。
那么:
。
我没有考虑这个dp如何优化,其实只用在值域上建 + 就可以大力维护了。
另一种做法: 考虑他为啥是个排列,这个时候有一种套路就是把数从小到大地加进去,就可以少考虑有关值域的东西了。
于是我们按从小到大加入每个数,( 指逆排列 )。
每次新加入的数都是最大的,加入后前面已经加入的数都不能像后面转移了。
并且每个点自加入后可以转移的范围是单调不加的 , 且是一个区间中未加入的数。(只被取 )。
于是进行的操作就是对前面点 进行区间取 , 以及查询可以覆盖到这个点的权值和。
于是你就把一道差不多 的题转化成了 差不多 题啦。。。。
就像上面的第一题一样,用 套树状数组就可以解决了。
本文已经结束了。本文作者:ღꦿ࿐(DeepSea),转载请注明原文链接:https://www.cnblogs.com/Dreamerkk/p/17096222.html,谢谢你的阅读或转载!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2022-02-06 atcoder近期比赛记录