版权声明:未经过同意不得转载 https://blog.csdn.net/qq_42500298/article/details/83003977
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
int n,m,s[maxn],a[maxn],C[maxn],t1[maxn],t2[maxn],t3[maxn],t4[maxn];
long long s1,s2,ans;
void add(int x)
{
while(x<=m)
C[x]++,x+=x&-x;
}
int query(int x)
{
int ret=0;
while(x)
ret+=C[x],x-=x&-x;
return ret;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&s[i]),a[i]=s[i];
sort(a+1,a+n+1);
m=unique(a+1,a+n+1)-a-1;
for(int i=1;i<=n;i++)
s[i]=lower_bound(a+1,a+m+1,s[i])-a;
for(int i=1;i<=n;i++)
t1[i]=query(s[i]-1),s1+=t1[i],add(s[i]);
memset(C,0,sizeof C);
for(int i=n;i;i--)
t2[i]=query(s[i]-1),add(s[i]);
memset(C,0,sizeof C);
for(int i=1;i<=n;i++)
t3[i]=query(m)-query(s[i]),s2+=t3[i],add(s[i]);
memset(C,0,sizeof C);
for(int i=n;i;i--)
t4[i]=query(m)-query(s[i]),add(s[i]);
for(int i=1;i<=n;i++)
ans-=1ll*t1[i]*t2[i]+1ll*t3[i]*t4[i]+1ll*t1[i]*t3[i]+1ll*t2[i]*t4[i];
ans+=1ll*s1*s2;
cout<<ans;
return 0;
}
来源:zr