P1908 逆序對
阿新 • • 發佈:2021-07-25
P1908 逆序對 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
樹狀陣列可以幹這個事情
樹樁陣列維護一個下標啦
然後離散化一下,sort,unique,二分確定每一個數在新序列的下標
也就是第i個數大小的排名。
然後算一下有多少個數,拍在他前面且大小排名在它之前。
#include<iostream> #include<cstdio> #include<algorithm> #define int long long using namespace std; int n; int a[5000001]; int b[5000001]; int id[5000001]; int tr[5000001]; inline int lowbit(int x){ return x&(-x); } void add(int x){ for(int i=x;i<=n;i+=lowbit(i)){ tr[i]++; } } int query(int x){ int res=0; for(int i=x;i>0;i-=lowbit(i)){ res+=tr[i]; } return res; } signed main(){ scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%d",&a[i]); b[i]=a[i]; } sort(a+1,a+n+1); int nn=unique(a+1,a+n+1)-a-1; for(int i=1;i<=n;++i){ id[i]=upper_bound(a+1,a+n+1,b[i])-a-1; } int ans=0; for(int i=1;i<=n;++i){ ans+=i-1-query(id[i]); add(id[i]); } cout<<ans; return 0; }