AHaiTang's Blog
  • 🔍搜索
  • 🏠主页
  • 📚文章
  • ⏱时间轴
  • 🧩分类
  • 🔖标签
  • 🙋🏻‍♂️关于
  • 🤝友链
主页 » Categories

Alogrithm

二分

二分的模板 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 //模板一 int bsearch1(int l, int r){ while (l < r){ int mid = (l + r ) / 2; if(check(mid)) r = mid; else l = mid + 1 ; } return l; } // 对于很大的数据,l+r 可能会溢出,可写成 l+(r-1>>1) // 模板二 int bsearch2(int l, int r) { while (l < r){ int mid = (l + r + 1) / 2; if(check(mid)) l = mid; else r = mid -l; } return r; } // 模板三(掌握) int bsearch3(int l,int r) { int ans = 0; while(l <= r) { int mid = (l+r) / 2; if(check(mid) ) { ans = mid; l = mid + 1;} else r = mid - 1; } return ans; } // 浮点二分 double bsearch4(double l, double r) { const double eps = 1e-6; while (r - l > eps) { double mid = (l + r) / 2; if (check(mid)) r = mid; else l = mid; } return l; } // 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用: int bsearch_2(int l, int r) { while (l < r) { int mid = l + r + 1 >> 1; if (check(mid)) l = mid; // check()判断mid是否满足性质 else r = mid - 1; // 如果mid不满足性质,则将其从搜索区间中去除 } } 第一个模板是尽量往左找目标,第二个模板是尽量往右找目标。 只要是往左找答案,就用第一个模板,mid不用加一,r=mid,l加一; 只要是往右找答案,就用第二个模板,mid要加一,l=mid,r要减一; ...

2025-04-26 · 3 分钟 · AHaiTang

手写归并

基础的手写归并排序模板 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 #include <bits/stdc++.h> using namespace std; using i64 = long long; void merge_range(i64 *arr, int left, int mid, int right) { int i = left, j = mid + 1, k = left; vector<i64> tmp(right + 1, 0); while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { tmp[k++] = arr[i++]; } else { tmp[k++] = arr[j++]; } } while (i <= mid) tmp[k++] = arr[i++]; while (j <= right) tmp[k++] = arr[j++]; // 回写到原数组 for (int p = left; p <= right; ++p) { arr[p] = tmp[p]; } } void merge_sort(i64 *arr, int left, int right) { if (left >= right) return; int mid = left + (right - left) / 2; merge_sort(arr, left, mid); merge_sort(arr, mid + 1, right); merge_range(arr, left, mid, right); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector<i64> a(n + 1); for (int i = 1; i <= n; ++i) { cin >> a[i]; } merge_sort(a.data(), 1, n); for (int i = 1; i <= n; ++i) { cout << a[i] << " \n"[i == n]; } return 0; } 逆序对的个数 ...

2025-04-24 · 2 分钟 · AHaiTang

手写快排

基础的手写快排模板 快速排序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 #include <bits/stdc++.h> using namespace std; using i64 = long long ; void Quick_Sort(i64 *arr, i64 begin, i64 end) { if(begin >= end) return; i64 tmp = arr[(begin + end) / 2]; i64 l = begin - 1, r = end + 1; while (l < r) { do(l++); while (arr[l] < tmp); do(r--); while (arr[r] > tmp); if (l < r) swap(arr[l], arr[r]); } Quick_Sort(arr, begin, r); Quick_Sort(arr, r + 1, end); } void solve() { i64 n; cin >> n; vector<i64> nums(n + 1, 0); for(int i = 1; i <= n; i++) { cin >> nums[i]; } Quick_Sort(nums.data(), 1, n); // sort(nums.begin() + 1, nums.end()); for(int i = 1; i <= n; i++) { cout << nums[i] << " \n"[i == n]; } } int main() { solve(); return 0; } 可优化方向 ...

2025-04-03 · 1 分钟 · Ahaitang
© 2025 AHaiTang's Blog · Powered by Hugo & PaperMod
本站已运行
访问量次 访客数人次