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