Time Limit: 10 second

Memory Limit: 2 MB

问题描述

给定一个序列a1,a2...an。如果存在i小于j 并且ai大于aj,那么我们称之为逆序对,求给定序列中逆序对的数目

Input

第一行为n,表示序列长度,接下来的n行,第i+1行表示序列中的第i个数。

Output

所有逆序对的总数

Sample Input

4
3
2
3
2

Sample Output

3

【题解】

在进行归并排序的同时求逆序对。

我们在进行归并排序时。

分成l..mid和mid+1..r

假设左边循环变量为i,右边的循环变量为j。

则当我们找到一个i和j满足a[i] > a[j]时。

因为左边,右边都是有序的,则a[i+1..mid]都大于a[j];

而之后我们会吧a[j]加入到temp数组中,此后a[j]不再出现。

则逆序对的数目增加mid-i+1;

然后逆序对数目用数据范围大的类型存储就好了。

【代码】

#include <cstdio>

int n,a[100009],temp[100009];
double tot = 0; void input_data()
{
scanf("%d",&n);
for (int i = 1;i <= n;i++)
scanf("%d",&a[i]);
} void mergesort(int l,int r) //对区间[l,r]进行分割
{
if (l == r) return; //只剩一个元素则认为其是有序的。
int mid = (l+r)/2; //获取中间的位置
mergesort(l,mid);mergesort(mid+1,r); //将这个位置的左边和右边进行不断切割。
int i = l,j = mid+1,k = l;
while (i <= mid && j <= r) //开始进行二路归并。
if (a[i] <= a[j]) //比较小的数放到temp数组中去
temp[k++] = a[i++];
else //在排序的同时顺便求逆序对
{
tot+=mid-i+1;
temp[k++] = a[j++];
}
while (i <= mid)
temp[k++] = a[i++];
while (j <= r) //剩下相同的数字也要放进temp数组
temp[k++] = a[j++];
for (int w = l;w<=r;w++) //最后再把temp数组赋值给原数组
a[w] = temp[w];
} void output_ans()
{
printf("%.0lf",tot);
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
input_data();
mergesort(1,n);
output_ans();
return 0;
}

最新文章

  1. 3-EM的安装和使用
  2. Linux CGroup之freezer分析与应用
  3. 查看修改Linux时区和时间
  4. Cocos2d-x 核心概念 - Node(节点)与Node层级架构
  5. 关于zero_interconnect_delay_mode和nonzero_interconnect_delay_mode的区别
  6. C++ 内存的分配方式 (摘选自网络)
  7. sharepoint 2013 持续爬网
  8. 矩阵的QR分解
  9. 【codevs2370】小机房的树 LCA 倍增
  10. .net Windows服务程序和安装程序制作图解 及 VS 2010创建、安装、调试 windows服务(windows service)
  11. Python学习之eventlet.greenpool
  12. EasyUI datagrid 改变url属性 实现动态加载数据
  13. UVALive - 4287 Proving Equivalences
  14. 解决python2.7.9以下版本requests访问https的问题
  15. win7下不能收到窗口hook消息的问题
  16. 选择排序java
  17. Spring的Bean,AOP以及工具类初探
  18. E. Superhero Battle Codeforces Round #547 (Div. 3) 思维题
  19. Spark本地运行成功,集群运行空指针异。
  20. UILabel部分文字可点击

热门文章

  1. 当鼠标聚焦时输入框变色(focus事件实例)
  2. 原生js大总结六
  3. 【hdu 6000】Wash
  4. Jenkins学习总结(1)——Jenkins详细安装与构建部署使用教程
  5. PatentTips - Adaptive algorithm for selecting a virtualization algorithm in virtual machine environments
  6. Android EditText回车不换行
  7. 安装hadoop2.6.0伪分布式环境 分类: A1_HADOOP 2015-04-27 18:59 409人阅读 评论(0) 收藏
  8. python画最最简单的折线图
  9. 【Codeforces Round #185 (Div. 2) A】 Whose sentence is it?
  10. php面试题四