题型:求逆序数,(用树状数组+离散化)
心得:很悲剧,TLE AT #31 N 次,原因出在qsort(),(难怪发现不了),后来改sort(),就过了。看来qsort()的效率还有待分析!
#include < stdio.h >
#include < stdlib.h >
#include < string .h >
#define NL 65538
#define LL __int64
struct Num {
int v, no;
}a[NL];
int n, b[NL], mx;
int t[NL];
int cmp( const void * a, const void * b)
{
return (( struct Num * )a) -> v - (( struct Num * )b) -> v;
}
inline int lowbit( int k)
{
return k & ( - k);
}
int sum( int k)
{
int cnt = 0 ;
while (k > 0 ) {
cnt += t[k];
k -= lowbit(k);
}
return cnt;
}
void update( int k, int c)
{
while (k <= mx) {
t[k] += c;
k += lowbit(k);
}
}
int main()
{
int i, p;
LL cnt;
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
scanf( " %d " , & n);
for (i = 0 ; i < n; i ++ ) {
scanf( " %d " , & a[i].v);
a[i].no = i;
}
qsort(a, n, sizeof (a[ 0 ]), cmp);
p = 1 ;
b[a[ 0 ].no] = 1 ;
for (i = 1 ; i < n; i ++ ) {
if (a[i].v != a[i - 1 ].v) p ++ ;
b[a[i].no] = p;
}
mx = p;
memset(t, 0 , sizeof (t));
cnt = 0 ;
for (i = n - 1 ; i >= 0 ; i -- ) {
cnt += sum(b[i] - 1 );
update(b[i], 1 );
}
printf( " %I64d\n " , cnt);
return 0 ;
}