P9596 冒泡排序 2 题解

题目链接

Statement

\(f(A)\) 为序列 \(A\) 的冒泡排序趟数,操作:单点改,全局查 \(f(A)\). \(n,m\le 5\cdot 10^5\),值域 1e9.

Solution

结论:

\[ Ans=\max_{i\in [1..n]}\left\{ \sum_{j \in [1..i]}[A_j>A_i] \right\} \]

怎么观察出来啊 QAQ

证明:对于每个位置 \(p\),观察到每趟都会恰好把他前面一个大于他的数搬到他后面去。相等的数的相对位置关系是不变的。此时发生了一次 swap(a[i], a[i + 1]).

不动脑的维护是树套树。观察到只问 max,而这样的位置 \(p\) 一定不会成为答案:他后面有比他小的数 \(q\),这样 \(q\) 的答案一定比 \(p\) 的大。于是我们只需要让“后面没有数比他小”的位置的维护值是正确的,其他位置的维护值不比答案大就行了。

一种合法的设计是:对每个 \(i\) 维护 \(i-\sum_{j\in [1..n]}[A_j<A_i]\),其中若两个数相同约定前面的小于后面的。这样就容易维护了,\(O(n\log n)\).

posted @ 2024-08-05 20:24  Laijinyi  阅读(1)  评论(0编辑  收藏  举报