| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 洛谷P6186 [NOI Online #1 提高组] 冒泡排序 题解 -> 正文阅读 |
|
[数据结构与算法]洛谷P6186 [NOI Online #1 提高组] 冒泡排序 题解 |
P6186 [NOI Online #1 提高组] 冒泡排序题目链接:P6186 [NOI Online #1 提高组] 冒泡排序
首先逆序对这个东西可以用树状数组搞定 题目给的是排列,因此求逆序对的伪代码如下
当然如果不是排列会稍微烦一点,可以看下我的这篇文章 设 f [ i ] f[i] f[i] 表示在 i i i 左侧比 i i i 大的数的个数,那么逆序对就是 ∑ i = 1 n f [ i ] \sum\limits_{i=1}^{n}{f[i]} i=1∑n?f[i] (注:这里的 f [ i ] f[i] f[i] 就是上面伪代码中的 qwq) 我们看看冒泡排序了 k k k 次以后会发生什么事 首先每次冒泡排序所有的 f [ i ] f[i] f[i] 都会减少 1 1 1 当且仅当 f [ i ] > 0 f[i]>0 f[i]>0 那么 k k k 次之后所有小于等于 k k k 的 f [ i ] f[i] f[i] 都会变成 0 0 0 因此我们只要每次就查询 [ k + 1 , n ] [k+1,n] [k+1,n] 中 f [ i ] f[i] f[i]? 的个数就是答案了 这个我们可以用两个树状数组来维护答案 再看看这个交换操作,可能会影响到其他的答案 那么怎么办呢?根据刚才我们发现的性质,我们可以先把它们两个的贡献减掉 1 1 1 ,然后按 a x a_x ax? 和 a x + 1 a_{x+1} ax+1? 的大小关系分别处理答案的变化,再把原先的贡献补回来就好了
代码如下
转载请说明出处 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 1:24:44- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |