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 ;
}

最新文章

  1. pagebean pagetag java 后台代码实现分页 demo 前台标签分页 后台java分页
  2. NuGet控制台有几个常用命令
  3. 如何将红色区域数据调用解密函数直接打印到输出控制台(例如:crt控制台)
  4. viewport ---移动端详解
  5. echo颜色显示
  6. SQL Server 联表字段合并查询
  7. Project Euler 90:Cube digit pairs 立方体数字对
  8. get post
  9. leetcode之Palindrome Partitioning
  10. 【C#基础】byte二进制数组转string
  11. oracle sql developer 使用技巧
  12. [刷题]算法竞赛入门经典(第2版) 5-4/UVa10763 - Foreign Exchange
  13. HTML标签类型及特点
  14. [Swift]LeetCode926. 将字符串翻转到单调递增 | Flip String to Monotone Increasing
  15. rest framework 视图,路由
  16. Caravel–一款开源OLAP+数据可视化分析前端工具,支持Druid和Kylin
  17. 规则引擎 drools
  18. CODEFORCES掉RATING记 #5
  19. 数据结构 Sunday算法
  20. 文件上传:swfupload.js、blueimp-file-upload

热门文章

  1. How many---hdu2609(最小表示)
  2. 【我的Android进阶之旅】TortoiseSVN 客户端 如何重置用户名和密码?
  3. 安装odoo过程中出现的问题
  4. class-dump安装与使用
  5. Java基础知识陷阱(七)
  6. MyBatis For .NET学习-问题总结
  7. struts.xml 配置文件的主要元素
  8. 斐讯面试记录—阻塞Socket和非阻塞Socket
  9. BFC 详说 Block Formatting Contexts (块级格式化上下文)
  10. 233. Number of Digit One(统计1出现的次数)