Poj 2299 Ultra-QuickSort(归并排序求逆序数)
一、题意
给定数组,求交换几次相邻元素能是数组有序。
二、题解
刚开始以为是水题,心想这不就是简单的冒泡排序么。但是毫无疑问地超时了,因为题目中n<500000,而冒泡排序总的平均时间复杂度为
,显然不满足要求。还有就是数组中的元素0
≤ a[i] ≤ 999,999,999,要用long long或_int64,在java中要用long。再一想用最快的快速排序,发现也不行。快排基于二分查找,交换次数很定要比题目要求的少。在想就是归并排序了,我们可以用归并排序求数组的逆序数。逆序数就等于冒泡排序的交换次数。
三、java代码
//Memory 9068K
//Time 2766MS
import java.util.Scanner; public class Main {
static int MAX =500010;
static int [] a=new int[MAX];
static int[] tb=new int[MAX/2];
static int [] te=new int[MAX/2];
static long sum;
private static void Merge(int[] a ,int beg,int mid,int end) {
int k;
int n1=mid-beg+1;
int n2=end-mid;
int i = 0, j = 0;
for(k=beg;k<=mid;k++){
tb[i++]=a[k];
}
tb[n1]=Integer.MAX_VALUE;
for(k=mid+1;k<=end;k++){
te[j++]=a[k];
}
te[n2]=Integer.MAX_VALUE;
i = j = 0; for(k=beg; k<=end; k++)
if( tb[i] <= te[j] )
a[k] = tb[i++];
else{
sum += ( n1 - i );
a[k] = te[j++];
}
} private static void MergeSort(int[] a,int beg,int end) {
if(beg<end){
int mid =(end+beg)/2;
MergeSort(a,beg,mid);
MergeSort(a,mid+1,end);
Merge(a,beg,mid,end);
}
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n,i;
while((n=sc.nextInt())!=0){
sum=0;
for(i=0;i<n;i++){
a[i]=sc.nextInt();
}
MergeSort(a,0,n-1);
System.out.println(sum);
}
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
Poj 2299 Ultra-QuickSort(归并排序求逆序数)的更多相关文章
- poj 2299 Ultra-QuickSort :归并排序求逆序数
点击打开链接 Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 34676 Accepted ...
- 题解报告:poj 2299 Ultra-QuickSort(BIT求逆序数)
Description In this problem, you have to analyze a particular sorting algorithm. The algorithm proce ...
- poj 2299 树状数组求逆序数+离散化
http://poj.org/problem?id=2299 最初做离散化的时候没太确定可是写完发现对的---由于后缀数组学的时候,,这样的思维习惯了吧 1.初始化as[i]=i:对as数组依照num ...
- POJ 2299 -Ultra-QuickSort-树状数组求逆序数
POJ 2299Ultra-QuickSort 使用树状数组记录逆序对数. 把数组按照大小顺序插入,getsum(i)就是i前面的比他大的数. #include <cstdio> #inc ...
- poj 2299 Ultra-QuickSort 归并排序求逆序数对
题目链接: http://poj.org/problem?id=2299 题目描述: 给一个有n(n<=500000)个数的杂乱序列,问:如果用冒泡排序,把这n个数排成升序,需要交换几次? 解题 ...
- [CF 351B]Jeff and Furik[归并排序求逆序数]
题意: 两人游戏, J先走. 给出一个1~n的排列, J选择一对相邻数[题意!!~囧], 交换. F接着走, 扔一硬币, 若正面朝上, 随机选择一对降序排列的相邻数, 交换. 若反面朝上, 随机选择一 ...
- POJ2299 Ultra-QuickSort(归并排序求逆序数)
归并排序求逆序数 Time Limit:7000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Descri ...
- HDU 3743 Frosh Week(归并排序求逆序数)
归并排序求逆序数 #include <iostream> #include <cstdio> using namespace std; #define maxn 1000005 ...
- hiho一下 第三十九周 归并排序求逆序数
题目链接:http://hihocoder.com/contest/hiho39/problem/1 ,归并排序求逆序数. 其实这道题也是可以用树状数组来做的,不过数据都比较大,所以要离散化预处理一下 ...
- poj 2299 Ultra-QuickSort (归并排序 求逆序数)
题目:http://poj.org/problem?id=2299 这个题目实际就是求逆序数,注意 long long 上白书上的模板 #include <iostream> #inclu ...
随机推荐
- restful规范和restframework框架
什么是接口? 接口可以理解为url就是接口. 那么在其他语言里面接口也可以是约束类 restful规范是什么? RESTful是目前最流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便 ...
- VLFeat图像库在VS2012下的配置
近期做课题所需,開始使用VLFeat图像库. 库下载链接: http://download.csdn.net/detail/sunboyiris/7500097 ...
- FlashFXP上传下载
正常情况我们的生产环境我们本地是不能直接访问的,因为网段不通,且生产环境不允许我们随便访问,但是对于我们自运维的集群我们有时候需要上去做一些操作,通过堡垒机跳转到生产机器上即可,但是我们不能通过xsh ...
- Spring笔记:IOC基础
Spring笔记:IOC基础 引入IOC 在Java基础中,我们往往使用常见关键字来完成服务对象的创建.举个例子我们有很多U盘,有金士顿的(KingstonUSBDisk)的.闪迪的(SanUSBDi ...
- Data Structure Binary Tree: Print ancestors of a given binary tree node without recursion
http://www.geeksforgeeks.org/print-ancestors-of-a-given-binary-tree-node-without-recursion/ #include ...
- shiro4----shiro3代码
AuthenticationTest.java package cn.itcast.shiro.authentication; import org.apache.shiro.SecurityUtil ...
- Google员工自述:在哈佛教书和在Google工作的差别
感谢伯乐在线的投递编者按:2003年到2010年期间,原文作者Matt Welsh 是哈佛大学工程和应用科学学院的计算机科学系教授.2010年加入Google,是一名高级工程师.他当前的工作重点是广域 ...
- PostgreSQL基本操作
列出当前数据库所有表 \dt 列出表名 SELECT tablename FROM pg_tables; WHERE tablename NOT LIKE 'pg%' AND tablename NO ...
- Zookeeper简单配置
1.配置zookeeper 解压tar包后,在conf目录下,有一个zoo_sample.cfg,拷贝一份并命名为zoo.cfg cp zoo_sample.cfg zoo.cfg 编辑修改数据路径, ...
- 投影矩阵、最小二乘法和SVD分解
投影矩阵广泛地应用在数学相关学科的各种证明中,但是由于其概念比较抽象,所以比较难理解.这篇文章主要从最小二乘法的推导导出投影矩阵,并且应用SVD分解,写出常用的几种投影矩阵的形式. 问题的提出 已知有 ...