/*===========================================================
wikioi
1688 求逆序对 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description
给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目.
数据范围:N<=105。Ai<=105。时间限制为1s。 输入描述 Input Description
第一行为n,表示序列长度,接下来的n行,第i+1行表示序列中的第i个数。
输出描述 Output Description
所有逆序对总数.
样例输入 Sample Input
4
3
2
3
2
样例输出 Sample Output
3 注解:
题目考察分治法。解决该题需要用到二路归并排序。
假如本题直接使用两重for循环来模拟,则最后肯定是会超时的。
模拟的Pascal代码如下:
ans:=0;
read(n);
for i:=1 to n do read(a[i]);
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]>a[j] then ans:=ans+1;
writeln(ans);
这个模拟算法是O(n^2)的算法,所以无法解决N<=10^5这样规模的问题。
其实从这个模拟的过程来看,终归是要把序列当中的所有数做两两比较。
联想到冒泡之类的排序也是要比较的。所以,随便找一个排序算法稍作修改,
应该就可以解决问题了。但是,冒泡、选择和直接插入排序都是O(n^2)算法。
这样的算法并未能提高程序的效率。相反,浪费脑细胞去修改算法。
排序算法里面的二路归并排序倒是不错的选择,因为它的时间复杂度是O(n*lg(n))。
=============================================================*/
 #include<stdio.h>

 int n,a[],t[];
long long ans=; void merge_sort(int A[],int l,int r,int T[])
{
if(l<r)
{
int m=l+((r-l)>>);
int x=l,y=m+,i=l;
merge_sort(A,l,m,T);
merge_sort(A,m+,r,T);
while(x<=m||y<=r)
{
if(y>r || (x<=m && A[x] <= A[y])) T[i++]=A[x++];
else {T[i++]=A[y++];ans+=(m-x+);}
}
for(i=l;i<=r;i++) A[i]=T[i];
}
} int main()
{ scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
merge_sort(a,,n,t);
printf("%lld\n",ans);
return ;
}

另一段代码:

 #include <stdio.h>

 int n,a[],t[];
long long count=; void merge_sort(int *a,int x,int y,int *t);//对a[]在[x,y) 下标范围的元素进行归并排序 int main(int argc, char *argv[])
{
scanf("%d",&n);
for(int i=;i<n;i++) scanf("%d",&a[i]);
merge_sort(a,,n,t);
printf("%lld\n",count);
return ;
}
void merge_sort(int *a,int x,int y,int *t)//对a[]在[x,y) 下标范围的元素进行归并排序
{
if(y-x>)
{
int m=x+(y-x)/;
int p=x,q=m,i=x;
merge_sort(a,x,m,t);
merge_sort(a,m,y,t);
while(p<m||q<y)
{
if( q>=y || (p<m&&a[p]<=a[q]) ) t[i++]=a[p++];
else { t[i++]=a[q++]; count=count+m-p; }
}
for(i=x;i<y;i++) a[i]=t[i];
}
}

注意:在统计逆序对数目的时候,不要重复统计。

wikioi 1688 求逆序对的更多相关文章

  1. AC日记——codevs 1688 求逆序对

    1688 求逆序对  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 给定一个序列a1,a2,…, ...

  2. Codevs 1688 求逆序对(权值线段树)

    1688 求逆序对  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 给定一个序列a1,a2,…, ...

  3. Codevs 1688 求逆序对

     时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我 ...

  4. codevs1688 求逆序对(权值线段树)

    1688 求逆序对  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 给定一个序列a1,a2,…, ...

  5. HDU 3743 Frosh Week(归并排序求逆序对)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3743 题目意思就是给你一个长为n的序列,让你求逆序对.我用的是归并排序来求的.归并排序有一个合并的过程 ...

  6. POJ2299Ultra-QuickSort(归并排序 + 树状数组求逆序对)

    树状数组求逆序对   转载http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html 转载: 树状数组,具体的说是 离散化+树 ...

  7. codevs1688 求逆序对

    题目描述 Description 给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目 数据范围:N<=105.Ai<=105. ...

  8. HDU 4911 http://acm.hdu.edu.cn/showproblem.php?pid=4911(线段树求逆序对)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911 解题报告: 给出一个长度为n的序列,然后给出一个k,要你求最多做k次相邻的数字交换后,逆序数最少 ...

  9. SGU 180 Inversions(离散化 + 线段树求逆序对)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=180 解题报告:一个裸的求逆序对的题,离散化+线段树,也可以用离散化+树状数组.因为 ...

随机推荐

  1. python数据分析入门——matplotlib的中文显示问题&最小二乘法

    正在学习<用python做科学计算>,在练习最小二乘法时遇到matplotlib无法显示中文的问题.查资料,感觉动态的加上几条语句是最好,这里贴上全部的代码. # -*- coding: ...

  2. Redirect HTTP to HTTPS on Tomcat

    I have bought my SSL secure certificate and successfully installed on Tomcat with the keytool but ho ...

  3. java作业6

    super用法: 1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位 代码如下: class Base { Base() { System.out.println(" ...

  4. 用Inno Setup来解决.NetFramework安装问题

    用Inno Setup来解决.NetFramework安装问题 2010-03-01 09:59:26 标签:.Net Framework Setup 休闲 Inno 原创作品,允许转载,转载时请务必 ...

  5. JS删除HTML元素问题

    <div id='one'> <div>1</div> <div>2</div> </div> <div id=" ...

  6. 八、CCMenu和CCMenuItem

    游戏中经常会提供一些菜单项让用户开始游戏.暂停\继续游戏.打开\关闭音乐或者是返回到上一个界面,比如下面两张图中用红色线框标记的菜单项     我们可以使用CCMenu和CCMenuItem实现上述的 ...

  7. Web 仪表盘

    /*********************************************************************** * Web 仪表盘 * 说明: * 之前很久,都想知道 ...

  8. Shell 条件表达式汇总

    条件表达式 文件表达式 if [ -f  file ]    如果文件存在if [ -d ...   ]    如果目录存在if [ -s file  ]    如果文件存在且非空 if [ -r f ...

  9. postgresql存储二进制大数据文件

    如果想把整个文件或图片存储在数据表的一个字段内,该字段可以选择二进制类型,然后将文件按二进制存储起来,文本文件也可以存在text字段内. 示例如下: 二进制类型bytea的操作(在最大值内,有内存限制 ...

  10. Qt之动画框架

    简述 Qt动画框架旨在为创建动画和平滑的GUI提供了一种简单的方法.通过Qt动画属性,该框架为部件和其它QObject对象的动画操作提供了非常大的自由性,框架也可以被用于图形视图框架中,动画框架中许多 ...