题目链接: http://poj.org/problem?id=2299

题意就是求冒泡排序的交换次数,显然直接冒泡会超时,所以需要高效的方法求逆序数。

利用归并排序求解,内存和耗时都比较少, 但是有编码难度。。

二叉排序树,内存巨大,时间复杂度高,但是非常好写。。

归并排序版本:

 #include <stdio.h>
#include <string.h>
long long merge_arr(int arr[], int first, int mid, int last, int tmp[])
{
long long ret = ;
int i = first, j = mid+, k = ;
while(i <= mid && j <= last)
{
if(arr[i] < arr[j])
{
tmp[k++] = arr[i++];
ret += j - mid - ;
}
else tmp[k++] = arr[j++];
}
while(i <= mid)
{
tmp[k++] = arr[i++];
ret += last - mid;
}
while(j <= last)
tmp[k++] = arr[j++];
for(i = ; i < k; i++)
arr[first+i] = tmp[i];
return ret;
} long long merge_sort(int arr[], int first, int last, int tmp[])
{
long long ret = ;
if(first < last)
{
int mid = (first + last) / ;
ret += merge_sort(arr, first, mid, tmp);
ret += merge_sort(arr, mid+, last, tmp);
ret += merge_arr(arr, first, mid, last, tmp);
}
return ret;
} int n, num[], tmp[];
int main()
{
while(scanf("%d", &n) != EOF && n)
{
for(int i = ; i < n; i++)
scanf("%d", &num[i]);
printf("%I64d\n", merge_sort(num, , n-, tmp));
}
return ;
}

二叉排序树版本:

 #include <stdio.h>
#include <stdlib.h> struct node
{
int data, cnt_right;
struct node *left, *right;
}; long long ans; void build(struct node *&p, int k)
{
if(p == NULL)
{
p = (struct node *)malloc(sizeof(struct node));
p->data = k;
p->cnt_right = ;
p->left = p->right = NULL;
}
else if(p->data > k)
{
ans += p->cnt_right + ;
build(p->left, k);
}
else
{
p->cnt_right++;
build(p->right, k);
}
} void del(struct node *p)
{
if(p == NULL)return;
del(p->left);
del(p->right);
free(p);
} int main()
{
int n, x;
while(scanf("%d", &n) != EOF && n)
{
ans = ;
struct node *root = NULL;
while(n--)
{
scanf("%d", &x);
build(root, x);
}
del(root);
printf("%I64d\n", ans);
}
return ;
}

POJ 2299 Ultra-QuickSort 归并排序、二叉排序树,求逆序数的更多相关文章

  1. POJ 2299 树状数组+离散化求逆序对

    给出一个序列 相邻的两个数可以进行交换 问最少交换多少次可以让他变成递增序列 每个数都是独一无二的 其实就是问冒泡往后 最多多少次 但是按普通冒泡记录次数一定会超时 冒泡记录次数的本质是每个数的逆序数 ...

  2. poj 2229 Ultra-QuickSort(树状数组求逆序数)

    题目链接:http://poj.org/problem?id=2299 题目大意:给定n个数,要求这些数构成的逆序对的个数. 可以采用归并排序,也可以使用树状数组 可以把数一个个插入到树状数组中, 每 ...

  3. POJ 2299 Ultra-QuickSort (排序+数据离散化+求顺序数)

    题意:给出一个序列,求至少需要用到多少次操作,才能将序列从小到大排序. 思路: 数据量很大,n<500000,所以用冒泡模拟是超时的. 接下来就想到了求顺序数,总共需要交换的次数为每个数后面有多 ...

  4. 线段树菜鸟一题+归并排序【求逆序数】POJ2299

    题目链接:http://poj.org/problem?id=2299 归并排序解法链接:http://blog.csdn.net/lyy289065406/article/details/66473 ...

  5. poj 2299 Ultra-QuickSort (归并排序 求逆序数)

    题目:http://poj.org/problem?id=2299 这个题目实际就是求逆序数,注意 long long 上白书上的模板 #include <iostream> #inclu ...

  6. POJ训练计划2299_Ultra-QuickSort(归并排序求逆序数)

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 39279   Accepted: 14163 ...

  7. poj 2299 Ultra-QuickSort 归并排序求逆序数对

    题目链接: http://poj.org/problem?id=2299 题目描述: 给一个有n(n<=500000)个数的杂乱序列,问:如果用冒泡排序,把这n个数排成升序,需要交换几次? 解题 ...

  8. poj 2299 Ultra-QuickSort :归并排序求逆序数

    点击打开链接 Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 34676   Accepted ...

  9. poj 2299 Ultra-QuickSort(树状数组求逆序数)

    链接:http://poj.org/problem?id=2299 题意:给出n个数,求将这n个数从小到大排序,求使用快排的需要交换的次数. 分析:由快排的性质很容易发现,只需要求每个数的逆序数累加起 ...

随机推荐

  1. 从cmd中进入MySQL的命令界面

    两种方式进入mysql命令界面 第一.直接开始界面→搜索mysql客户端登陆界面 第二.从cmd中进入MySQL的命令界面 2010-05-17 10:02:05|  分类: mysql|字号 订阅 ...

  2. html5标签兼容ie6,7,8

    注册博客园已经三年了,这三年一直在忙,没时间写博文.也许是忙,也许是懒吧!当然这三年发生了很多事,我也从开发人员转变为前端人员. 是时候对所学的,所用的知识做一下沉淀了.就从这一篇开始吧! html5 ...

  3. StyleCop安装及配置

    How to modify the default new class template for C# in Visual Studio 2008 or 2010? 可参考博客: http://www ...

  4. JavaScript入门(3)

    一.认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM将HTML文档呈现为带有元素.属性和文本的树结构(节点树). Eg: 将HT ...

  5. 并行计算vs分布式计算

    一般认为,集中在同一个机柜内或同一个地点的紧密耦合多处理机系统或大规模并行处理系统是并行处理系统,而用局域网或广域网连接的计算机系统是分布式处理系统.松散耦合并行计算机中的并行操作系统有时也称为分布式 ...

  6. WildFly 9.0.2 启用 SSL

    一.最近做个项目是需要在WildFly中启用https,但是由于WildFly的中文文档比较少所以google了一下,先是通过JBOSS的官方文档了解了一下,但是官方文档这块的配置介绍有些不全面.所以 ...

  7. EasyUI兼容IE问题

    上网搜了下,发现说明白的解决方案不多,于是记录了一下: 根本原因是JQuery的版本造成IE8及以下兼容的问题,(由于EasyUI是基于JQuery框架的,而JQuery貌似从2013年为了简洁代码, ...

  8. Emit学习(1)-Emit概览

    一.Emit概述 Emit,可以称为发出或者产生.在Framework中,与Emit相关的类基本都存在于System.Reflection.Emit命名空间下.可见Emit是作为反射的一个元素存在的. ...

  9. WindowListener中的windowClosed方法不执行的问题。

    1.在正常情况下windowClosed方法不执行: 2.调用dispose方法,windowClosed方法会执行.例如:在windowClosing方法中执行dispose方法,windowClo ...

  10. C#面向对象的一些东西

    最近在复习C#面向对象,也就是说常说的3大特性:封装.继承和多态.首先说一下封装,其实封装最大的目的也是为了实现代码的解耦和重用.代码也是安全的(对外它隐藏了具体的实现,就好比我们拿个遥控器就能操作电 ...