这个题本来是想暴力冒泡的,WA了。
后来查了一下 都是推荐树状数组,然后发现自己根本不会那个。 所以膜拜了一下大佬的博客。
就是用二进制的存数据。
用 x&-x 来表示 -x 表示x的反码。
下面是AC代码.
#include<bits/stdc++.h>
using namespace std;
int tree[1000010],n=1000010;
void add(int x,int num)
{
for(;x<=n;x+=x&-x)
tree[x]+=num;
}
int sum(int x)
{
int answer =0;
for(;x>0;x-=x&-x)
answer+=tree[x];
return answer;
}
long long cur[1000010],dis[1000010],b[1000010];
int main()
{
int n;
cin>>n;
cur[0]=0;
for(int i=1;i<1000010;i++)
cur[i]=cur[i-1]+i;
for(int i=0;i<n;i++)
{
cin>>dis[i];
add(dis[i]+1,1);
b[i]=i+1-sum(dis[i]+1);
}
memset(tree,0,sizeof(tree));
for(int i=n-1;i>=0;i--)
{
add(dis[i]+1,1);
b[i]+=sum(dis[i]);
}
long long ans=0;
for(int i=0;i<n;i++)
{
ans+=cur[b[i]];
}
cout<<ans<<endl;
}