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 解题报告:一个裸的求逆序对的题,离散化+线段树,也可以用离散化+树状数组.因为 ...
随机推荐
- php大力力 [028节] 如何下载js文件,网上一个*.js无法下载啊??????
php大力力 [028节] 如何下载js文件,网上一个*.js无法下载啊?????? safari也无法下载 迅雷也无法下载 是不是对方网站服务器的不让下载那个js目录的文件??? 只能调用js函数啊 ...
- kali 2016的基础配置
1.Kali 2016的更新源 deb http://http.kali.org/kali kali-rolling main contrib non-free 2.安装虚拟机 apt-get upd ...
- 【Oracle XE系列之四】创建OracleXE表空间详解
创建OracleXE表空间示例 sqlplus /nolog connect sys as sysdba SQL> create tablespace OPFOCN datafile 'C:\ ...
- Qt Charts示例
Qt 5.7 有一些变化,把原来商业版的几个模块用GPLv3协议放到了社区版本里: Qt Charts (GPLv3) Qt Data Visualization (GPLv3) Qt Virtual ...
- ASP.NET状态管理之四(暂存状态HttpContext.Items)
ASP.NET提供一个类System.Web.HttpContext ,用来表示上下文,此对象有一个属性Items 暂存状态就是利用HttpContext.Items属性来存放数据 MSDN中Http ...
- HDU 2291
http://acm.hdu.edu.cn/showproblem.php?pid=2291 读题读的烦死了,今天果真不适合做题 题意:给两个n*n的矩阵,第一个代表一个人战胜一个人可以得到的经验值, ...
- DATEADD(Day, DATEDIFF(Day,0,ShippingTime), 0)
select DATEADD(Day, DATEDIFF(Day,0,GETDATE()), 0),DATEDIFF(Day,0,GETDATE()),GETDATE() 结果: (无列名) (无列名 ...
- CSS 实现:两栏布局(一边固定,一边自适应)
☊[实现要求]:CSS实现左边固定,右边自适应父容器宽度的两栏布局. <body> <div class="left"></div> <d ...
- dede文章摘要字数的设置方法
本文转自:http://blog.csdn.net/yxwmzouzou/article/details/17491991 在织梦系统中(针对5.7版本),文章摘要(可以通过以下四种相关标签调用)被设 ...
- What books does Bjarne Stroustrup suggest to master C++?
QUESTION : What books does Bjarne Stroustrup suggest to master C++? ANSWER: A Tour of C++ is a quick ...