http://poj.org/problem?id=2299

题意:
给出一组数,求逆序对。

思路:

这道题可以用树状数组解决,但是在此之前,需要对数据进行一下预处理。

这道题目的数据可以大到999,999,999,但数组肯定是无法开这么大的,但是每组数据最多只有500000个,那么,怎么办呢,离散化!

离散化,也就是将数据和1~n做一一映射。

比如:

9 1 0 5 4

离散化之后变成

5 2 1 4 3

这样的话,就可以放心的开数组啦!

至于树状数组的计算过程,我懒得写了,直接摘抄一下大神的http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html

在离散结果中间结果的基础上,那么其计算逆序数的过程是这么一个过程。

,输入5,   调用upDate(, ),把第5位设置为1

计算1-5上比5小的数字存在么? 这里用到了树状数组的getSum() = 1操作,

现在用输入的下标1 - getSum() =  就可以得到对于5的逆序数为0。

. 输入2, 调用upDate(, ),把第2位设置为1

计算1-2上比2小的数字存在么? 这里用到了树状数组的getSum() = 1操作,

现在用输入的下标2 - getSum() =  就可以得到对于2的逆序数为1。

. 输入1, 调用upDate(, ),把第1位设置为1

计算1-1上比1小的数字存在么? 这里用到了树状数组的getSum() = 1操作,

现在用输入的下标  - getSum() =  就可以得到对于1的逆序数为2。

. 输入4, 调用upDate(, ),把第5位设置为1

计算1-4上比4小的数字存在么? 这里用到了树状数组的getSum() = 3操作,

现在用输入的下标4 - getSum() =  就可以得到对于4的逆序数为1。

. 输入3, 调用upDate(, ),把第3位设置为1

计算1-3上比3小的数字存在么? 这里用到了树状数组的getSum() = 3操作,

现在用输入的下标5 - getSum() =  就可以得到对于3的逆序数为2。

. ++++ =  这就是最后的逆序数
 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
#include<map>
#include<stack>
using namespace std; const int maxn=+; int n; struct node
{
int val;
int pos;
}a[maxn]; int b[maxn];
int c[maxn]; bool cmp(node a,node b)
{
return a.val<b.val;
} int lowbit(int x)
{
return x&-x;
} int sum(int x)
{
int ret=;
while(x>)
{
ret+=c[x];
x-=lowbit(x);
}
return ret;
} void add(int x,int d)
{
while(x<=n)
{
c[x]+=d;
x+=lowbit(x);
}
} int main()
{
//freopen("D:\\input.txt","r",stdin);
while(~scanf("%d",&n) && n)
{
for(int i=;i<=n;i++)
{
scanf("%d",&a[i].val);
a[i].pos=i;
}
sort(a+,a++n,cmp);
for(int i=;i<=n;i++)
b[a[i].pos]=i;
memset(c,,sizeof(c));
long long ans=;
for(int i=;i<=n;i++)
{
add(b[i],);
ans+=i-sum(b[i]);
}
printf("%lld\n",ans);
}
return ;
}

POJ 2299 Ultra-QuickSort(树状数组+离散化)的更多相关文章

  1. POJ - 2299 Ultra-QuickSort 【树状数组+离散化】

    题目链接 http://poj.org/problem?id=2299 题意 给出一个序列 求出 这个序列要排成有序序列 至少要经过多少次交换 思路 求逆序对的过程 但是因为数据范围比较大 到 999 ...

  2. poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)

    题目链接:http://poj.org/problem?id=2299 Description In this problem, you have to analyze a particular so ...

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

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

  4. poj 2299 Ultra-QuickSort(树状数组)

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 67681   Accepted: 25345 ...

  5. POJ 2299 Ultra-QuickSort【树状数组 ,逆序数】

    题意:给出一组数,然后求它的逆序数 先把这组数离散化,大概就是编上号的意思--- 然后利用树状数组求出每个数前面有多少个数比它小,再通过这个数的位置,就可以求出前面有多少个数比它大了 这一篇讲得很详细 ...

  6. POJ 2299 【树状数组 离散化】

    题目链接:POJ 2299 Ultra-QuickSort Description In this problem, you have to analyze a particular sorting ...

  7. hdu4605 树状数组+离散化+dfs

    Magic Ball Game Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  8. BZOJ_5055_膜法师_树状数组+离散化

    BZOJ_5055_膜法师_树状数组+离散化 Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然 ...

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

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

随机推荐

  1. 剑指Offer——链表中环的入口结点

    题目描述: 一个链表中包含环,请找出该链表的环的入口结点. 分析: 设置两个指针p1,p2, 两个指针都从链表的头部开始走,不过p1每次走一步,p2每次走两步. 直到相遇的时候,p2走的长度是p1的两 ...

  2. Battery Historian之App耗电量测试

    一.Battery Historian测试所需环境:Go+Git+Python+Java+Battery Historian源码 下载Battery Historian源码并且运行的步骤如下: 1.打 ...

  3. ssh无密码登录设置

    为啥要设置ssh无密码登录? 我们先来看一下分布式系统的一键启动流程, 在matser机器上运行脚本,脚本检测有多少slavers,然后通过ssh登录到slavers,进入到相同的目录(或者通过$XX ...

  4. maven 之 web.xml 头设置错误问题

    1.一般开发工具创建web.xml的时候会默认添加web.xml头,而有些插件(例如maven相关插件)默认添加的为 版本和你的开发工具Project facets(项目特性)中设置不同.那么就会导致 ...

  5. Mybatis的MapperRegistry错误

    1,如果mabtis的配置文件里mapper用的不是包扫描,而是: <mapper resource="com/vmpjin/mapper/OrdersMapper.xml" ...

  6. 005-Shell echo命令

    一.概述 Shell 的 echo 指令,用于字符串的输出.命令格式: echo string 可以使用echo实现更复杂的输出格式控制. 1.显示普通字符串: echo "It is a ...

  7. centos 解决error: rpmdbNextIterator问题 (转)

    昨天重装RedHat4以后出现了下面这个问题 [root@RedHat4 ~]# rpm -qa |grep vimerror: rpmdbNextIterator: skipping h#      ...

  8. Linux 超级用户和普通用户切换命令

    默认登录的是普通用户权限显示$符 tree@ubuntu:/usr$ 从普通用户切换超级用户权限: sudo su tree@ubuntu:/usr$ sudo su 输入密码 [sudo] pass ...

  9. 栈的最大值问题 max问题 min问题 队列的max问题

    常数时间求栈的最大值   问题描述: 一个栈stack,具有push和pop操作,其时间复杂度皆为O(1). 设计算法max操作,求栈中的最大值,该操作的时间复杂度也要求为O(1). 可以修改栈的存储 ...

  10. HTML5游戏开发系列教程4(译)

    原文地址:http://www.script-tutorials.com/html5-game-development-lesson-4/ 这篇文章是我们继续使用canvas来进行HTML5游戏开发系 ...