演算法基礎模板(一)

2021-10-03 18:41:01 字數 4119 閱讀 3642

快速排序演算法模板:

模板題:acwing 快速排序 、 acwing 第k個數

模板:

void

quick_sort

(int q,

int l,

int r)

quick_sort

(q, l, j)

;quick_sort

(q, j +

1, r)

;}

歸併排序演算法模板:

模板題:acwing 歸併排序

模板:

void

merge_sort

(int q,

int l,

int r)

整數二分演算法模板:

模板題:acwing 數的範圍

模板:

bool

check

(int x)

// 檢查x是否滿足某種性質

// 區間[l, r]被劃分成[l, mid]和[mid + 1, r]時使用:

intbsearch_1

(int l,

int r)

return l;

}// 區間[l, r]被劃分成[l, mid - 1]和[mid, r]時使用:

intbsearch_2

(int l,

int r)

return l;

}

浮點數二分演算法模板:

模板題:acwing 數的三次方根

模板:

bool

check

(double x)

// 檢查x是否滿足某種性質

double

bsearch_3

(double l,

double r)

return l;

}

高精度加法:

模板題:acwing 高精度加法

模板:

// c = a + b, a >= 0, b >= 0

vector<

int>

add(vector<

int>

&a, vector<

int>

&b)if

(t) c.

push_back

(t);

return c;

}

高精度減法:

模板題:acwing 高精度減法

模板:

// c = a - b, 滿足a >= b, a >= 0, b >= 0

vector<

int>

sub(vector<

int>

&a, vector<

int>

&b)while

(c.size()

>

1&& c.

back()

==0) c.

pop_back()

;return c;

}

高精度乘低精度:

模板題:acwing 高精度乘法

模板:

// c = a * b, a >= 0, b > 0

vector<

int>

mul(vector<

int>

&a,int b)

return c;

}

高精度除以低精度:

模板題:acwing 高精度除法

模板:

// a / b = c ... r, a >= 0, b > 0

vector<

int>

div(vector<

int>

&a,int b,

int&r)

reverse

(c.begin()

, c.

end())

;while

(c.size()

>

1&& c.

back()

==0) c.

pop_back()

;return c;

}

一維字首和:

模板題:acwing 字首和

模板:

s[i]

= s[i-1]

+ a[i]

= a[1]

+ a[2]

+...

+ a[i]

;a[l]+.

..+ a[r]

= s[r]

- s[l-1]

;

二維字首和:

模板題:acwing 子矩陣的和

模板:

s[i, j]

= 第i行j列格仔左上部分所有元素的和

以(x1, y1)為左上角,(x2, y2)為右下角的子矩陣的和為:

s[x2, y2]

- s[x1 -

1, y2]

- s[x2, y1 -1]

+ s[x1 -

1, y1 -

1]

一維差分:

模板題:acwing 差分

模板:

給區間[l, r]中的每個數加上c:b[l]

+= c, b[r +1]

-= c

二維差分:

模板題:acwing 差分矩陣

模板:

給以(x1, y1)為左上角,(x2, y2)為右下角的子矩陣中的所有元素加上c:

s[x1, y1]

+= c, s[x2 +

1, y1]

-= c, s[x1, y2 +1]

-= c, s[x2 +

1, y2 +1]

+= c;

位運算:

模板題:acwing 二進位制中1的個數

模板:

求n的第k位數字: n >> k &

1返回n的最後一位1:lowbit

(n)= n &

-n-n =

~n+1

;

雙指標演算法:

模板題:acwing 最長連續不重複子序列 、 acwing 陣列元素的目標和

模板:

for

(int i =

0, j =

0; i < n; i ++

)常見問題分類:

(1) 對於乙個序列,用兩個指標維護一段區間

(2) 對於兩個序列,維護某種次序,比如歸併排序中合併兩個有序序列的操作

離散化:

模板題:acwing 區間和

模板:

vector<

int> alls;

// 儲存所有待離散化的值

sort

(alls.

begin()

, alls.

end())

;// 將所有值排序

alls.

erase

(unique

(alls.

begin()

, alls.

end())

, alls.

end())

;// 去掉重複元素

// 二分求出x對應的離散化的值

intfind

(int x)

// 找到第乙個大於等於x的位置

return r +1;

// 對映到1, 2, ...n

}

區間合併:

模板題:acwing 區間合併

模板:

// 將所有存在交集的區間合併

void

merge

(vector

&segs));

st = seg.first, ed = seg.second;

}else ed =

max(ed, seg.second);if

(st !=

-2e9

) res.

push_back()

; segs = res;

}

網路流基礎演算法模板

網路流是一種非常玄妙的演算法,被廣泛地用於各種有權值存在或一對多的匹配問題中。而網路流又有許多數學性質,比如最大流等於最小割等等。本篇主要介紹常用的dinic最大流演算法。網路,就是一張有點有邊圖。其中有兩個特殊的點 源點和匯點。網路流中的每一條邊就好比一條水管,容量就好比是這個水管的粗細。我們要求...

演算法基礎(一) 基礎

學習了那麼久,一直沒有好好寫寫演算法。下面我簡單描述一下演算法方面知識。在已證明演算法正確性的前提下,評價演算法的好壞主要是關注演算法在時間和 空間上效能的優劣。演算法時間效能 的分析是通過計算 演算法時間複雜度 實現的,其關鍵就是計算演算法的執行時間。乙個演算法的執行時間,就是演算法中每條語句的執...

演算法基礎 一

一些有用的演算法 數值演算法,比如隨機化 分解因式 處理質數 數值積分 熟練操作常見的資料結構的方法,比如堆 樹 平衡樹 b數 排序和搜尋 網路演算法,比如最短路徑 生成樹 拓撲排列和流計算 一些常規的問題解決技巧 暴力或者窮舉搜尋 分治法回溯法 遞迴分支界限 貪心演算法和爬山法 最小花費演算法 縮...