[Ynoi2007] rgxsxrs
真,顶级毒瘤题目,浪费我至少一天。
首先不难想到对于修改,有一个暴力序列线段树做法:
-
如果当前区间的最大值
,那么直接返回,无法进行修改。 -
如果当前区间的最小值
,那么区间减,打上懒标记即可。 -
否则,就暴力修改左右儿子然后
。
显然,由于正常人都会造数据,使得每次修改都被无限细分到叶子节点,所以必然会被卡。
我们发现,这里的瓶颈在于我们不能确定到底该如何修改。
考虑对权值进行分块,每个块维护一颗序列线段树。
但是这里权值太大,就算分出来,也完全无法构造线段树。
所以考虑倍增分块(当然,这只是这样分块的其中一个原因)。
我们定义一个进制
修改的时候,对于块
-
,显然,这整个块根本就无法修改。 -
,这个稍微处理一下就好。显然这个块内所有下标在 以内的数都要修改,这个可以直接通过懒标记解决。但是考虑到你减了之后可能会改变你所在的块,所以我们对于那些整个区间减了之后都还在这个块内的打上懒标记,其余的就暴力修改,然后暴力变块。 -
,即有些修改有些不改。这个就同我们最开始的暴力线段树修改,不在阐述,注意减了之后变块的问题就行。
然后我们来考虑一下时间复杂度的问题。
首先是变块,由于我们精准的找到了要变的位置,加之还有插入线段树,所以变块只会产生
但是一些线段树内部递归消耗还值得我们去思考,由于作者暂时还没有搞得很清楚,所以先咕咕咕。
当然,这样还没有结束,你会发现你光荣
仔细思考可以发现,你线段树是4倍空间,原因是你分的太细了,要一直分到叶子节点。
那我不分这么细就行了嘛。
所以考虑另外一个技巧:底层分块。其实有点像阈值分治,就是如果你在线段树上递归到的当前区间长度小于一个阈值
当然,这样写的一个非常重要的细节是,你每次暴力进入区间计算时,记得把这个点的标记暴力传到这个区间上。
对于具体参数,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具