题面
给定一个序列
求这个序列中逆序对的个数
要求:必须使用树状数组
分析
虽然就是这么简单一个模板,但我还是写WA了
为什么呢????(不服气╭(╯^╰)╮)
因为啊要先插入,再查询,要清楚现在查询的是小于等于当前数的个数(包括了自己,所以要把自己加进去,才能减掉自己)
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int lowbits(int x){
return x&(-x);
}
ll tr[100009];
int n,a;
void insert(ll x){
while(x<=100009){
tr[x]++;
x+=lowbits(x);
}
}
int ask(int x){
ll res=0;
while(x){
res+=tr[x];
x-=lowbits(x);
}
return res;
}
int main(){
memset(tr,0,sizeof(tr));
scanf("%d",&n);
int i,j,k;
ll sum=0;
for(i=1;i<=n;++i){
scanf("%d",&a);insert(a);//先插入后查询
sum+=i-ask(a);
}
cout<<sum;
return 0;
}