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;
}

posted on 2011-05-13 16:35  宇宙吾心  阅读(173)  评论(0)    收藏  举报

导航