您的位置:首页 > 产品设计 > UI/UE

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

2014-02-05 15:04 337 查看
传送门:http://poj.org/problem?id=2299

题意:求逆序对数

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

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

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

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

/*
ID:iamzky
OJ:POJ
Index:2299
Language: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj