voidquick_sort(vector<int>& q, int l, int r){ if (l >= r) return; int x = q[(l + r) >> 1], i = l - 1, j = r + 1; while (i < j) { do i++; while (q[i] < x); do j--; while (q[j] > x); if (i < j) swap(q[i], q[j]); } quick_sort(q, l, j); quick_sort(q, j + 1, r); }
归并排序与逆序对
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
longlongmerge_sort(vector<int>& q, int l, int r){ if (l >= r) return0; int mid = (l + r) >> 1; longlong res = merge_sort(q, l, mid) + merge_sort(q, mid + 1, r); vector<int> tmp; int i = l, j = mid + 1; while (i <= mid && j <= r) { if (q[i] <= q[j]) tmp.push_back(q[i++]); else { res += mid - i + 1; tmp.push_back(q[j++]); } } while (i <= mid) tmp.push_back(q[i++]); while (j <= r) tmp.push_back(q[j++]); for (int k = l, t = 0; k <= r; k++, t++) q[k] = tmp[t]; return res; }
整数二分
1 2 3 4 5 6 7 8 9
intbsearch_left(vector<int>& a, int x){ int l = 0, r = (int)a.size() - 1; while (l < r) { int mid = (l + r) >> 1; if (a[mid] >= x) r = mid; else l = mid + 1; } return a[l] == x ? l : -1; }
浮点二分
1 2 3 4 5 6 7 8 9
doublecubic_root(double n){ double l = -100, r = 100; while (r - l > 1e-8) { double mid = (l + r) / 2; if (mid * mid * mid >= n) r = mid; else l = mid; } return l; }
高精度加减乘除
1 2 3 4 5 6 7 8 9 10 11
vector<int> add(vector<int>& A, vector<int>& B){ vector<int> C; int t = 0; for (int i = 0; i < (int)A.size() || i < (int)B.size() || t; i++) { if (i < (int)A.size()) t += A[i]; if (i < (int)B.size()) t += B[i]; C.push_back(t % 10); t /= 10; } return C; }
前缀和与差分
1 2 3 4 5 6 7 8
// 1-indexed for (int i = 1; i <= n; i++) s[i] = s[i - 1] + a[i]; intquery(int l, int r){ return s[r] - s[l - 1]; }
voidinsert(vector<int>& b, int l, int r, int c){ b[l] += c; b[r + 1] -= c; }
双指针
1 2 3 4 5 6
int res = 0; for (int i = 0, j = 0; i < n; i++) { cnt[a[i]]++; while (cnt[a[i]] > 1) cnt[a[j++]]--; res = max(res, i - j + 1); }
sort(segs.begin(), segs.end()); vector<pair<int,int>> res; int st = -2e9, ed = -2e9; for (auto [l, r] : segs) { if (ed < l) { if (st != -2e9) res.push_back({st, ed}); st = l, ed = r; } else ed = max(ed, r); } if (st != -2e9) res.push_back({st, ed});