解题报告-论对“排序”的新理解
解题报告-论对“排序”的新理解
这样排序的问题,一般都是多次排序,然后查询一个位置。这也就意味着,这样的题一般有多样的特殊性质。
如果我们多次暴力排序,那么复杂度可以近似 \(O(nm\log n)\),肯定是不行的。这个时候,我们就要拿出针对这种题的 \(\texttt{Trick}\)——\(01\) 序列。
这道题就是一个例子。这个 \(\texttt{Trick}\) 不常用,但是却针对这种题十分有用。
上面说的”特殊性质“是什么意思?分析题目,发现查询的只是一个数,而且不是在线查询。就是说,我们全程只要关心的,只是 \(X\) 这个数而已。
既然我们只要关心的是 \(X\) 这个数,那么只有在区间排序与 \(X\) 相关的区间时,\(X\) 的位置才会改变。
如何维护这个过程?我们只需要把大于等于 \(X\) 的数看作 \(1\),小于 \(X\) 的数看作 \(0\),每次排序,\(1\) 丢一边,\(0\) 丢一边,用线段树维护,就把 \(O(n\log n)\) 的排序优化到了 \(O(\log n)\)。
至于 \(X\) 的位置,也很好求。\(X\) 一定是大于等于 \(X\) 的数中最小的那个,那么我们只需要找到 \(0\) 和 \(1\) 的分界点就行,更新 \(posX\)。
这个 \(\texttt{Trick}\) 已经被我淡忘,直到上一次某位巨神讲解某不知名模拟考试 \(\text{T}4\) 的时候才想起。今天看来,还是好巧妙。