Acwing-----算法基础课之第一讲

785. 快速排序

Copy
#include <iostream> using namespace std; const int N = 1000010; int q[N]; void quick_sort(int q[], int l, int r) { if (l >= r) return ; int x = q[(l + r) / 2], 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); } int main() { int n; cin >> n; for (int i = 0; i < n; ++i) cin >> q[i]; quick_sort(q, 0, n - 1); for (int i = 0; i < n; ++i) cout << q[i] << " "; puts(""); return 0; }

786. 第k个数

Copy
#include <iostream> using namespace std; const int N = 100010; int n, k, q[N]; int quick_sort(int l, int r, int k) { if (l >= r) return q[l]; int i = l - 1, j = r + 1, x = q[l + 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]); } int sl = j - l + 1; if (k <= sl) return quick_sort(l, j, k); return quick_sort(j + 1, r, k - sl); } int main() { scanf("%d%d", &n, &k); for (int i = 0; i < n; ++i) scanf("%d", &q[i]); cout << quick_sort(0, n - 1, k) << endl; }

787. 归并排序

Copy
#include <iostream> using namespace std; const int N = 1e6 + 10; int q[N], tmp[N], n; 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 (int i = l, j = 0; i <= r; i++, j++) q[i] = tmp[j]; } int main () { scanf("%d", &n); for (int i = 0; i < n; ++i) scanf("%d", &q[i]); merge_sort(q, 0, n - 1); for (int i = 0; i < n; ++i) printf("%d ", q[i]); return 0; }

788. 逆序对的数量

Copy
#include <iostream> using namespace std; typedef long long LL; const int N = 1e5 + 10; int a[N], tmp[N]; LL merge_sort(int q[], int l, int r) { if (l >= r) return 0; int mid = l + r >> 1; LL res = 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 { res += mid - i + 1; 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]; return res; } int main() { int n; scanf("%d", &n); for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]); cout << merge_sort(a, 0, n - 1) << endl; return 0; }

789. 数的范围

Copy
#include <iostream> using namespace std; const int N = 100010; int q[N], m, n; int main () { scanf("%d%d", &n, &m); for (int i = 0; i < n; ++i) scanf("%d", &q[i]); while (m--) { int x; scanf("%d", &x); int l = 0, r = n - 1; while (l < r) { int mid = l + r >> 1; if (q[mid] >= x) r = mid; else l = mid + 1; } if (q[l] != x) { cout << "-1 -1" << endl; } else { cout << l << " "; int l = 0, r = n - 1; while (l < r) { int mid = l + r + 1 >> 1; if (q[mid] <= x) l = mid; else r = mid - 1; } cout << l << endl; } } }

790. 数的三次方根

Copy
`#include <iostream> using namespace std; double n; int main() { cin >> n; double l = -10000, r = 10000; while (r - l >= 1e-7) { double mid = (l + r) / 2; if (mid * mid * mid >= n) r = mid; else l = mid; } printf("%.6lf\n", l); }

795. 前缀和

Copy
#include <iostream> using namespace std; const int N = 100010; int n, m, q[N], s[N]; int main() { cin >> n >> m; for (int i = 1; i <= n; ++i) { cin >> q[i]; s[i] = s[i - 1] + q[i]; } int a, b; for (int i = 0; i < m; ++i) { cin >> a >> b; cout << s[b] - s[a - 1] << endl; } return 0; }
  1. 子矩阵的和
Copy
#include <iostream> using namespace std; const int N = 1010; int n, m, q, s[N][N]; int main() { cin >> n >> m >> q; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) cin >> 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, x2, y1, y2; cin >> x1 >> y1 >> x2 >> y2; cout << s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1] << endl; } }

799. 最长连续不重复子序列

Copy
#include <iostream> using namespace std; int n; const int N = 100010; int a[N], s[N]; int main() { cin >> n; for (int i = 0; i < n; ++i) cin >> a[i]; int res = 0; for (int i = 0, j = 0; i < n; ++i) { s[a[i]]++; while (s[a[i]] > 1) { s[a[j]]--; j++; } res = max(res, i - j + 1); } cout << res << endl; return 0; }

800. 数组元素的目标和

Copy
#include <iostream> using namespace std; const int N = 100010; int n, m, x, a[N], b[N]; int main() { cin >> n >> m >> x; for (int i = 0; i < n; ++i) cin >> a[i]; for (int i = 0; i < m; ++i) cin >> b[i]; for (int i = 0, j = m - 1; i < n; ++i) { while (j >= 0 && a[i] + b[j] > x) j--; if (j >= 0 && a[i] + b[j] == x) cout << i << " " << j << endl; } return 0; }

803. 区间合并

Copy
#include <iostream> #include <algorithm> #include <vector> using namespace std; typedef pair<int, int> PII; const int N = 100010; int n; vector<PII> segs; void merge(vector<PII> &segs) { vector<PII> res; sort(segs.begin(), segs.end()); int st = -2e9, ed = -2e9; for (auto seg: segs) { if (ed < seg.first) { if (st != -2e9) res.push_back({st, ed}); st = seg.first, ed = seg.second; } else ed = max(ed, seg.second); } if (st != -2e9) res.push_back({st, ed}); segs = res; } int main() { cin >> n; for (int i = 0; i < n; ++i) { int a, b; cin >> a >> b; segs.push_back({a, b}); } merge(segs); cout << segs.size() << endl; return 0; }
posted @   景云ⁿ  阅读(1725)  评论(0编辑  收藏  举报
编辑推荐:
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
阅读排行:
· DeepSeek智能编程
· 精选4款基于.NET开源、功能强大的通讯调试工具
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
点击右上角即可分享
微信分享提示