poj 2299 Ultra-QuickSort(树状数组求逆序数)
2013-08-19 19:39
113 查看
链接:http://poj.org/problem?id=2299
题意:给出n个数,求将这n个数从小到大排序,求使用快排的需要交换的次数。
分析:由快排的性质很容易发现,只需要求每个数的逆序数累加起来就行了。逆序数可以用树状数组求。
n<500000,0<=a[i]<=999,999,999,很明显数组不可能开这么大,所以需要离散化。
可以用一个结构体
struct node{
int val,pos;
}a
;
pos表示每个数的下标,val表示该数的值
按val从小到大排序,然后b[a[i].pos]]=i,就实现了离散化,保证了原来序列的大小关系不变。
之后就是简单的树状数组求逆序数了。
AC代码如下:
View Code
题意:给出n个数,求将这n个数从小到大排序,求使用快排的需要交换的次数。
分析:由快排的性质很容易发现,只需要求每个数的逆序数累加起来就行了。逆序数可以用树状数组求。
n<500000,0<=a[i]<=999,999,999,很明显数组不可能开这么大,所以需要离散化。
可以用一个结构体
struct node{
int val,pos;
}a
;
pos表示每个数的下标,val表示该数的值
按val从小到大排序,然后b[a[i].pos]]=i,就实现了离散化,保证了原来序列的大小关系不变。
之后就是简单的树状数组求逆序数了。
AC代码如下:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=500010; #define LL __int64 int c ,b ,n; struct node{ int val,pos; bool operator <(const node &a)const{ return val<a.val; } }a ; int lowbit(int x) { return x&(-x); } void update(int x,int num) { while(x<=N) { c[x]+=num; x+=lowbit(x); } } LL sum(int x) { LL s=0; while(x>0) { s+=c[x]; x-=lowbit(x); } return s; } int main() { int i; while(scanf("%d",&n)&&n) { for(i=1;i<=n;i++) { scanf("%d",&a[i].val); a[i].pos=i; } sort(a+1,a+n+1); for(i=1;i<=n;i++) b[a[i].pos]=i; memset(c,0,sizeof(c)); LL ans=0; for(i=1;i<=n;i++) { update(b[i],1); ans+=i-sum(b[i]); } printf("%I64d\n",ans); } return 0; }
View Code
相关文章推荐
- POJ 2299 Ultra-QuickSort 求逆序数 树状数组
- poj 2299 Ultra-QuickSort (树状数组求逆序数)
- POJ 2299 Ultra-QuickSort【求逆序数:归并排序|树状数组】
- poj 2299 Ultra-QuickSort 求逆序数 树状数组解法
- poj 2299 Ultra-QuickSort(树状数组求逆序数)
- POJ 2299 Ultra-QuickSort(树状数组入门) 求逆序数
- poj 2299 Ultra-QuickSort 求逆序数 树状数组解法
- poj--2299 Ultra-QuickSort(树状数组求逆序数)
- POJ 2299 Ultra-QuickSort(树状数组求逆序数)
- poj 2299 Ultra-QuickSort 树状数组求逆序数
- POJ 2299 -Ultra-QuickSort-树状数组求逆序数
- POJ2299 Ultra-QuickSort(树状数组求逆序数)
- poj 2299 Ultra-QuickSort 树状数组求逆序数
- POJ[2299]Ultra-QuickSort 逆序对:线段树||树状数组||分治
- 【POJ】2299 - Ultra-QuickSort(离散化 & (树状数组 | 线段树))
- POJ 2299 Ultra-QuickSort(树状数组+离散化处理)
- POJ 2299 Ultra-QuickSort(树状数组+离散化)
- poj - 2299 - Ultra-QuickSort(树状数组)
- poj 2299 Ultra-QuickSort (树状数组)
- poj2299 B - Ultra-QuickSort(线段树与树状数组求逆序对数)