专栏文章

题解:P12865 [JOI Open 2025] 冒泡排序机 / Bubble Sort Machine

P12865题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@min9x4yg
此快照首次捕获于
2025/12/01 22:57
3 个月前
此快照最后确认于
2025/12/01 22:57
3 个月前
查看原文
众所周知,冒泡排序的过程是能维护的。
不妨假设 aia_i 互不相同,否则可以做微小扰动。
具体地,假设 pi=j<i[aj>ai]p_i=\sum_{j<i}[a_j>a_i],即 ii 前面的比他大的数的个数。那么前 pip_iaia_i 肯定是往前移(比它大的要超过他)。然后在后面的轮,aia_i 肯定一直是前缀最大值。
把询问变成两个前缀作差,我们把元素分成两类。一类是前缀最大值,一类是非前缀最大值。
对于非前缀最大值,处理是简单的。这些元素一直在减少,每次都在整体往前移动。用个树状数组就得了。
然后是前缀最大值元素。我们每轮冒泡排序都会加入新的前缀最大值。
假设当前前缀最大值的下标是 i1<i2<<iki_1<i_2<\dots<i_k。那么冒泡一轮之后就会变成:i21,i31,i41,,ni_2-1,i_3-1,i_4-1,\dots,n
也就是,前缀最大值下标(注意,我们不关心元素具体值)的变化过程大概就是每次向前整体移动 11,然后再加上 nn
由于前缀最大值元素是单调上升的,于是我们可以用线段树算出这个前缀有多少个前缀最大值元素(记为 kk),然后用值域线段树算出前 kk 小的前缀最大值元素的和即可。

评论

1 条评论,欢迎与作者交流。

正在加载评论...