序列
我们先想最暴力的解法,就是一个一个修改并且保存每一个历史时刻各个位置的值,然后询问的时候查询历史时刻的这个位置
如果我们把每一个历史时刻的序列都并列写上,就会像这个样子
其中这个坐标系的每一个点代表序列中某个位置在某个时间的真实的值
然后我们就会发现修改操作变成了一个矩阵,查询操作是一条线段(实际上也是一个矩阵)
其中绿色的是查询,橙色的修改,某个位置在某个时间点的真实值就是原来的值加上所有橙色矩阵对其的影响
那么这种多个矩阵修改叠加影响的一定要想到扫描线!
对于一个修改操作,我们在二维平面上
对于一个查询操作,我们在二维平面上
这个时刻我们就要想到动态查询第
但是注意一个细节,暴力统计的时候一定要整个块都遍历,因为此时已经排了序了,块内的点可能不满足二维偏序了
还有动态查询小于
来解释一下这篇题解
题解的思路就是,我们对于要查询的区间
一个很自然的想法是记cnt[i][j]
表示前cnt[belong[r]-1][p]-cnt[belong[l]][p]
加起来就好了
但是这样无疑是会超时的,于是我们使用两个分块,一个分块仍然维护原来的序列,另一个分块维护值域序列
具体来说,我们设cnt1[i][j]
表示原来的序列的前cnt2[i][j]
表示原来序列的前
查询的时候,我们考虑当前查询的数cnt1
数组进行统计,然后对于值域序列中在cnt2
暴力统计,易知两种统计方法的时间复杂度都是
然后是更新这个代码,题解里面的更新思路是将前缀和先变成原序列(也就是做差分),然后再进行单点更新,然后再做前缀和;其实没必要,按照一般思路更新就好了,具体见hydroOJ提交的代码的更新函数
当然这道题目完全可以用动态查询第
update 2024.7.30
如果这道题目要用动态查询第
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构