就是求每个数之前比他大的数的个数,然后因为数太大了,先离散化一下
注意一组测试数据
3
1
1
1
答案是0
还有结果是longlong
AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX_N = 5e5;
struct Node{
__int64 n;
int id;
};
Node node[MAX_N+5];
int num[MAX_N+5];
int sum[MAX_N+5];
int N;
bool cmp( Node a, Node b ){
if( a.n > b.n ){
return false;
}else{
return true;
}
}
inline int lowbit( int x ){
return x & -x;
}
int getsum( int x ){
int ans = 0;
while( x > 0 ){
ans += sum[x];
x -= lowbit( x );
}
return ans;
}
void updata( int x, int val ){
while( x <= N ){
sum[x] += val;
x += lowbit( x );
}
}
int main(){
while( scanf( "%d", &N ) && N ){
for( int i = 1; i <= N; i++ ){
scanf( "%I64d", &node[i].n );
node[i].id = i;
}
sort( node + 1, node + 1 + N, cmp );
num[node[1].id] = 1;
for( int i = 2; i <= N; i++ ){
if( node[i].n == node[i-1].n ){
num[node[i].id] = num[node[i-1].id];
}else{
num[node[i].id] = num[node[i-1].id] + 1;
}
}
memset( sum, 0, sizeof( sum ) );
__int64 ans = 0;
for( int i = 1; i <= N; i++ ){
updata( num[i], 1 );
ans += i - getsum( num[i] );
}
printf( "%I64d\n", ans );
}
return 0;
}
/*
3
1
1
1
答案是0
*/