Tiny Counting

版权声明:未经过同意不得转载 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

猜你喜欢

转载自blog.csdn.net/qq_42500298/article/details/83003977