树状数组与逆序对
作者:互联网
当数据范围较大需要离散化,因此需要排序,所以这种情况下不如直接用归并排序。
#include<bits/stdc++.h> using namespace std; const int N=5e5+5; int n; int a[N],b[N]; int c[N]; int ask(int x) { int ans=0; for(; x; x-=x&-x) ans+=c[x]; return ans; } void add(int x,int y) { for(; x<=n; x+=x&-x) c[x]+=y; } int main() { scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%d",&a[i]); b[i]=a[i]; } sort(a+1,a+1+n); int k=unique(a+1,a+n+1)-a-1; for(int i=1; i<=n; i++) b[i]=lower_bound(a+1,a+1+k,b[i])-a; long long ans=0; for(int i=n; i>=1; i--) { ans+=ask(b[i]-1); add(b[i],1); } printf("%lld\n",ans); return 0; }View Code
标签:return,树状,int,add,数组,ans,ask,排序,逆序 来源: https://www.cnblogs.com/9r2pqvv88/p/16272355.html