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; }
博客介绍了tree含义为数字i出现的次数,sum[i]表示1 - i的数出现的次数,i - sum[i] - 1为第i位的逆序对位数量,还提到数字大时要进行离散化。
806

被折叠的 条评论
为什么被折叠?



