数据过大,进行离散化。
注意:
线段树建树要注意数组为maxn四倍。(为此WA了一次)。
输出格式。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxn 500010
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
int n;
int a[maxn];
int b[maxn];
int sum[maxn<<2];
int cmp(const void *a, const void *b){
return *(int *)a - *(int *)b;
}
void build(int l, int r, int rt){
memset(sum, 0, sizeof(sum));
}
int Query(int L, int R, int l, int r, int rt){
if(L <= l && r <= R){
return sum[rt];
}
int m = (l+r)>>1;
int ret = 0;
if(L <= m) ret += Query(L, R, lson);
if(R > m) ret += Query(L, R, rson);
return ret;
}
void Update(int p, int l, int r, int rt){
if(l == r){
sum[rt]++;
return ;
}
int m = (l+r)>>1;
if(p <= m) Update(p, lson);
else Update(p, rson);
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
int find(int x){
int l=1, r=n;
while(l <= r){
int m = (l+r)>>1;
if(b[m] == x) return m;
if(b[m] < x) l = m+1;
else r = m-1;
}
return -1;
}
int main(){
freopen("in.txt", "r", stdin);
while(scanf("%d", &n) != EOF){
if(n == 0) break;
for(int i=1; i<=n; i++){
scanf("%d", &a[i]);
b[i] = a[i];
}
qsort(b+1, n, sizeof(b[0]), cmp);
build(1, n, 1);
long long ans = 0;
for(int i=1; i<=n; i++){
int x = find(a[i]);
ans += Query(x, n, 1, n, 1);
Update(x, 1, n, 1);
}
printf("%lld\n", ans);
}
return 0;
}