樹狀陣列求解逆序數

2021-07-10 14:46:25 字數 1029 閱讀 3970

數列的逆序數可以使用歸併排序求解,亦可以使用樹狀陣列解決。現在獻上兩題,用樹狀陣列求解逆序數。

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...