[题目链接]

很经典的一道题,解法也很多,学会其它解法不断补充ing~

思路1:归并排序是将数列s[l,r]分成两半s[l,mid]和s[mid+1,r]分别进行归并排序,然后再将这两半合并起来。在合并的过程中(设l<=i<=mid,mid+1<=j<=r),当s[i]<=s[j]时,并不产生逆序数;当s[i]>s[j]时,在前半部分中比s[i]大的数都比s[j]大,将s[j]放在s[i]前面的话,逆序数要加上mid+1-i。因此,可以在归并排序中的合并过程中计算逆序数。
代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int Max_n=1e5+10;int n;
ll sum=0;
int s[Max_n],d[Max_n];void Merge(int l,int mid,int r){int i=l,j=mid+1,k=l;while(i<=mid&&j<=r){if(s[i]<=s[j])d[k++]=s[i++];else{d[k++]=s[j++];sum+=mid-i+1;}}while(i<=mid)d[k++]=s[i++];while(j<=r)d[k++]=s[j++];for(int i=l;i<=r;i++)s[i]=d[i];
}void MergeSort(int s,int t){if(s>=t)return;int mid=(s+t)>>1;MergeSort(s,mid);MergeSort(mid+1,t);Merge(s,mid,t);
}int main()
{scanf("%d",&n);for(int i=0;i<n;i++)scanf("%d",&s[i]);MergeSort(0,n-1); //归并排序求逆序对printf("%lld",sum);return 0;
}

思路2:树状数组,由于整数的元素很大,个数很少,可以先对元素进行离散化,得到离散后的素组c[],然后依次插入c[i],统计比它小的个数sum(c[i]),对应的逆序个数为i-sum(c[i])。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int Max_n=1e5+10;int n;
int c[Max_n],s[Max_n];
P p[Max_n];int lowbit(int k){return k&-k;
}
int sum(int k){int ans=0;while(k>0){ans+=c[k];k-=lowbit(k);}return ans;
}
void add(int k,int val){while(k<=n){c[k]+=val;k+=lowbit(k);}
}int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&p[i].first);p[i].second=i;}sort(p+1,p+n+1);for(int i=1;i<=n;i++) //离散化s[p[i].second]=i;ll ans=0;memset(c,0,sizeof(c));for(int i=1;i<=n;i++){add(s[i],1);ans+=i-sum(s[i]);}printf("%lld\n",ans);return 0;
}

51nod-1019 逆序数相关推荐

  1. 51nod 1019 逆序数

    如果直接暴力的话 n2一定会超时 考虑归并,分治的思想 // // main.cpp // wzazzy // // Created by apple on 2018/10/23. // Copyri ...

  2. 51Nod-1019 逆序数【逆序偶+归并排序】

    1019 逆序数  在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 如2 4 3 1中,2 1,4 3, ...

  3. 剑指 offer set 22 数组中的逆序数

    总结 1. 题目为归并排序的变形, 不过我完全没想到 2. 在归并排序进行字符组 merge 时, 统计逆序数. merge 后, 两个子数组是有序的了, 下次再 merge 的时候就能以 o(n) ...

  4. 二叉树:二叉搜索树实现 逆序数问题

    关于逆序数的问题描述如下: 已知数组nums,求新数组count,count[i]代表了在nums[i]右侧且比 nums[i]小的元素个数. 例如: nums = [5, 2, 6, 1], cou ...

  5. 递归/归并:count of smaller numbers求逆序数

    已知数组nums,求新数组count,count[i]代表了在nums[i]右侧且比 nums[i]小的元素个数. 例如: nums = [5, 2, 6, 1], count = [2, 1, 1, ...

  6. 求排列的逆序数(分治)

    考虑1,2,-,n (n <= 100000)的排列i1,i2,-,in,如果其中存在j,k,满足 j < k 且 ij > ik, 那么就称(ij,ik)是这个排列的一个逆序. 一 ...

  7. 算法笔记-归并算法面试题、逆序数问题

    1. 题目 逆序对问题:在一个数组中,左边的数如果比右边大,则这两个数构成一个逆序对,请打印所有逆序对 比如说: 数组: 5, 1, 3,4,2 第一个元素是5,其右边有小于5的数,即1,3,4,2, ...

  8. 树状数组 _ 求逆序数

    注: 本文只是记录  ,您将从上面学习不到任何知识,除了 代码 (废话)第一次接触到树状数组,感觉接触到了新世界,理解这个思想用了好长时间,终于弄明白了(似懂非懂). 还有接触到了  离散化的思想, ...

  9. [置顶] 归并排序,逆序数

    写了个模板类,指针 a为被排序,b为tmp 返回逆序数,调用时候Merge.sort(a,b,n); #define ll long long template<class T> clas ...

  10. 分治递归逆序数_[模板] 归并排序 逆序数 分治

    归并排序 图来自维基 递归调用的过程需要在脑中模拟清楚 然后是代码的细节问题 多复习多理解 刘汝佳版 #include using namespace std; const int MAXN = 1e ...

最新文章

  1. OpenCV4Android开发实录(2): 使用OpenCV3.4.1库实现人脸检测
  2. 寻找长沙“科技之星”,CSDN星城大巡礼
  3. 解决tomcat启动后访问页面中文乱码
  4. 追踪 Kubernetes 中的网络流量
  5. Python内置的字符串处理函数整理
  6. 面向开发者的机器学习(一)| 机器学习简介
  7. centos 6.5安装extundelete软件报错
  8. python requests text content_对python requests的content和text方法的区别详解
  9. ESPDUINO上传数据到oneNet云平台
  10. 加密货币如何改变着IT产业
  11. win10 自带wi-fi热点速度太慢怎么办_win10wifi热点速度极慢如何解决
  12. c语言scanf不用取地址符,关于c中printf和scanf函数是否使用取地址符的疑问
  13. 三维空间内任意三点坐标求圆心、半径
  14. u盘数据恢复的原理_U盘数据恢复工具 U盘常见故障及使用保养
  15. MySQL数据导入导出方法与工具介绍
  16. 迪普科技“高”在哪里?
  17. 通过webSocket实现app运动数据在网页实时显示
  18. php学习规划,2015年计划
  19. 苹果vs剪辑下载_秒简iPhone上的一款免费手机视频剪辑软件,支持导入视频或图片...
  20. java怎么调用另一个类的方法_在一个类中访问另一个类的方法

热门文章

  1. openLayers画椭圆
  2. 如何将两个微信小程序合并_微信小程序--如何在两个页面之间传值
  3. 诚之和:游戏租号黑产曝光!掌握上万身份信息,一小时最高收10元,涉案金额超百万元
  4. 在SPSS21中如何做散点图
  5. php 自动收货’_PHP实现电商订单自动确认收货redis队列
  6. python模拟百度搜索豆瓣电影
  7. vivo手机5个不为人知的功能,不会用手机白买了,不如换个小灵通
  8. 高德地图推出酒店比价,为爱牵线后能为盈利搭桥吗?
  9. 个人收藏的离线下载网站和动漫资源搜索网站备份
  10. 《先驱者》服务器修复,Steam一周大事件:先驱者服务器修复,1分钟掉线3次将成历史?...