求逆序對數目

2021-08-30 17:58:08 字數 1303 閱讀 6772

設計乙個平均時間為o(n

logn

)o(nlogn)

o(nlog

n)的演算法,在n(1

<=n

<

=1000

)n(1<=n<=1000)

n(1<=n

<=1

000)

個元素的陣列中尋找逆序對數目

這裡介紹分治的思想,用歸併對陣列進行排序,在排序的過程中,即可順便將逆序對數目求出來

首先,不斷地二分這個陣列,直到最小,然後歸併兩邊

歸併時,需要注意的是兩邊的陣列一定是順序的,因為二分陣列已經到最小了,同時,返回後,以後歸併時兩邊剛好是之前已經排好序的部分

同時遍歷一遍左右兩邊,用 i

ii 和 j

jj 當做兩邊遍歷的指標,用 k

kk 作為排序好的陣列的指標

由於兩邊都是排好序的,所以對每個 i

ii ,當a[i

]>a[

j]

a[i] > a[j]

a[i]

>a[

j],第 i

ii 個到第 mid

midmi

d 個(左邊剩餘的元素)與第 j

jj 個都滿足逆序,記錄到 ans

ansan

s 中,將a[j

]a[j]

a[j]

記錄到新陣列中,j++

j++j+

+ 兩邊遍歷結束之後,若有一邊( i

ii 或 j

jj )還沒有遍歷完,則直接將剩餘的元素記錄到新陣列中,因為這些元素肯定都是最大的,並且我們也已經記錄了其中逆序的情況(不論是 i

ii 還是 j

jj )

最後排好序的陣列變成原陣列,完成這一次歸併與逆序的統計

#includeusing namespace std;

typedef long long ll;

int ans;

void merge(int a, int l, int mid, int r)

if (i > mid)

for(int q=j; q<=r; q++)

temp[k++] = a[q];

else

for(int q=i; q<=mid; q++)

temp[k++] = a[q];

for(int p=l; p<=r; p++) a[p] = temp[p];

}void merge_sort(int a, int l, int r)

}int main()

求逆序對數目

題目描述 給定乙個序列 a1,a2,a na 1,a 2,a n a1 a2 an 如果存在 a i aj a i a j ai aj 且 i i j 那麼我們稱之為逆序對的,求逆序對的數目。輸入第一行為 n nn,表示序列長度,接下來的 n nn 行,第 i 1 i 1i 1 行表示序列中的第 i...

分治法求逆序對數目

設a 1.n 是乙個包含n個不同整數的陣列。如果在ia j 則 i,j 就稱為a中的乙個逆序對 inversion 給出乙個演算法,確定n個元素的任何排列中逆序對的書目。時間複雜度為o nlgn 分治法求解思路 分解 將陣列a 1.n 分為兩個子串行a 1.p 和a p 1,n 二分法將其分解。解決...

線段樹 離散化 求逆序對數目

題目如下 第三題 lyp 的密碼 lyp 題目描述 眾所周知,lyp 喜歡以用各種方式折磨別人為樂,這次,他趁 wars 不在時在他的電腦上 掛了一把神奇的鎖,這把鎖需要一串巨長無比的數字密碼才可以解開,這 個密碼由 lyp 自 己保管,這樣 wars 就沒法 kingdom rush 了。但 wa...