Loading

CF1764G3 Doremy's Perfect DS Class (Hard Version)

美难题,想出了 G2,没想到 G3 竟是这么做。。。

从头开始讲,这道题刚开始看是毫无想法的,考虑能带来有效信息的询问是什么,大部分情况感觉代理来的信息是很复杂的,我们无法处理。而我们发现如果令 \(k=n\),就能知道区间里有没有最大值,但这似乎并没有什么卵用。

最大值好找因为最大值有特殊性,那 \(1\) 有什么特殊性呢?我们查询时不妨令 \(k>1\),那么 \(1\) 的结果一定是零,但是还是没有什么卵用。

想了半天每个 \(k\) 和区间能带来的贡献,发现都很难以刻画。但是如果考虑 \(k=2\),我们发现 \(1\) 有一个性质,就是它除以 \(2\) 后结果唯一,而其它数都有与之匹配的数,当然 \(n\) 是偶数时 \(n\) 也唯一,但是我们不妨先考虑 \(n\) 是奇数。

我们考虑能否利用这个性质,查询 \([1,i]\)\([i+1,n]\) 并思考能否区分出 \(1\) 的位置。为什么这么想?因为这跟奇偶性有关,我们要想找到想到的东西就必须覆盖全部,此时我们不妨令 \(i=\lfloor\frac n 2\rfloor\),发现根据查询我们可以利用两边查出的值,做差算出两边内部分别有多少对匹配对,而 \(1\) 一定不在匹配对中,于是我们算出两边独立的数有多少,我们发现两边独立的数除了 \(1\) 都能互相匹配,也就是说 \(1\) 一定出现在独立的数更多的一侧。

此时我们将答案范围折半,有的入可能会像我一样犯唐,以为要递归进去,但是发现递归破坏了性质,甚至认为这个做法做不了。但是实际上,确定答案范围并不意味着我们要递归进去,并且考虑刚刚的判定不难发现对于任意的 \(i\) 都能够判出来。

\(n\) 为偶数情况则稍有不同。我们依然进行刚刚的操作,但是我们发现我们算出来的独立的数,可能左右相等,可能差为 \(2\)。显然情况如果是后者我们直接把范围锁到多的那一侧就好了,而遇到左右相等的情况我们考虑令 \(k=n\) 去 check 其中一边,这样就可以区分哪边是 \(1\) 哪边是 \(n\) 了,于是我们会了最劣 \(q=21\) 的做法。

考虑把一个询问干掉,显然最好的选择是到最后 \(r-l=1\) 的时候,想办法只 check 一次。这是一个经典的 trick,我们发现我们前面过程中查询了很多位置,我们尝试利用前面查到的位置去判断。具体的,我们发现对于最后区间 \([l,r]\),显然 \([l,n],[1,l-1],[1,r],[r+1,n]\) 都是被查询过的,我们尝试利用这些信息去判断位置。

在手玩的时候发现我们会受到 \([1,l-1],[r+1,n]\) 其中一边是否存在两个数中的除了 \(1\) 的另一个数的影响,我们发现我们直接考察 \([l,n]\)\([r+1,n]\) 的查询结果的差和 \([1,r],[1,l-1]\) 查询结果的差就可以判断这个数在哪一边了,然后只查一次即可查出。

还有点小细节,如果最后剩的是 \(n\) 判掉即可。

代码。

最后一个小问题,我的思路并没有从 Easy 到 Medium 的过程,因为我思路中并没有先把 \(n\) 找出来这一项,这无伤大雅。但是有的思路是很难优化的,比如说我同学的做法就只能做 G1,他也是利用了 \(1\) 没有匹配的元素,但是他利用性质的方式是考察 \(f(i)=Q(1,i,2)+Q(i+1,n,2)\) 的差分数组,对于相邻的 \(i\),我们发现如果当前位置不是 \(1\),则 \(f(i)\) 至少变化 \(1\),否则是 \(0\),直接二分找就行了。

这个想法很厉害,不过本质上其实差不太多,都是利用改变一下的奇偶性去找。但我认为更加常规正常的方式就是对于一个左右区间,发现 \(1\) 的特殊性,根据特殊性对两边信息的影响去二分缩小范围。

posted @ 2025-09-30 15:11  lalaouye  阅读(7)  评论(0)    收藏  举报