-
快排
#include<iostream> #include<algorithm> using namespace std; const int N = 1e5 + 10; int a[N]; void qsort(int left, int right) { int l = left, r = right; int mid = a[l + r >> 1]; while(l < r) { while(a[l] < mid) l++; while(a[r] > mid) r--; if(l <= r) swap(a[l++], a[r--]); } if(left < r) qsort(left, r); if(l < right) qsort(l, right); } int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; for(int i = 0; i < n; i++) cin >> a[i]; qsort(0, n - 1); for(int i = 0; i < n; i++) cout << a[i] << ' '; return 0; }
-
高精度加法
#include<iostream> #include<algorithm> #include<vector> using namespace std; vector<int> add(vector<int> a, vector<int> b) { vector<int> c; int t = 0; for(int i = 0; i < a.size() || i < b.size(); i++) { if(i < a.size()) 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() { vector<int> a, b; string s1, s2; cin >> s1 >> s2; for(int i = s1.size() - 1; i >= 0; i--) { a.push_back(s1[i] - '0'); } for(int i = s2.size() - 1; i >= 0; i--) { b.push_back(s2[i] - '0'); } auto c = add(a, b); for(int i = c.size() - 1; i >= 0; i--) cout << c[i]; return 0; }
-
高精度减法
#include<iostream> #include<algorithm> #include<vector> using namespace std; vector<int> sub(vector<int> a, vector<int> b) { vector<int> c; int t = 0; for(int i = 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 s1, s2; vector<int> a, b; cin >> s1 >> s2; if(s1.size() < s2.size() || (s1.size() == s2.size() && s1 < s2)) { cout << '-'; swap(s1, s2); } for(int i = s1.size() - 1; i >= 0; i--) a.push_back(s1[i] - '0'); for(int i = s2.size() - 1; i >= 0; i--) b.push_back(s2[i] - '0'); auto c = sub(a, b); for(int i = c.size() - 1; i >= 0; i--) cout << c[i]; return 0; }
-
高精度乘法
#include<iostream> #include<vector> using namespace std; vector<int> mul(vector<int> a, int b) { vector<int> c; int t = 0; for(int i = 0; i < a.size(); i++) { t = t + a[i] * b; c.push_back(t % 10); t /= 10; } while(t) { c.push_back(t % 10); t /= 10; } while(c.size() > 1 && c.back() == 0){ c.pop_back(); } return c; } int main() { string s; int x; vector<int> a; cin >> s >> x; for(int i = s.size() - 1; i >= 0; i--) a.push_back(s[i] - '0'); auto ans = mul(a, x); for(int i = ans.size() - 1; i >= 0; i--) cout << ans[i]; return 0; }
-
高精度除法
#include<iostream> #include<vector> #include<algorithm> using namespace std; vector<int> div(vector<int> a, int b, int& r) { vector<int> c; for(int i = 0; i < a.size(); 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 s; int b; vector<int> a; cin >> s >> b; for(int i = 0; i < s.size(); i++) a.push_back(s[i] - '0'); int r = 0; auto c = div(a, b, r); for(int i = c.size() - 1; i >= 0; i--) cout << c[i]; cout << endl << r; return 0; }
-
一维前缀和
#include<iostream> using namespace std; const int N = 1e5 + 10; int a[N]; int main() { int n, m; ios::sync_with_stdio(false); cin.tie(0); cin >> n >> m; for(int i = 1; i <= n; i++){ int x; cin >> x; a[i] = a[i - 1] + x; } while(m--) { int l, r; cin >> l >> r; cout << a[r] - a[l - 1] << endl; } return 0; }
-
二维前缀和
#include<iostream> using namespace std; const int N = 1010; int a[N][N]; int main() { int n, m, k; ios::sync_with_stdio(false); cin.tie(0); cin >> n >> m >> k; for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { int x; cin >> x; a[i][j] = a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1] + x; } } while(k--) { int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2; cout << a[x2][y2] - a[x1 - 1][y2] - a[x2][y1 - 1] + a[x1 - 1][y1 - 1] << endl; } return 0; }
-
一维拆分
#include<iostream> using namespace std; const int N = 1e5 + 10; int a[N]; void insert(int l, int r, int c) { a[l] += c; a[r + 1] -= c; } int main() { int n, m; cin >> n >> m; for(int i = 1; i <= n; i++) { int x; cin >> x; insert(i, i, x); } while(m--) { int l, r, c; cin >> l >> r >> c; insert(l, r, c); } for(int i = 1; i <= n; i++) { a[i] += a[i - 1]; cout << a[i] << ' '; } return 0; }
-
二维拆分
#include<iostream> using namespace std; const int N = 1010; int a[N][N]; void insert(int x1, int y1, int x2, int y2, int c) { a[x1][y1] += c; a[x2 + 1][y1] -= c; a[x1][y2 + 1] -= c; a[x2 + 1][y2 + 1] += c; } int main() { int n, m, q; cin >> n >> m >> q; for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { int x; cin >> x; insert(i, j, i, j, x); } } while(q--) { int x1, y1, x2, y2, c; cin >> 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]; cout << a[i][j] << ' '; } cout << endl; } return 0; }
-
双指针(最长连续不重复子序列)
#include<iostream> #include<algorithm> using namespace std; const int N = 1e5 + 10; int a[N]; int c[N]; int main() { int n, ans = 0; cin >> n; for(int i = 0; i < n; i++) { cin >> a[i]; } for(int i = 0, j = 0; i < n; i++) { c[a[i]]++; while(c[a[i]] > 1) { c[a[j]]--; j++; } ans = max(ans, i - j + 1); } cout << ans; return 0; }
-
lowbit
#include<iostream> using namespace std; int lowbit(int x) { return x & -x; } int main() { int n; cin >> n; while(n--) { int x; cin >> x; int ans = 0; while(x) { x -= lowbit(x); ans++; } cout << ans << ' '; } return 0; }
-
离散化
#include<iostream> #include<algorithm> #include<vector> using namespace std; const int N = 3e5 + 10; int a[N]; vector<int> point; vector<pair<int, int>> add, query; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, m, x, c, l, r; cin >> n >> m; while(n--) { cin >> x >> c; point.push_back(x); add.push_back({x, c}); } while(m--) { cin >> l >> r; point.push_back(l); point.push_back(r); query.push_back({l, r}); } sort(point.begin(), point.end()); point.erase(unique(point.begin(), point.end()), point.end()); for(pair<int, int> item: add) { int x = lower_bound(point.begin(), point.end(), item.first) - point.begin(); a[x + 1] += item.second; } for(int i = 1; i <= point.size(); i++) { a[i] += a[i - 1]; } for(pair<int, int> item: query) { l = lower_bound(point.begin(), point.end(), item.first) - point.begin(); r = lower_bound(point.begin(), point.end(), item.second) - point.begin(); cout << a[r + 1] - a[l] << endl; } return 0; }
-
区间合并
#include<iostream> #include<vector> #include<algorithm> using namespace std; typedef pair<int, int> PII; vector<PII> v; int main() { int n, ans = 0; cin >> n; while(n--) { int l, r; cin >> l >> r; v.push_back({l, r}); } sort(v.begin(), v.end()); int start = v[0].first, end = v[0].second; for(PII item: v) { if(item.first <= end && item.second > end) { end = item.second; } else if(item.first > end) { ans++; start = item.first; end = item.second; } } ans++; cout << ans; return 0; }
基础算法
最新推荐文章于 2022-11-28 20:31:09 发布