POJ 2299 树状数组+离散化

上课前看了下题,上课时构了下思,下课敲了10min... 交了就A了... 好吧.. 这题弱爆了!

题目大意:

求一个数列中的逆序数....

这题可以用坐标离散化。然后... 从大的数向树状数组更新.. 查的时候求和,把这个数前面的大的数求出来就OK了。

水爆了... 1Y

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

struct node{
 	   int val,pos;
}a[555555];

int b[555555],c[555555];
bool cmp( node a,node b ){ return a.val>b.val; }

int lowbit( int x ){ return x&-x; }

int n;
int sum( int x )
{
 	int rec=0;
 	while( x )
 	{
	 	   rec+=c[x];
	 	   x-=lowbit(x);
  	}
  	return rec;
}
void add( int x,int val )
{
 	while( x<=n )
 	{
	 	   c[x]+=val;
	 	   x+=lowbit(x);
  	}
}

int main()
{
 	while( scanf("%d",&n)!=EOF )
 	{
	 	   memset( c,0,sizeof(c) );
	 	   if( n==0 )break;
	 	   for( int i=1;i<=n;i++ )
	 	   {
		   		scanf( "%d",&a[i].val );
		   		a[i].pos=i;
		   }
		   sort( a+1,a+n+1,cmp );
		   for( int i=1;i<=n;i++ )
		   		b[a[i].pos]=i;
		   __int64 ans=0;
		   for( int i=1;i<=n;i++ )
		   {
		   		ans+=sum(b[i]-1);
		   		add(b[i],1);
   		   }
   		   printf( "%I64d\n",ans );
  	}
 	return 0;
}


你可能感兴趣的:(c)