參考鏈結
#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...