方方方的数据结构
总算给我看懂到底是什么意思了。。。
首先我们来考虑按照时间+扫描线进行处理,假设操作如下
黑色是加操作,黄色是乘操作,绿色是加操作,对于红色那条线所代表的点,随着时间的流逝,首先在刚刚进入黑色的时候,这一点的值就被加上了一个数,然后刚刚进入黄色的时候,这一点的值就被乘上了一个数,刚刚进入绿色的时候,这一点的值就被加上了一个数,所以总体顺序是加乘加,然而如果我们按照扫描线处理,顺序就会变成黑绿黄,就错了
所以这道题目的顺序是很重要的,这启示我们不能按照扫描线做,只能老老实实按照时间递增去做
假设没有撤销操作,那么这就是普通的线段树了
有了撤销操作肯定要做一些更改,而且还有时间这一维度,由于我们不能按照扫描线做,我们就对时间进行分块处理
接下来仍然先讨论没有撤销操作的做法
我们仍然值来看红色这个点,假设经过第一块之后,他的值为
遇到了加操作,变成了
根据以上过程我们不难发现,我们可以考虑每个加操作的贡献,一个加操作的贡献就是这个加的值与其后面所有乘操作的积,而最开始的值
于是我们可以对每一个块内都维护一个线段树,线段树的每一个叶子节点维护两个值,
然后我们再来考虑撤销操作。有了撤销操作,就是将一个无限长的矩形变成了一个有限长度的矩形,就像这样
也就是代表这个操作的有限区间
我们假设这个矩形上面的边所在的块的编号为
查询的时候,前面的块的部分利用线段树快速查询,块内部分暴力查询即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构