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 ...
随机推荐
- python的协程和_IO操作
协程Coroutine: 协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行. 注意,在一个子程序中中断,去执行其他子程序,不是函数调用,有点 ...
- 6.2-SingletonBeanRegistry-DefaultSingletonBeanRegistry
SingletonBeanRegistry package org.springframework.beans.factory.config; public interface SingletonBe ...
- struts自定义拦截器实现
示例 添加新功能:只有是登录的状态访问hello_loginSuccess才会显示登录成功. index.jsp登录成功页面 test.jsp登录页面 一.修改原代码实现 1.登录后将登录信息添加到S ...
- GTK+重拾--07 GTK+中的事件
(一):写在前面 在这一个小节中,我们主要是学习GTK+2.0中最重要的部分.就是信号和事件.GTK+函数工具库是基于"事件"系统的.全部的GUI应用都是基于"事件&qu ...
- openstack 官方镜像qcow2 下载和修改密码
下载地址: CentOS6:http://cloud.centos.org/centos/6/images/ CentOS7:http://cloud.centos.org/centos/7/imag ...
- linux基础part4
linux基础 一.系统监控命令 1.top命令: a.如图显示使用top命令查看系统的当前运行的情况.如图对top命令执行的结果做了简单的图解,下面针对每一项做详细的解释. b.第一行显示的内容依次 ...
- xpath取最后一个元素
取xpath最后一个book元素 book[last()] 取xpath最后第二个book元素 book[last()-1]
- Java编程思想(第4版) 中文清晰PDF完整版
Java编程思想(第4版) 中文清晰PDF完整版 [日期:2014-08-11] 来源:Linux社区 作者:Linux [字体:大 中 小] <Java编程思想>这本书赢得了全 ...
- DEV开发之界面皮肤
最终效果:正文本人的环境是 VS2013+DEV 13.21.第一步,新建项目,(忽略)???2.修改Form1.cs的基类,Form修改为DevExpress.XtraBars.Ribbon.Rib ...
- Ansible playbook练习
示例1:创建用户的Playbook --- - name: create user hosts: openstack gather_facts: false tasks: - name: create ...