莫队二次离线

众所周知:

莫队是一个神仙的算法,它的复杂度为:O(nmf(n))。其中 f(n) 为左右端点移动一格的复杂度。

但是这并不能满足我们,我们发现当 f(n) 过大时就无法接受了。

这是就要引入神仙的数据结构:莫队二次离线,它可以将该复杂度优化至:O(nf(n)+nm)

设:一个元素 x 对一个区间 [l,r] 的贡献为:f(x,[l,r])

一个元素 x 对一个区间 [1,k] 的贡献为:f(x,k)

当一个元素 x 对一个区间 [l,r] 的贡献满足:f(x,[l,r])=f(x,r)f(x,l1)

我们就可以进行莫队二次离线。

h(l,r) 为一段区间的答案,g([l1,r1],[l2,r2]) 为区间 l1~r1l2~r2 的贡献。

当我们要跳转 h(l1,r1)h(l2,r2)

先考虑 h(l1,r1)h(l2,r1)

l1l1+1

有左端点向右移的贡献:

f(l1,[l1,r1])=f(l1,r1)+f(l1,l11)

等式右边的f(l1,l11)这东西可以预处理。

时间复杂度很容易分析:O(nf(n))

主要是考虑等式右边的f(l1,r1)

考虑将柿子完全写出来:

x=l1l21f(x,r1)+f(x,x1)

主要求:

x=l1l21f(x,r1)

我们可以记下关键词 l,r,id,p,i,分别代表求和符号的上界和下界,在第几次问题中改动,正负,右边的不动点。

此处,l=l1,r=l21,p=1,i=r1

l1l11

有左端点向左移的贡献:

f(l11,[l11,r1])=f(l11,r1)f(l11,l12)

等式右边的f(l11,l12)这东西可以预处理。

时间复杂度很容易分析:O(nf(n))

主要是考虑等式右边的f(l11,r1)

将柿子完全写出来:

x=l2l11f(x,r1)f(x,x1)

主要求:

x=l2l11f(x,r1)

此处,l=l2,r=l11,p=1,i=r1

再考虑 h(l2,r1)h(l2,r2)

r1r11

有右端点向左移的贡献:

f(r1,[l1,r1])=f(r1,r1)+f(r1,l11)

等式右边的f(r1,r1)这东西可以预处理。

时间复杂度很容易分析:O(nf(n))

主要是考虑等式右边的f(r1,l11)

将柿子写出来:

x=r2+1r1f(x,x)+f(x,l11)

主要求:

x=r2+1r1f(x,l11)

此处,l=r2+1,r=r1,p=1,i=l11

r1r1+1

有右端点向右移的贡献:

f(r1+1,[l1,r1+1])=f(r1+1,r1+1)+f(r1+1,l11)

等式右边的f(r1+1,r1+1)这东西可以预处理。

时间复杂度很容易分析:O(nf(n))

主要是考虑等式右边的f(r1+1,l11)

将柿子写出来:

x=r1+1r2f(x,x)f(x,l11)

主要求:

x=r1+1r2f(x,l11)

此处,l=r1+1,r=r2,p=1,i=l11

然后扫描线就可以将我们存的这些量修改即可。

复杂度变成了:O(nf(n)+nm)

以下给出模板题:

https://www.luogu.com.cn/problem/P4887

https://www.luogu.com.cn/paste/rs7cp0o5

以及练手题:

https://www.luogu.com.cn/problem/P5398

https://www.luogu.com.cn/paste/kg48scuw

 

posted @   Detect-Perplexity  阅读(631)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示