[NOI Online #1 提高组]冒泡排序 题解

思维题。需要弄清

  • 冒泡排序的本质
  • 每一轮冒泡排序对逆序对的影响

冒泡排序的本质是将一个数放到他的“后面第一个大于”之前,并把它俩之间的数向左平移一位。
这个数能够向右征服的充要条件是左边没有比它大的数。原因是,一旦有,他就成了被征服的,手无缚鸡之力。
因此,每一轮冒泡排序会使每一个数值上的逆序对 1(如果小于 0 了就再和 0 取 max)。原因是,一个数要么被征服,要么征服别人,被征服的,它左边就少了一个大于它的数,征服别人的,原来的逆序对数就是 0,不妨碍 -1 再取 max。
因此,第 k 轮冒泡排序结束后的总逆序对数就是

1in,bi>k(bik)

bk 是数值 k 上的逆序对数。
显然可以用值域树状数组维护。
修改和询问就显得很简单了,只需要在 c 上查询即可。
另外,代码实现方面,需要三个树状数组 c,c1,c2c 是最开始算逆序对的,c1,c2 分别用于记录 b 的值域上的【出现次数×b】和【出现次数】,意会一下。

posted @   pengyule  阅读(11)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示