数状数组的运用+哈希的思想 可以统计数组的逆序对
p1908 逆序对模板题
#include <stdio.h>
#include <string.h>
#include
using namespace std;
typedef long long ll;
const int maxn=5e5+7;
int h[maxn],li[maxn],cnt,c[maxn];
int n;
inline int lowbit(int x){return x&(-x);}
int get_sum(int x){
int sum=0;
while(x)sum+=c[x],x-=lowbit(x);
return sum;
}
void add(int x,int d){
while(x<maxn)c[x]+=d,x+=lowbit(x);
}
int find(int x){
int l=1,r=cnt;
while(l<r){
int mid=l+r>>1;
if(li[mid]>=x)r=mid;
else l=mid+1;
}
return r;
}
int main()
{
int a;
scanf("%d",&n);
ll ans=0;
for(int i=1;i<=n;i++)scanf("%d",&h[i]),li[i]=h[i];
sort(li+1,li+n+1);cnt=1;
for(int i=2;i<=n;i++)if(li[i]!=li[cnt])li[++cnt]=li[i];
for(int i=1;i<=n;i++){
int x=find(h[i]);
int sum=i-get_sum(x);ans+=sum;add(x,1);
}
printf("%lld\n",ans-n);
return 0;
}