题目链接: 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. 深入理解jQuery插件开发(转)

    如果你看到这篇文章,我确信你毫无疑问会认为jQuery是一个使用简便的库.jQuery可能使用起来很简单,但是它仍然有一些奇怪的地方,对它基本功能和概念不熟悉的人可能会难以掌握.但是不用担心,我下面已 ...

  2. phpcms 源码分析一: common.inc.php

      其实就是从网上找到的的逆雪寒的分析, 我下来之后发现格式和错字的问题,非常影响阅读,现在我就是做了下搬运工的角色, 同时将格式调整到可读性提高点而已,让各位看官稍微舒心点: 下面进入整体: < ...

  3. linux上配置jdk+Apache

    一:安装jdk下载将jdk加压后放到/usr/local目录下: [root@master ~]#chmod 755 jdk-6u5-linux-x64.bin [root@master ~]# ./ ...

  4. UIPickerView实现省 市 区三级联动

    前几天用UIPickerView实现了一下三级联动具体的如下图

  5. 闲话shuffle(洗牌)算法

    工作中经常会用到洗牌算法,看到这篇文章不错,原文摘自:http://www.atatech.org/article/detail/11821/928  作者:子仲   场景 洗牌算法的应用场景其实很多 ...

  6. Base62编码与62进制

    Base62编码 Base62编码与Base64编码类似,都用于数据内容编码.基本原理请参看<Base64算法>. import java.io.ByteArrayOutputStream ...

  7. R-大数据分析挖掘(5-R基础回顾)

    (一)R函数 R是一种解析型语言,输入后可直接获取结果 函数(输入参数,参数) R的函数分为“高级”和“低级函数” • 高级函数可调用低级函数 • 高级函数称为泛型函数 • 函数名  <-­‐ ...

  8. YII中路径别名

    路径别名 system:代表framework目录 system.web:代表framework/web目录 zii:代表framework/zii目录 webroot:代表项目下的app目录(htt ...

  9. js广告浮动

    一个广告框在指定区域,有定位属性的父级区域内,一直向右向左移动,如果碰到左右边框,反向,如果碰到上下边距,反向,实现在指定框中浮动的效果. <!doctype html> <html ...

  10. SQL Server delete、truncate、drop

    在T-SQL中这三个命令符,相信很多朋友都不会陌生的,我自己在工作也会常常使用到它们,虽然我们清除的知道用这三个命令符可以达到怎样的预期效果. 但是却很少深入的去了解它们,知道它们有什么区别,又各有什 ...