【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;
}
题意:求逆序对数
题解:离散化+树状数组求逆序对
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;
}
相关文章推荐
- poj2299 B - Ultra-QuickSort(线段树与树状数组求逆序对数)
- POJ 2299 Ultra-QuickSort 分治法求逆序数
- poj 2299 Ultra-QuickSort(求逆序对)
- POJ-Ultra-QuickSort 归并排序求逆序对
- POJ 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 逆序数 解题报告
- 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
- poj 2299 Ultra-QuickSort :归并排序求逆序数