上课前看了下题,上课时构了下思,下课敲了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;
}