快速排序演算法模板:
模板題: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數 排序和搜尋 網路演算法,比如最短路徑 生成樹 拓撲排列和流計算 一些常規的問題解決技巧 暴力或者窮舉搜尋 分治法回溯法 遞迴分支界限 貪心演算法和爬山法 最小花費演算法 縮...