快排
void qsort(std::vector<int> &arr, int l, int r){if(l >= r) return;int i = l - 1, j = r + 1, mid = arr[l + r >> 1];while(i < j){do i ++; while(arr[i] < mid);do j --; while(arr[j] > mid);if(i < j)std::swap(arr[i], arr[j]);} qsort(arr, l, j);qsort(arr, j + 1, r);/*qsort(arr, l, i - 1);qsort(arr, i, r); 防止越界*/
}
归并
void merge_sort(int q[], int l, int r)
{if (l >= r) return;int mid = l + r >> 1;merge_sort(q, l, mid), merge_sort(q, mid + 1, r);int k = 0, i = l, j = mid + 1;while (i <= mid && j <= r)if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];else tmp[k ++ ] = q[j ++ ];while (i <= mid) tmp[k ++ ] = q[i ++ ];while (j <= r) tmp[k ++ ] = q[j ++ ];for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
}
二分
//std::lower_bound:返回指向第一个不小于(≥)目标值的元素的迭代器
//std::upper_bound:返回指向第一个大于(>)目标值的元素的迭代器//当我们将区间 [l, r] 划分为 [l, mid] 和 [mid+1, r]
int bsearch_1(int l,int r)
{while(l < r){mid = (l + r) >> 1;if(check(mid)) r = mid;else l = mid+1;}return l;
}
//当我们将区间 [l, r] 划分成 [l, mid-1] 和 [mid, r] 时,其更新操作是 r = mid-1 或者 l = mid ,此时为了防止死循环,计算 mid 时需要加 1 int bsearch_2(int l,int r)
{while(l < r){mid = (l + r + 1) >> 1;if(check(mid)) r = mid-1;else l = mid;}return l;
}
高精度(a > 0, b > 0)
加
#include <iostream>
#include <vector>using namespace std;vector<int> add(vector<int> &A, vector<int> &B)
{if (A.size() < B.size()) return add(B, A);vector<int> C;int t = 0;for (int i = 0; i < A.size(); i ++ ){t += A[i];if (i < B.size()) t += B[i];C.push_back(t % 10);t /= 10;}if (t) C.push_back(t);return C;
}int main()
{string a, b;vector<int> A, B;cin >> a >> b;for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');for (int i = b.size() - 1; i >= 0; i -- ) B.push_back(b[i] - '0');auto C = add(A, B);for (int i = C.size() - 1; i >= 0; i -- ) cout << C[i];cout << endl;return 0;
}
减
#include <iostream>
#include <vector>using namespace std;bool cmp(vector<int> &A, vector<int> &B)
{if (A.size() != B.size()) return A.size() > B.size();for (int i = A.size() - 1; i >= 0; i -- )if (A[i] != B[i])return A[i] > B[i];return true;
}vector<int> sub(vector<int> &A, vector<int> &B)
{vector<int> C;for (int i = 0, t = 0; i < A.size(); i ++ ){t = A[i] - t;if (i < B.size()) t -= B[i];C.push_back((t + 10) % 10);if (t < 0) t = 1;else t = 0;}while (C.size() > 1 && C.back() == 0) C.pop_back();return C;
}int main()
{string a, b;vector<int> A, B;cin >> a >> b;for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');for (int i = b.size() - 1; i >= 0; i -- ) B.push_back(b[i] - '0');vector<int> C;if (cmp(A, B)) C = sub(A, B);else C = sub(B, A), cout << '-';for (int i = C.size() - 1; i >= 0; i -- ) cout << C[i];cout << endl;return 0;
}
乘
#include <bits/stdc++.h>
using namespace std;vector <int> mul(vector <int> &A, vector <int> &B) {vector <int> C(A.size() + B.size(), 0);for (int i = 0; i < A.size(); i ++) {for (int j = 0; j < B.size(); j ++){C[i + j] += A[i] * B[j];C[i + j + 1] += C[i + j] / 10;C[i + j] %= 10;}}while (C.size() > 1 && C.back() == 0) C.pop_back();return C;
}// 应用部分
vector <int> A,B,C;
string CA,CB; // 字符串存储
int main(){cin >> CA >> CB;for (int i = CA.size() - 1;i >= 0;i--) A.push_back(CA[i] - '0');for (int i = CB.size() - 1;i >= 0;i--) B.push_back(CB[i] - '0');C = mul(A,B);for (int i = C.size() - 1;i >= 0;i--) cout << C[i]; cout << endl;return 0;
}
除
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;vector<int> div(vector<int> &A, int b, int &r)
{vector<int> C;r = 0;for (int i = A.size() - 1; i >= 0; i -- ){r = r * 10 + A[i];C.push_back(r / b);r %= b;}reverse(C.begin(), C.end());while (C.size() > 1 && C.back() == 0) C.pop_back();return C;
}int main()
{string a;vector<int> A;int B;cin >> a >> B;for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');int r;auto C = div(A, B, r);for (int i = C.size() - 1; i >= 0; i -- ) cout << C[i];cout << endl << r << endl;return 0;
}
位运算
//获取最后一位1
int lowbit(int x){return x&-x;
}
/*5: 101 & 011 = 001
*/
前缀和
一维
#include <iostream>using namespace std;const int N = 100010;int n, m;
int a[N], s[N];int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);for (int i = 1; i <= n; i ++ ) s[i] = s[i - 1] + a[i]; // 前缀和的初始化while (m -- ){int l, r;scanf("%d%d", &l, &r);printf("%d\n", s[r] - s[l - 1]); // 区间和的计算}return 0;
}
二维
#include <iostream>using namespace std;const int N = 1010;int n, m, q;
int s[N][N];int main()
{scanf("%d%d%d", &n, &m, &q);for (int i = 1; i <= n; i ++ )for (int j = 1; j <= m; j ++ )scanf("%d", &s[i][j]);for (int i = 1; i <= n; i ++ )for (int j = 1; j <= m; j ++ )s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];while (q -- ){int x1, y1, x2, y2;scanf("%d%d%d%d", &x1, &y1, &x2, &y2);printf("%d\n", s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1]);}return 0;
}
差分
一维
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N];
int main()
{int n, m;scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++){scanf("%d", &a[i]);b[i] = a[i] - a[i - 1]; //构建差分数组}int l, r, c;while (m--){scanf("%d%d%d", &l, &r, &c);b[l] += c; //将序列中[l, r]之间的每个数都加上cb[r + 1] -= c;}for (int i = 1; i <= n; i++){a[i] = b[i] + a[i - 1]; //前缀和运算printf("%d ", a[i]);}return 0;
}
二维
#include <iostream>
using namespace std;const int N = 1e3 + 10;
int n, m, q;
int a[N][N], b[N][N];void insert(int x1, int y1, int x2, int y2, int c)
{b[x1][y1] += c;b[x2 + 1][y1] -= c;b[x1][y2 + 1] -= c;b[x2 + 1][y2 + 1] += c;
}int main(){scanf("%d%d%d", &n, &m, &q); // n行m列,q次for(int i = 1; i <= n; i++){for (int j =1; j <= m; j++){scanf("%d", &a[i][j]);}}// 构建差分数组for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){b[i][j] = a[i][j] - a[i - 1][j] - a[i][j - 1] + a[i - 1][j - 1];}}while (q--){int x1, y1, x2, y2, c;scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &c);insert(x1, y1, x2, y2, c);}// 二维前缀和for(int i = 1; i <= n; i++){for (int j =1; j <= m; j++){a[i][j] = a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1] + b[i][j];}}for(int i = 1; i <= n; i++){for (int j =1; j <= m; j++){printf("%d ", a[i][j]);}printf("\n");}return 0;
}
离散化
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;typedef pair<int, int> PII;const int N = 300010;int n, m;
int a[N], s[N];vector<int> alls;
vector<PII> add, query;int find(int x) //二分快速查找索引
{int l = 0, r = alls.size() - 1;while (l < r){int mid = l + r >> 1;if (alls[mid] >= x) r = mid;else l = mid + 1;}return r + 1;
}int main()
{cin >> n >> m;for (int i = 0; i < n; i ++ ){int x, c;cin >> x >> c;add.push_back({x, c});alls.push_back(x);}for (int i = 0; i < m; i ++ ){int l, r;cin >> l >> r;query.push_back({l, r});alls.push_back(l);alls.push_back(r);}// 去重sort(alls.begin(), alls.end());alls.erase(unique(alls.begin(), alls.end()), alls.end());// 处理插入for (auto item : add){int x = find(item.first);a[x] += item.second;}// 预处理前缀和for (int i = 1; i <= alls.size(); i ++ ) s[i] = s[i - 1] + a[i];// 处理询问for (auto item : query){int l = find(item.first), r = find(item.second);cout << s[r] - s[l - 1] << endl;}return 0;
}