基本演算法模板

2021-09-25 23:27:45 字數 2773 閱讀 7476

一、快速排序演算法模板

void quick_sort(int q, int l, int r)

quick_sort(q, l, j), quick_sort(q, j + 1, r);

}

二、歸併排序演算法模板

void merge_sort(int q, int l, int r)

三、整數二分演算法模板

bool check(int x)  // 檢查x是否滿足某種性質

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

int bsearch_1(int l, int r)

return l;

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

int bsearch_2(int l, int r)

return l;

}

四、浮點數二分演算法模板

bool check(double x)  // 檢查x是否滿足某種性質

double bsearch_3(double l, double r)

return l;

}

五、高精度加法

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

vectoradd(vector&a, vector&b)

if (t) c.push_back(t);

return c;

}

六、高精度減法

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

vectorsub(vector&a, vector&b)

while (c.size() > 1 && c.back() == 0) c.pop_back();

return c;

}

七、高精度乘低精度

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

vectormul(vector&a, int b)

return c;

}

八、高精度除以低精度

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

vectordiv(vector&a, int b, int &r)

reverse(c.begin(), c.end());

while (c.size() > 1 && c.back() == 0) c.pop_back();

return c;

}

九、一維字首和

s[i] = a[1] + a[2] + ... a[i]

a[l] + ... + a[r] = s[r] - s[l - 1]

十、二維字首和

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]

一、一維差分

給區間[l, r]中的每個數加上c:b[l] += c, b[r + 1] -= c
十二、 二維差分

給以(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

三、位運算

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

返回n的最後一位1:lowbit(n) = n & -n

四、雙指標演算法

for (int i = 0, j = 0; i < n; i ++ )

常見問題分類:

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

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

五、離散化

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

sort(alls.begin(), alls.end()); // 將所有值排序

alls.erase(unique(alls.begin(), alls.end()), alls.end()); // 去掉重複元素

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

int find(int x) // 找到第乙個大於等於x的位置

return r + 1; // 對映到1, 2, ...n

}

五、區間合併

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

void merge(vector&segs)

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

}else ed = max(ed, seg.second);

if (st != -2e9) res.push_back();

segs = res;

}

演算法競賽 基本模板

平時用到的標頭檔案,一些測試語句,所有的標頭檔案都是曾經用到過的,競賽用到過得標頭檔案也都寫了出來,空格以上表示c11才能支援 某些oj不支援c11 include include include include include include include include include inc...

dinic 演算法 基本思想及其模板

網路流博大精深 sideman語 乙個基本的網路流問題 感謝whd的大力支援 最早知道網路流的內容便是最大流問題,最大流問題很好理解 解釋一定要通俗 如右圖所示,有乙個管道系統,節點,有向管道,即有向圖一張.1 是源點,有無限的水量,4 是匯點,管道容量如圖所示.試問 4 點最大可接收的水的流量?這...

匈牙利演算法模板 KM演算法模板

匈牙利演算法模板 時間複雜度為o ve v為二分圖左邊的頂點數,e為二分圖中邊的數目 include includeconst int maxn 1010 const int maxm 20010 const int max 10001 const int inf 1000000000 int li...