树状数组求逆序对
tree含义表示 i 这个数出现了几次
sum[i]即表示1-i的数出现了几次
i-sum[i]-1 就是第i位的逆序对位几个;
数字大的时候要离散化
#include<bits/stdc++.h> using namespace std; const int maxn=5e5+10; #define ll long long #define mem(a,b) memset(a,b,sizeof(a)) #define int ll int arr[maxn],b[maxn]; int tree[maxn]; int n; int lowbit(int x) { return x&(-x); } int sum(int x) { int ans=0; while(x>0) { ans+=tree[x]; x-=lowbit(x); } return ans; } void add(int x,int v) { while(x<=n) { tree[x]+=v; x+=lowbit(x); } } #undef int int main() { #define int long long cin>>n; for(int i=1;i<=n;i++) { cin>>arr[i]; b[i]=arr[i]; } sort(arr+1,arr+1+n); int ans=0; for(int i=1;i<=n;i++) { int pos=lower_bound(arr+1,arr+1+n,b[i])-arr; //cout<<pos<<endl; //cout<<"t:"<<i-1-sum(pos)<<endl; ans+=(i-sum(pos)-1); add(pos,1); } cout<<ans<<endl; return 0; }