Local Deletions

好题,做的时候想到了对于一个询问,最多只会经历O(logn)次修改,在看了hint3之后也想到了转换考虑对象,即明白每一步操作只会在端点处发生变化

但是想到上面是不足以做这道题目的,来解释一下官方做法

官方做法最重要的想法就是先处理[1,n],然后记录下每一层剩余的数组。这个其实也是离线处理。我们看到了不带修改的询问,可以想离线处理,但是我们以前都是离线处理询问,这里转换考虑对象,先离线处理序列,然后依次考虑询问,这种新思想可以记住

这段话什么意思?

举个例子,比如说当前询问问的是[l,r],那么x就是[l+1,r1]a,b分别是原序列的第l,r项,所以我们求的是f(y);那为什么原文要用“some layer”和a,b来表示,不直接说“the first layer”和"the l-th and r-th layer of the original sequence"呢?由下文,我们可以转换为子问题从而解决,所以要用“some layer”和a,b来表示

对于这一段

用"on the whole permutation"的表述当然是没错的,但是为了与理解相符合,我们理解成当前层,也就是前文所提到的"some layer";然后后面说的那个什么z就不用管了,最关键的是ax的左端点至少有一个会被删除(其实这个也挺关键的,我想到这个还是花了一些时间。具体来说就是转换对象,我最开始一直考虑每次操作后剩下的数,考虑对象为操作,而后面我考虑每个数在操作后是否会剩下,你就会发现这些数是否删除只与其邻居有关,所以根本不用关注整个数列,然后就可以发现这个结论了),这样就可以O(1)维护,并且形成子问题了

posted @   最爱丁珰  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示