poj 2299
逆序数。
归并或树状数组
代码:
#include<iostream>
#include<fstream>
using namespace std;
struct e{
int id;
int w;
};
e a[500001];
int n;
int cmp(const void *a,const void *b){
return (*(e*)b).w-(*(e*)a).w;
}
int b[500001];
int lowbit(int s){
return s&(-s);
}
void add(int s){
while(s<=n)
{
b[s]+=1;
s+=lowbit(s);
}
}
int getsum(int s){
int i=0;
while(s>0)
{
i+=b[s];
s-=lowbit(s);
}
return i;
}
void read(){
// ifstream cin("in.txt");
int i,j,k;
while(cin>>n)
{
if(n==0) return;
for(i=1;i<=n;i++)
{
cin>>a[i].w;
a[i].id=i;
}
long long ans=0;
memset(b,0,sizeof(b));
qsort(a+1,n,sizeof(e),cmp);
for(i=1;i<=n;i++)
{
ans+=getsum(a[i].id-1);
add(a[i].id);
}
cout<<ans<<endl;
}
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号