wikioi 1688 求逆序对
/*===========================================================
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 求逆序对的更多相关文章
- AC日记——codevs 1688 求逆序对
1688 求逆序对 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 给定一个序列a1,a2,…, ...
- Codevs 1688 求逆序对(权值线段树)
1688 求逆序对 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 给定一个序列a1,a2,…, ...
- Codevs 1688 求逆序对
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我 ...
- codevs1688 求逆序对(权值线段树)
1688 求逆序对 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 给定一个序列a1,a2,…, ...
- HDU 3743 Frosh Week(归并排序求逆序对)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3743 题目意思就是给你一个长为n的序列,让你求逆序对.我用的是归并排序来求的.归并排序有一个合并的过程 ...
- POJ2299Ultra-QuickSort(归并排序 + 树状数组求逆序对)
树状数组求逆序对 转载http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html 转载: 树状数组,具体的说是 离散化+树 ...
- codevs1688 求逆序对
题目描述 Description 给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目 数据范围:N<=105.Ai<=105. ...
- HDU 4911 http://acm.hdu.edu.cn/showproblem.php?pid=4911(线段树求逆序对)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911 解题报告: 给出一个长度为n的序列,然后给出一个k,要你求最多做k次相邻的数字交换后,逆序数最少 ...
- SGU 180 Inversions(离散化 + 线段树求逆序对)
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=180 解题报告:一个裸的求逆序对的题,离散化+线段树,也可以用离散化+树状数组.因为 ...
随机推荐
- 数据结构《14》----并查集 Union-Find
描述: 并查集是一种描述解决等价关系.能够方便地描述不相交的多个集合. 支持如下操作 1. 建立包含元素 x 的集合 MakeSet(x) 2. 查找给定元素所在的集合 Find(x), 返回 ...
- yii2 利用小部件生成后台左边菜单栏
************ 模型层递归查询权限 ************ /** * 递归方式查询权限 */ public function getPrivilege() ...
- 重学STM32---(七) FSMC+LCD
关于FSMC+LCD第一次学习完时候,自己也还是对这个不清不白,时而清楚,时而糊涂.这一次再次学习的话,不能在这样了,仔仔细细把STM32参考手册,原子的LCD实验看了一遍,又在网上找了好些关于FSM ...
- PHP header() 函数详细说明(301、404等错误设置)
原文来自:http://www.veryhuo.com/a/view/41466.html 如果您刚刚开始学习PHP,可能有许多函数需要研究,今天我们就来学习一下PHP Header()的使用方法,更 ...
- wddm 部署问题解决
在把wddm部署到一台老的服务上的 windows server 2003 上时遇到了问题,之前也在 windows server 2003 上装过,但是并没有遇到问题,估计和服务器比较老有关系. 问 ...
- dedecms 列表页 list 判断flag给定指定样式 (本地测试有效)
{dede:list pagesize='10'} [field:array runphp='yes'] if (@me['flag']=='a') @me=' <a class="n ...
- postgresql copy命令介绍
COPY 命令可以快速的导入数据到postgresql数据库中,文件格式类似TXT.CVS之类.适合批量导入数据,速度比较快.注意COPY只能用于表,不能用于视图. COPY 命令里面的文件必须是由服 ...
- 对UICollectionView的学习
UICollectionView 和 UICollectionViewController 类是iOS6 新引进的API,用于展示集合视图,布局更加灵活,可实现多列布局,用法类似于UITableVie ...
- UI学习笔记---第一天
一.iOS概述 iOS是Apple公司的移动操作系统,主要⽤用于iPhone.iPad.iPad Mini.iPod Touch等移动产品. 借助iOS,我们可以开发视频类.美图类.新闻类.⾳乐类.团 ...
- Install Oracle Java JDK/JRE 7u55 on Fedora 20/19, CentOS/RHEL 6.5/5.10
What’s new in Sun/Oracle Java 7 VM Compressed 64-bit object pointers Garbage-First GC (G1) JSR 292: ...