快速排序算法模板

  1. void quick_sort(int q[], int l, int r)
  2. {
  3. if (l >= r) return;
  4. int i = l - 1, j = r + 1, x = q[l + r >> 1];
  5. while (i < j)
  6. {
  7. do i ++ ; while (q[i] < x);
  8. do j -- ; while (q[j] > x);
  9. if (i < j) swap(q[i], q[j]);
  10. }
  11. quick_sort(q, l, j), quick_sort(q, j + 1, r);
  12. }

归并排序算法模板

  1. void merge_sort(int q[], int l, int r)
  2. {
  3. if (l >= r) return;
  4. int mid = l + r >> 1;
  5. merge_sort(q, l, mid);
  6. merge_sort(q, mid + 1, r);
  7. int k = 0, i = l, j = mid + 1;
  8. while (i <= mid && j <= r)
  9. if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
  10. else tmp[k ++ ] = q[j ++ ];
  11. while (i <= mid) tmp[k ++ ] = q[i ++ ];
  12. while (j <= r) tmp[k ++ ] = q[j ++ ];
  13. for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
  14. }

整数二分算法模板

  1. bool check(int x) {/* ... */} // 检查x是否满足某种性质
  2. // 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
  3. int bsearch_1(int l, int r)
  4. {
  5. while (l < r)
  6. {
  7. int mid = l + r >> 1;
  8. if (check(mid)) r = mid; // check()判断mid是否满足性质
  9. else l = mid + 1;
  10. }
  11. return l;
  12. }
  13. // 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
  14. int bsearch_2(int l, int r)
  15. {
  16. while (l < r)
  17. {
  18. int mid = l + r + 1 >> 1;
  19. if (check(mid)) l = mid;
  20. else r = mid - 1;
  21. }
  22. return l;
  23. }

前缀与差分

一维前缀和 —— AcWing 795. 前缀和

  1. S[i] = a[1] + a[2] + ... a[i]
  2. a[l] + ... + a[r] = S[r] - S[l - 1]

二维前缀和 —— AcWing 796. 子矩阵的和

  1. S[i, j] = ij列格子左上部分所有元素的和
  2. 以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为:
  3. S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] + S[x1 - 1, y1 - 1]

一维差分 —— 模板题 AcWing 797. 差分

  1. 给区间[l, r]中的每个数加上cB[l] += c, B[r + 1] -= c

二维差分 —— 模板题 AcWing 798. 差分矩阵

  1. 给以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵中的所有元素加上c
  2. S[x1, y1] += c, S[x2 + 1, y1] -= c, S[x1, y2 + 1] -= c, S[x2 + 1, y2 + 1] += c

双指针算法 —— 模板题 AcWIng 799. 最长连续不重复子序列

  1. for (int i = 0, j = 0; i < n; i ++ )
  2. {
  3. while (j < i && check(i, j)) j ++ ;
  4. // 具体问题的逻辑
  5. }
  6. 常见问题分类:
  7. (1) 对于一个序列,用两个指针维护一段区间
  8. (2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作

更多

常用代码模板 —— 数据结构

常用代码模板 —— 搜索与图论

常用代码模板 —— 数学知识