势能线段树(均摊分析)

势能线段树

线段树能够通过打懒标记实现区间修改的条件有两个:

  1. 能够快速处理懒标记对区间询问结果的影响
  2. 能够快速实现懒标记的合并

但有的区间修改不满足上面两个条件(如区间整除/开方/取模等)。
但某些修改存在一些奇妙的性质,使得序列每个元素被修改的次数有一个上限

所以可以在线段树每个节点上记录一个值,表示对应区间内是否每个元素都达到修改次数上限。区间修改时暴力递归到叶子节点,如果途中遇到一个节点,这个节点的对应区间内每个元素都达到修改次数上限则在这个节点 r e t u r n return return掉。

可以证明复杂度为 O ( ( n + m log ⁡ n ) × l i m ) O((n+m\log n)\times lim) O((n+mlogn)×lim),其中 n n n为序列长度, m m m为询问次数, l i m lim lim为修改次数上限。

LOJ6029——线段树区间除法

对于每个区间维护区间内的 最大值 M a x Max Max 和 最小值 M i n Min Min,对于整除操作,如果有 M a x − ⌊ M a x d ⌋ = M i n − ⌊ M i n d ⌋ Max-\lfloor\frac{Max}{d}\rfloor = Min − \lfloor\frac{Min}{d}\rfloor MaxdMax=MindMin,就转化为区间减。否则直接向下递归。

考虑何时满足 M a x − ⌊ M a x d ⌋ = M i n − ⌊ M i n d ⌋ Max-\lfloor\frac{Max}{d}\rfloor = Min − \lfloor\frac{Min}{d}\rfloor MaxdMax=MindMin
M a x = k 1 d + c 1 , M i n = k 2 d + c 2 ( c 1 , c 2 ∈ [ 0 , d − 1 ] , d ≥ 2 ) Max=k_1d+c_1,Min=k_2d+c_2(c_1,c_2\in[0,d-1],d\geq 2) Max=k1d+c1,Min=k2d+c2(c1,c2[0,d1],d2)
M a x − ⌊ M a x d ⌋ = M i n − ⌊ M i n d ⌋ Max-\lfloor\frac{Max}{d}\rfloor=Min-\lfloor\frac{Min}{d}\rfloor MaxdMax=MindMin
M a x − M i n = ⌊ M a x d ⌋ − ⌊ M i n d ⌋ Max-Min=\lfloor\frac{Max}{d}\rfloor-\lfloor\frac{Min}{d}\rfloor MaxMin=dMaxdMin
( k 1 − k 2 ) d + c 1 − c 2 = k 1 − k 2 (k_1-k_2)d+c_1-c_2=k_1-k_2 (k1k2)d+c1c2=k1k2
( k 1 − k 2 ) ( d − 1 ) = c 2 − c 1 (k_1-k_2)(d-1)=c_2-c_1 (k1k2)(d1)=c2c1
若 k 1 = k 2 , 则 c 2 = c 1 , 所 以 M a x = M i n 若k_1=k_2,则c_2=c_1,所以Max=Min k1=k2,c2

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值