1. 程式人生 > >【樹狀陣列】 洛谷1908 逆序對

【樹狀陣列】 洛谷1908 逆序對

題目:逆序對

思路:
很久前寫的權值線段樹,因為luogu的資料更新了,不再保證每個數不相等,所以不能AC了。
然後又用樹狀陣列做了一遍,感覺要更適用一些。

程式碼:

#include<bits/stdc++.h>
using namespace std;

#define maxn 500000
#define read(x) scanf("%d",&x)
#define lowbit(x) (x&-x)

struct Pair {
	int x,y;
	Pair(){}
	Pair(int xx,int yy) {x=xx,y=yy;}
	bool operator <
(const Pair& oth) const { return x<oth.x; } }; int n; int a[maxn+5]; Pair mp[maxn+5]; int b[maxn+5]; void add(int x) { while(x<=n) { b[x]++; x+=lowbit(x); } } int find(int x) { int s=0; while(x>0) { s+=b[x]; x-=lowbit(x); } return s; } int main() { read(n); for(int
i=1;i<=n;i++) read(a[i]),mp[i]=Pair(a[i],i); int cc=0; sort(mp+1,mp+n+1); for(int i=1;i<=n;i++) { if(mp[i].x!=mp[i-1].x) cc++; a[mp[i].y]=cc; } long long ans=0; for(int i=n;i>=1;i--) { ans+=find(a[i]-1); add(a[i]); } printf("%lld",ans); return 0; }