逆序数的求法-csdn博客
逆序数的求法-csdn博客
首先介绍一下逆序数。对于一个序列,它的逆序数就是指这个序列的其中两个数前后位置和大小顺序相反。例如序列14532,其中5、 3是一对逆序数,5、 2也是一对逆序数。等等
解法
1. n^2复杂度的暴力
直接暴力枚举即可
```c++
int s[inf],sum=0;
for(int i=0;i<n;i++)for(int j=i+1;j<n;j++)if(s[i]>s[j])sum++;
```
2. 树状数组( nlog(n) )
树状数组是先确定每个值在所有序有序情况下的序列中所在的位置(离散化)。
列如序列:5 1 4 3 。
离散化后的值为:4 1 3 2。
从最左端开始建立树状数组,每创建一个就执行一次 i - query( x ) (x 为离散化的 值) 类加到ans上。最后的 ans即为所求的答案。
离散化的实质就是把所有的数都变成从1到n-1的连续的数。
思想实质:其实就是没针对当下一个序列最后的位置n,维护一个树状数组,这个数组记录值值的个数,然后求出这个序列最后一个数的前面有几个数和这个数组成逆序数,然后一次递推。由于可能每个数出现的次数可能不止一次,或者不连续,此时用离散化预处一下。( 初学者可以从连续的无重复的序列理清一下思路 )
#include <iostream>
#include <algorithm>
using namespace std;
const int inf = 1e5;
struct node
{
int val,i;
bool operator<(node x)const {return val<x.val;
}
}sn[inf];
int tree[inf],b[inf],n;
void add(int i,int x)
{
while(i<=n){tree[i]+=x;i+=i&-i;
}
}
int query(int i)
{
int sum=0;
while(i>=1)
{ sum+=tree[i];i-=i&-i;
}
return sum;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{cin>>sn[i].val;sn[i].i=i;
}
sort(sn+1,sn+n+1);
int cnt=1;
for(int i=1;i<=n;i++)
{ if(i>1&&sn[i].val>sn[i-1].val)cnt++;b[sn[i].i]=cnt;
}
int ans=0;
for(int i=1;i<=n;i++)
{add(b[i],1);ans+=i-query(b[i]);
}
cout<<ans<<endl;
return 0;
}
3. 归并排序法( nlog(n) )
这种方法是利用了归并排序的过程,在排序中进行计数。
#include<iostream>
#define endl '\n'
using namespace std;
const int inf = 1e5;
int sn[inf],sum;
int temp[inf];
void Merge_sqrt(int l,int m,int r)
{int h=l,g=m+1,f=l;while(h<=m&&g<=r){if(sn[h]<=sn[g]){temp[f++]=sn[h++];}else{temp[f++]=sn[g++];sum+=m+1-h;}}while(h<=m){temp[f++]=sn[h++];}while(g<=r)temp[f++]=sn[g++];for(int i=l;i<=r;i++)sn[i]=temp[i];
}
void Merge(int l,int r)
{if(l<r){int mid=(l+r)>>1;Merge(l,mid);Merge(mid+1,r);//cout<<l<<" "<<mid<<" "<<r<<endl;Merge_sqrt(l,mid,r);//cout<<sum<<endl;}
}int main()
{int n;cin>>n;for(int i=0;i<n;i++)cin>>sn[i];Merge(0,n-1);cout<<sum<<endl;return 0;
}欢迎大家的观看哈O(∩_∩)O哈哈~,如果有喜欢的可以关注一下^_^
逆序数的求法-csdn博客相关推荐
- taoqick 搜索自己CSDN博客
L1 L2正则化和优化器的weight_decay参数 kaiming初始化的推导 Pytorch动态计算图 Pytorch自动微分机制 PyTorch中在反向传播前为什么要手动将梯度清零? 通俗讲解 ...
- template标签_Django实战: 利用自定义模板标签实现仿CSDN博客月度归档
应网友慕之岩的请求,现提供下Django项目中如何使用自定义标签实现仿CSDN博客的月度归档(如下图所示).要求按月统计每个月发表的博文篇数, 跳过空白月份,最后结果按发布时间逆序排列.点击每个月份可 ...
- CSDN博客 论坛——读好书,畅想 我的IT成长路 活动【已完成】
不论你是刚刚进入IT行业的学子,还是涉猎广泛的技术骨干,或是肩负极富挑战工作的大牛.CIO,我们都有自己的成长故事和前进方向. 在近期开发者参与的CSDN调查活动中,37.89%的开发者表示自己会一直 ...
- CSDN博客论坛——读好书,畅想“我的IT成长路”活动【已完成】
不论你是刚刚进入IT行业的学子,还是涉猎广泛的技术骨干,或是肩负极富挑战工作的大牛.CIO,我们都有自己的成长故事和前进方向. 在近期开发者参与的CSDN调查活动中,37.89%的开发者表示自己会一直 ...
- CSDN博客运营团队2022年H2总结
前言 在2022年的年中,我们对外公布了我们的年中盘点:2022年上半年部分团队的总结 我们希望尽可能的公开我们的工作内容,让更多人可以了解CSDN的变化,同时也希望收到大家的真实反馈:你期待的新功能 ...
- 康托展开详解 -csdn博客
康托展开详解 -csdn博客 定义: 康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩. 康托展开的实质是计算当前排列在所有由小到大全排列中的名次,因此是可逆的. 原理介绍 **X ...
- 关于博客园与CSDN博客同步的说明
把博客园与CSDN比较,我认为博客园有技术内容优势,CSDN有行业资源优势,两者都比较重要.因此在两家网站同步发布博客. CSDN博客地址:http://blog.csdn.net/caoshiyin ...
- 2019年度CSDN博客之星TOP10榜单揭晓,你上榜了吗?
培根说,『读书造成充实的人,会议造成未能觉悟的人,写作造成正确的人』. 在短信短视频快速迭代的快时代,更深度的思考.更正确的实践,更成体系的写作与分享,尤显可贵.这里,每一篇博文都是开发者实战的经验解 ...
- CSDN博客的创建及使用
文章目录 一.创建CSDN博客详细流程 1. 注册 2. 绑定手机 二.编辑和发布博客 1. 设置markdown格式 2. 发布文章 3. 常见的markdown语法 3.1 分级标题 3.2 目录 ...
最新文章
- 20 种小技巧,玩转 Google Colab
- linux下各种颜色的文件表示的文件类型
- (转)自动化管理工具Saltstack之nginx部署
- 手机号 imsi tmsi_抓取网站访客手机号
- 进程间通信(一)管道
- 看清条款,小心网通陷阱
- 视不可当:信息图与可视化传播
- python背景图颜色_python – 使图形透明与彩色背景
- 万字长文讲解编码知识,看这文就够了!| 原力计划
- 设计模式之责任链模式(Chain of Responsibility )
- 【转】设计模式六大原则(1):单一职责原则
- dedecms手机站和PC站共用同一数据库的方法
- 《炬丰科技-半导体工艺》 光学镜片和玻璃部件的超声波清洗
- HP UNIX下载工具的一个好地方
- 计算机网络(一):网络层次划分及各层的网络协议
- 可以看计算机专业书籍的app,分享两个好用的读书APP
- 暴风电视刷鸿蒙,暴风电视蓝屏怎么解决
- vs2010调试c语言找不到exe文件夹,vs上调试和直接运行exe不同
- 前端-js网页特效(一)倒计时效果及原理
- 有关“iusb3mon.exe已停止工作”的解决方法与我解决这个问题的坑爹经历。