思路:
把序列操作看成是减小逆序对的个数,所以答案就是逆序对个数
直接二维偏序
c o d e code code
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
long long n, c[1010000], ans, a[1010000], b[1010000];
long long lowbit(long long x)
{
return x&(-x);
}
void add(long long x, long long y)
{
for(; x<=n; x+=lowbit(x))
c[x]+=y;
}
long long query(long long x)
{
long long sum=0;
for(; x>=1; x-=lowbit(x))
sum+=c[x];
return sum;
}
int main()
{
scanf("%lld", &n);
for(long long i=1; i<=n; i++)
scanf("%lld", &a[i]), b[i]=a[i];
sort(b+1, b+1+n);
long long tot=unique(b+1, b+1+n)-b-1;
for(long long i=n; i>=1; i--)
{
a[i]=lower_bound(b+1, b+1+tot, a[i])-b;
ans+=query(a[i]-1);
add(a[i], 1);
}
printf("%lld", ans);
return 0;
}