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大力力 [026节] php开发状态要随时做好整理工作
php大力力 [026节] php开发状态要随时做好整理工作: 1.整理了开发目录,以及文件命名: 2.做了各个页面的快捷方式: 3.把浏览器safari的很多没来得及消化的页面链接,写入了我的在线 ...
- 【LeetCode OJ】Max Points on a Line
Problem: Given n points on a 2D plane, find the maximum number of points that lie on the same straig ...
- 关于linux python vim的一些基础知识(很零散)
清空文件夹filenmae下所有文件 rm filename/* vim复制大量代码段 num+yy 从光标起始处复制num个数行 然后 python: 设置中断 1.from IPython imp ...
- iOS-TCP/IP、Http、Socket的区别
网络由下往上分为 物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层, 三者从本质上来说没有可 ...
- Js全选,插入实现
//全选 function CheckAll() { ids.splice(0, 1000000); var flag = $("#All_Check").attr("c ...
- oracle注意事项
企业管理器system登陆时必须使用normal模式
- GitHub for Windows
/*************************************************************************** * GitHub for Windows * ...
- Java 内部类和匿名类 实现JButton动作 ActionListener类
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class ControlCircle2 extend ...
- ResponsiveSlides.js最轻量级的幻灯片插件
摘要:ResponsiveSlides.js是一个展示同一容器内图片的轻量级响应式jQuery幻灯片插件它支持包括IE6在内的几乎所有的浏览器,在IE6中还支持最大宽度属性,但在其它浏览器中并不原生支 ...
- 143. Reorder List
Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do thi ...