[树状数组 逆序对] poj 2299 Ultra-QuickSort
2016-07-25 14:24
525 查看
分析
本题求冒泡排序的操作次数,即求原序列的逆序对的个数。数据过大,需要用离散化处理。数据离散化
代码
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<map> #include<algorithm> using namespace std; const int maxn=5e5+5; int n; int a[maxn],b[maxn]; int bit[maxn]; long long ans; void add(int x,int val=1) { while(x<=n) { bit[x]+=val; x+=x&-x; } } long long getsum(int x) { long long res=0; while(x) { res+=bit[x]; x-=x&-x; } return res; } int main() { while(cin>>n && n) { for(int i=0;i<n;i++) scanf("%d",&a[i]),b[i]=a[i]; ans=0; memset(bit,0,sizeof bit); sort(b,b+n); for(int i=0;i<=n;i++) a[i]=lower_bound(b,b+n,a[i])-b+1; for(int i=0;i<n;i++) { ans+=(i-getsum(a[i])); add(a[i]); } cout<<ans<<endl; } return 0; }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法