题目统计逆序数的数量,可以用归并排序。这里利用树状数组求逆序数
// 树状数组求逆序数
#include <cstdio>
#include <string.h>
#define MAX 1000 + 10
typedef long long LL;
LL c[MAX];
LL lowbit( LL i ) {
return i & ( -i );
}
void update( LL i, LL val, LL n ) {
while( i <= n ) {
c[i] = c[i] + val;
i = i + lowbit( i );
}
}
LL getSum( LL i ) {
LL ans = 0;
while( i > 0 ) {
ans = ans + c[i];
i = i - lowbit( i );
}
return ans;
}
int main() {
LL n;
while( scanf( "%lld", &n ) != EOF ) {
for( LL i = 1; i <= n; i++ ) c[i] = 0; // 初始化树状数组
LL num;
LL ans = 0;
for( LL i = 1; i <= n; i++ ) {
scanf( "%lld", &num );
update( num, 1, n );
ans = ans + i - getSum( num );
}
printf( "%lld\n", ans );
}
return 0;
}