【原题】
给n个数
求逆序对个数
【分析】
树状数组
首先将n 个数离散化到[1,n]
然后用树状数组
【代码】
//逆序对(树状数组)
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<map>
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
const int T=40001;
int a[T],b[T],t[T],c[T];
int n,m,ans;
int lowbit(int x) {return x&(-x);}
void insert(int x)
{
while(x<=n)
{
c[x]++;
x+=lowbit(x);
}
}
int sum(int x)
{
int s=0;
while(x>0)
{
s+=c[x];
x-=lowbit(x);
}
return s;
}
int main()
{
int i,j,k;
scanf("%d",&n);
m=n;
fo(i,1,n)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+m+1);
m=unique(b+1,b+m+1)-b-1;
fo(i,1,n)
t[i]=lower_bound(b+1,b+m+1,a[i])-b; //都是离散化
fo(i,1,n)
{
ans+=(i-sum(t[i])-1);
insert(t[i]);
}
cout<<ans<<endl;
}