設計乙個平均時間為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...