当前位置: 代码迷 >> 综合 >> POJ 2299 树状数组+离散化
  详细解决方案

POJ 2299 树状数组+离散化

热度:52   发布时间:2024-01-20 20:27:15.0

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