#include<iostream>
#include<cstring>
using namespace std;
const int N = 1000010;
int w[N],tr[N],sum[N];
int n;
int lowbit(int x){
return x & -x;
}
void add(int x,int v){
for(int i=x;i<N;i+=lowbit(i)) tr[i] += v;
}
int query(int x){
int res = 0;
for(int i=x;i;i-=lowbit(i)) res += tr[i];
return res;
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++) {
scanf("%d",&w[i]);
w[i]++;
}
for(int i=0;i<n;i++){
sum[i] = query(N-1)-query(w[i]);
add(w[i],1);
}
memset(tr,0,sizeof tr);
for(int i=n-1;i>=0;i--){
sum[i] += query(w[i]-1);
add(w[i],1);
}
long long res = 0;
for(int i=0;i<n;i++) res += (long long)sum[i]*(sum[i]+1)/2;
printf("%lld",res);
}
树状数组求解小朋友排队(c++实现)
最新推荐文章于 2024-07-25 12:39:48 发布