#include<cstdio>
#include<algorithm>
using namespace std;
int n,t=0;
long long ans;
int aa[500050],e[500050];
struct wfq{
int v,ord;
}a[500050];
int cmp(const wfq &a,const wfq &b){return a.v<b.v;}
int lowbit(int x){return x&(-x);}
void Add(int x)
{
int a1=0,a2=0;
for(int i=x;i<=n;i+=lowbit(i))e[i]+=1;
for(int i=n;i>0;i-=lowbit(i))a1+=e[i];
for(int i=x;i>0;i-=lowbit(i))a2+=e[i];
ans+=a1-a2;
return;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){scanf("%d",&a[i].v),a[i].ord=i;}
stable_sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(i>=2&&a[i].v==a[i-1].v)t++;//就是这一句;
aa[a[i].ord]=i-t;
}
for(int i=1;i<=n-t;i++){Add(aa[i]);}
printf("%lld\n",ans);
return 0;
}
我加这一句是为了在离散化时,遇到相同的数会离散化出相同的结果。
如 4 7 9 2 9 5 7 3这个数列
加上这一句变成了
3 5 6 1 6 4 5 2
而不加这一句则是
3 5 7 1 8 4 6 2
自认为挺对,,,,