【模板】树状数组求逆序对

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100010;
int a[maxn],b[maxn],t[maxn],n,ans;
void read(int &k){
	k=0; int f=1; char c=getchar();
	while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
	while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
	k*=f; 
}
void add(int x){for(;x<=n;x+=(x&-x)) t[x]++;}			//树状数组 
int query(int x){int ret=0; for(;x>0;x-=(x&-x)) ret+=t[x]; return ret;}
int main(){
	read(n);
	for (int i=1;i<=n;i++) read(a[i]),b[i]=a[i]; int N=n;		//离散化 
	sort(b+1,b+N+1); N=unique(b+1,b+1+n)-b-1;
	for (int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+1+N,a[i])-b;
	for (int i=1;i<=n;i++) ans+=query(a[i]),add(a[i]);		//查询比a[i]小的数的个数,并加入a[i] 
	return printf("%d
",n*(n-1)/2-ans),0;
}

  

原文地址:https://www.cnblogs.com/DriverLao/p/7778987.html