樹狀陣列求逆序對【TSOJ 1232】
阿新 • • 發佈:2018-11-21
傳送門就不傳送了,你們也傳送不進來;
就是一個求逆序對的裸題;
直接離散化+樹狀陣列就完事了。
樹狀陣列區間更新和區間查詢寫 這題總是不對;
我也不知道為啥,過幾天再研究吧。
單點更新的樹狀陣列寫對了;
總之就是如果用樹狀陣列的話一定要離散化。
下面是程式碼:
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5+7; int sum[maxn]; int a[maxn],b[maxn]; int n; void init() { memset(sum,0,sizeof(sum)); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); } void add(int p,int x) { for(int i=p;i<=n;i+=(i & -i)) { sum[i] += x; } } int query(int p) { int ans = 0; for(int i=p;i;i-=(i & -i)) { ans += sum[i]; } return ans; } int solve() { int ans = 0; for(int i=0;i<n;i++) { ans += i-query(a[i]); add(a[i],1); } return ans; } int main() { while(cin>>n) { init(); for(int i=0;i<n;i++) { cin>>a[i]; b[i] = a[i]; } sort(b,b+n); int m = unique(b,b+n)-b; for(int i=0;i<n;i++) { a[i] = lower_bound(b,b+m,a[i])-b+1; } cout<<solve()<<endl; } return 0; }