树状数组求逆序数

it2022-05-08  11

模板

#include <bits/stdc++.h> using namespace std; const int maxn = 1e5+10; int tree[maxn],a[maxn],n; vector <int> vc; int getid(int x) { return lower_bound(vc.begin(),vc.end(),x)-vc.begin()+1; } int lowbit(int x) { return x&(-x); } void Ins(int pos,int y) { for(int i=pos;i<=n;i+=lowbit(i)) tree[i] += y; } int Sum(int pos) { int ans = 0; for(int i=pos;i>0;i-=lowbit(i)) ans += tree[i]; return ans; } int main(void) { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); vc.push_back(a[i]); } sort(vc.begin(),vc.end()); vc.erase(unique(vc.begin(),vc.end()),vc.end()); int ans = 0;// 逆序数 for(int i=1;i<=n;i++) { Ins(getid(a[i]),1); ans += i-Sum(a[i]); } printf("%d\n",ans); return 0; }

 


最新回复(0)