Local Deletions

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

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

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

这段话什么意思?

举个例子,比如说当前询问问的是\([l,r]\),那么\(x\)就是\([l+1,r-1]\)\(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\)就不用管了,最关键的是\(a\)\(x\)的左端点至少有一个会被删除(其实这个也挺关键的,我想到这个还是花了一些时间。具体来说就是转换对象,我最开始一直考虑每次操作后剩下的数,考虑对象为操作,而后面我考虑每个数在操作后是否会剩下,你就会发现这些数是否删除只与其邻居有关,所以根本不用关注整个数列,然后就可以发现这个结论了),这样就可以\(O(1)\)维护,并且形成子问题了

posted @ 2024-07-19 11:05  最爱丁珰  阅读(2)  评论(0编辑  收藏  举报