【POJ】【P2299】【Ultra-QuickSort】【题解】【求逆序对】

来源:互联网 发布:变脸视频是什么软件 编辑:程序博客网 时间:2024/05/10 11:23

传送门:http://poj.org/problem?id=2299

题意:求逆序对数

题解:离散化+树状数组求逆序对

1.其实这道题还可以用归并排序写,蒟蒻还是觉得树状数组好些一点……

2.离散化,是因为数据范围给到了999999999,数组开不出来,于是把每个数建立一个映射,通常就用排序后的index做映射离散化

3.n^2算法是冒泡排序,优化成为归并排序,或者枚举每个数在位置和数值都比它小的个数,求和可以用树状数组优化为nlogn

/*ID:iamzkyOJ:POJIndex:2299Language:C++*/#include<cstdio>#include<vector>#include<cstring>#include<iostream>#include<algorithm>using namespace std;struct num{int X,Y;};bool cmp(num a,num b){return a.X<b.X;}num a[500010];//原数组 int b[500010];//离散后的数组 int d[500010];//bit数组 int n;inline int lowbit(int x){return x&(-x);}int get(int x){int s=0;while(x){s+=d[x];x-=lowbit(x);}return s;}void updata(int x){while(x<=n){d[x]++;x+=lowbit(x);}}int main(){int i;while(cin>>n){if(!n)break;for(i=1;i<=n;i++){cin>>a[i].X;a[i].Y=i;}sort(a+1,a+1+n,cmp);for(i=1;i<=n;i++){b[a[i].Y]=i;//离散化,自己好好想想为什么 }memset(d,0,sizeof(d));//别忘了清空哦,蒟蒻因为它WA了3次 long long ans=0;for(i=1;i<=n;i++){updata(b[i]);ans+=(i-get(b[i]));}cout<<ans<<endl;}return 0;}


0 0
原创粉丝点击