[复习]分块/莫队
首先广为人知的莫队复杂度证明:网上题解证明的大部分有bug,这里改进一下
总询问为, 总大小为
莫队复杂度证明:设块长为,则共有个块
首先考虑块内移动:
单个块考虑
右指针:单调递增,
左指针:每个询问最多移动块长,设第块询问个数为即 ,
总复杂度:
右
左 = =
=
然后考虑块间移动:
左:
右:
总复杂度 =
算法总复杂度
=
对勾函数,当 = 时候,总复杂度为
接下来是待修改莫队
设块长为,共有个块
分开考虑每个指针的移动
时间指针:每个右端点块会最多移动次,每个左端点块有B个右端点块,所以共有个右端点块了,
左右指针与刚才的分析一致
所以是
根据ouuan dalao的博客, S取值为这个时函数有最小值
然后当与同阶时候小值,为
注意点:
1.求块长时候让
2.求bel数组时候
3.分块求L数组与R数组时候 要把最后一个块的R赋值成n
4.注意运算顺序,不要用这样的操作,可能先算++i再调用构造函数,也可能先用构造函数再用++i, 所以用逗号表达式一劳永逸++i, a[i] = node(i, a, b)即可
5.注意原始信息和维护信息的区别,比如sort块内的时候不要干扰原始信息
莫队常用技巧:
奇偶性排序:
排序函数里面这么写
if(pos[a.l] != pos[b.l]) pos[a.l]<pos[b.l]
else return pos[a.l]&1?a.r<b.r:a.r>b.r;
大概就是减少右端点移动
回滚莫队:
给出一个长度为n的排列P(P1,P2,...Pn),以及m个询问。每次询问某个区间[l,r]中,最长的值域 连续段长度。
从上到下一次
做法一:权值线段树+普通莫队,但是复杂度过大,是的
做法二(我的做法):权值并查集,求把连续段整成siz,复杂度
做法三:题解做法,求出值域上向左向右延伸的最大长度
参考资料:
作者:cdsidi
出处:https://www.cnblogs.com/cdsidi/p/15868671.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】