单纯的记住左右两边小于的元素个数不就行了吗?(这个应该不是题解中那个类似离散化(?)的东西吧)
#include <bits/stdc++.h>
#define N 100005
#define ll long long
using namespace std;
ll n,maxval;
ll a[N],le[N],rig[N],bl[N],br[N];
ll lowbit(ll x){
return (x&(-x));
}
void add(ll b[],int x,int y){
while(x<=maxval){
b[x]+=y;
x+=lowbit(x);
}
}
ll query(ll b[],int x){
ll res=0;
while(x>0){
res+=b[x];
x-=lowbit(x);
}
return res;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
maxval=max(maxval,a[i]);
}
for(int i=1;i<=n;i++){
le[i]=query(bl,a[i]-1);
add(bl,a[i],1);
}
for(int i=n;i>=1;i--){
rig[i]=query(br,maxval)-query(br,a[i]);
add(br,a[i],1);
}
ll ans=0;
for(int i=1;i<=n;i++){
ans+=(le[i]*rig[i]);
}
cout << ans;
return 0;
}