来源于CF1676H2题目,遇到一个求逆序对的问题,咱也不敢问为什么能这么求啊。

求逆序对

用途:给一个序列,求出逆序对,\(O(log_2n)\)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>
#include <vector>
using namespace std;
int main() {
int t; cin>>t;
while(t--){
long long n,rez=0;
cin>>n;
vector<int> a(n),T(n+1);
for(int i=0;i<n;i++) cin>>a[i];
for(int i=n-1;i>=0;i--){
for(int x=a[i];x>0;x -= x&-x) rez+=T[x];
for(int x=a[i];x<=n;x+=x&-x) T[x]+=1;
}
cout<<rez<<'\n';
}
return 0;
}