Acwing 基礎課 基礎演算法 歸併排序

2021-10-19 17:40:14 字數 1463 閱讀 6698

參考鏈結

#include

const

int n =

100005

;int a[n]

;int t[n]

;voidms(

int l,

int r)

while

(i <= mid)

t[k++

]= a[i++];

while

(j <= r)

t[k++

]= a[j++];

for(

int i = l;i <= r;i++)}

intmain()

題目鏈結

參考鏈結

題目大意

給定乙個長度為n的整數數列,請你計算數列中的逆序對的數量。

逆序對的定義如下:對於數列的第 i 個和第 j 個元素,如果滿足 i < j 且 a[i] > a[j],則其為乙個逆序對;否則不是。

解題思路

分治後的每一層合併中順便求出逆序對數量是這個題想法的由來。

while

(i <= mid && j <= r)

if(q[i]

<= q[j]

) tmp[k ++

]= q[i ++];

else

從而:

(1)只要通過歸併排序,將每段構成 【l…mid】【mid+1,…r】的前後各自公升序的序列,對於l <= i <= mid,mid+1 <= j <= r,只要發現 a[i] > a[j],那麼對於a[j],逆序對個數就是mid - i + 1【在前面的公升序序列中,a[i]大於a[j],而存在 mid - i 個數大於a[i],所以共有 mid - i + 1個數大於a[j],存在mid - i + 1個逆序對】

(2)而每一層的合併操作又構成了前後各自公升序的兩個序列,又方便了下一次逆序對的計算。

#include

using

namespace std;

typedef

long

long ll;

const

int n =

100005

;int a[n]

,t[n]

;ll ans =0;

voidms(

int l,

int r)

else

}while

(i <= mid) t[k++

]= a[i++];

while

(j <= r) t[k++

]= a[j++];

for(

int i = l;i <= r;i++)}

intmain()

AcWing 演算法基礎課 動態規劃

1 揹包問題 1 01揹包 每件物品僅用一次 可以做空間優化 dp j max dp j dp j v i w i 0,1揹包狀態均是從前一迴圈的狀態轉移 2 完全揹包 每件物品可以用無限次 完全揹包的狀態可以從當前迴圈的狀態轉移,進行優化 3 多重揹包 每件物品有不同的數量限制 可以對物品的數量限...

Acwing演算法基礎課知識點

知識點 基礎演算法 模板鏈結常用 模板1 基礎演算法 排序 二分高精度 字首和與差分 雙指標演算法 位運算離散化 區間合併 資料結構 模板鏈結常用 模板2 資料結構 鍊錶與鄰接表 樹與圖的儲存 棧與佇列 單調佇列 單調棧 kmptrie 並查集堆 hash表 c stl使用技巧 搜尋與圖論 模板鏈結...

Acwing 基礎課 基礎演算法 離散化 區間合併

題目鏈結 題目大意 假定有乙個無限長的數軸,數軸上每個座標上的數都是0。現在,我們首先進行 n 次操作,每次操作將某一位置x上的數加c。接下來,進行 m 次詢問,每個詢問包含兩個整數l和r,你需要求出在區間 l,r 之間的所有數的和。109 x 109 1 n,m 105,109 l r 109,1...