树状数组求逆序对
从 到 枚举,考虑当前枚举到的位置 ,他对总的逆序对的个数的贡献就是他前面的权值大于他的权值的数的个数,所以我们在i的权值的位置修改树状数组,表示 的权值这个数已经出现过了,那么到了后面就可以直接查询从 到 的权值的位置的总和。
void add(int i,int t){
while(i<=len){//这里的len是元素种类,具体见上一篇博客
c[i]+=t;
i+=lowbit(i);
}
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
int t;
cin>>t;
add(t,1);
ans+=i-sum(t);
}
for(int i=1;i<=n;i++){
cout<<c[i]<<endl;
}
cout<<ans<<endl;
return 0;
}