簡記 在nlogn時間計算左 右逆序數計數

2021-08-17 07:15:13 字數 2356 閱讀 2983

π 為乙個排列,如果

i<

j 而且π(

i)>π(

j),這個序對(i

,j) 或這一對元素(π

(i),

π(j)

) 被稱為是

π 的乙個逆序。

逆序數是逆序集的基數,它常用於量度排列或序列的已排序程度

如果要求出乙個排序的逆序數,我們可以通過歸併排序樹狀陣列的方式實現。但有些題目要求我們求出排序的左逆序計數右逆序計數時,就要改造一下常見方法

逆序向量

v : v(

i)是在π

之中的i 之前,元素較

i大的數量 v(

i)=#

左逆序計數 l

: l(

i)在

π(i)

中的在 π

(i) 之前,元素較 π

(i) 大的數量 l

(i)=

#

右逆序計數 r

: r(

i)在

π(i)

中的在 π

(i) 之後,元素較 π

(i) 小的數量 r

(i)=

#

可知存在 ∑

v(i)

=∑l(

i)=∑

r(i)

#include 

using

namespace

std;

const

int n = 1e5+5;

struct nodea[n], tmp[n];

int ans[n];

int n;

void mergesort(int l, int r)

}while(lp < mid) tmp[t++] = a[lp++];

while(rp < r) tmp[t++] = a[rp++];

for(int i = l; i < r; i++)

a[i] = tmp[i];

}}int main()

mergesort(0, n);

for(int i = 0; i < n; i++)

return

0;}

#include 

using

namespace

std;

const

int n = 1e5+5;

int n;

int a[n], bit[n];

void add(int x)

int sum(int x)

int main()

return

0;}

#include 

using

namespace

std;

const

int n = 1e5+5;

struct nodea[n], tmp[n];

int ans[n];

int n;

void mergesort(int l, int r)

else tmp[t++] = a[rp++];

}while(lp < mid)

while(rp < r) tmp[t++] = a[rp++];

for(int i = l; i < r; i++)

a[i] = tmp[i];

}}int main()

mergesort(0, n);

for(int i = 0; i < n; i++)

return

0;}

#include 

using

namespace

std;

const

int n = 1e5+5;

int n;

int a[n], bit[n], ans[n];

void add(int x)

int sum(int x)

int main()

for(int i = 0; i < n; i++)

printf("%d%c", sum(a[i]), i==n-1?'\n':' ');

return

0;}

參考資料:

離散時間傅利葉變換(DTFT)簡記

本文適合在看完 離散訊號與模擬訊號之間的頻率關係 由模擬訊號取樣得到的離散訊號 這篇博文之後閱讀,這樣才能理解後面的前因後果,也就是我的邏輯!下面先簡單粗暴地介紹一下dtft 性質只列了一條,因為我想討論的內容和這個相關,這不是一篇科普性的博文,所以沒有正正經經地把性質列出來,背景說出來,那樣不如去...

時間複雜度為nlogn的演算法總結

在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序 示例 1 輸入 4 2 1 3 輸出 1 2 3 4 示例 2 輸入 1 5 3 4 0 輸出 1 0 3 4 5 題解題目要求時間空間複雜度分別為o nlogn 和o 1 根據時間複雜度我們自然想到二分法,從而聯想到歸併排序 ...

資料結構 歸併排序 nlogn,空間換時間

歸併排序 歸併排序,首先把乙個陣列中的元素,按照某一方法,先拆分了 之後,按照一定的順序各自排列,然後再歸併到一起,使得歸併後依然是有一定順序的 歸併排序平均時間複雜度 o nlogn 最壞時間複雜度 o nlogn 輔助儲存o n 歸併排序,首先把乙個陣列中的元素,按照某一方法,先拆分了 之後,按...