數列的逆序數可以使用歸併排序求解,亦可以使用樹狀陣列解決。現在獻上兩題,用樹狀陣列求解逆序數。
poj 2299 ultra-quicksort
大意:乙個排列經過多少次交換能夠成為排好序的結果。
分析:之前用歸併排序做過,
這次練習資料結構。離散(對映)+樹狀陣列
例如:1 9 8 4 5 ---> 1 5 4 2 3
依據數值的大小重新確定值,節省空間。
接著就是插入確定逆序:
_ _ _ _ _
1 _ _ _ _ (1~0)
1 _ _ _ 1 (5~3)
1 _ _ 1 1 (4~2)
1 1 _ 1 1 (2~0)
1 1 1 1 1 (3~0)
統計數字前面的空格總和——逆序
最後相加即可。
#include #include #include #include using namespace std;
const int n=5e5+10;
typedef long long ll;
int d[n]; // disperse array
ll c[n];
struct nodea[n];
int cmp(node t1,node t2)
return ans;
}int main()a[n];
int cmp(node t1,node t2)
return ans;
}int main()
sort(a,a+len,cmp);
for(int i=0;imemset(c,0,sizeof(c));
ll ans=0;
for(int i=1;i<=len;i++)
ans=ans+d[i]-sum(d[i]); //逆序數
//cout<}
printf("%lld\n",ans);
}return 0;
}
樹狀陣列求解逆序數(SOJ2309)
2012 07 20 20 04 48 soj2309 這是我過的第一道樹狀陣列的題,而且是用來解逆序數的。關於樹狀陣列和陣列的離散化問題,請見 個人覺得這篇博文寫得很好。其實演算法所用的還是樹狀陣列的三個經典函式,只不過稍微改動。include includeusing namespace std...
樹狀陣列求逆序數
逆序數就是數中各位在它前面有多少個數比它大,求出這些元素個數之和。今天看了個樹狀陣列,可以很好的解決這個問題,普通方法需要o n 2 複雜度,用樹狀陣列只需要o nlongn 樹狀陣列實際上還是乙個陣列,只不過它的每個元素儲存了跟原來陣列的一些元素相關的結合值。若a為原陣列,定義陣列c為樹狀陣列。c...
樹狀陣列求逆序數
chikachika說希望和我一起做學園偶像的時候,我真的很開心。watanabeyouwatanabeyou 曜是千歌的青梅竹馬,但是aqoursaqours成立以後,千歌似乎總是與梨子在一起,而把曜冷落了。為了讓千歌知曉自己的心意,曜醬決定做一件大事!她決定把乙個給定的11 nn的排列 1 ai...