算法
各种算法学习和模板总结
山外青山明月楼
这个作者很懒,什么都没留下…
展开
-
二分(整数和浮点数)
二分(整数和浮点数)1.整数:核心代码:bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:int bsearch_1(int l, int r){ while (l < r){ int mid = l + r >> 1; if (check(mid)) r = mid; // check()判断mid是否满足性质原创 2021-02-24 20:30:11 · 120 阅读 · 0 评论 -
归并排序(逆序对的数量)
归并排序(逆序对的数量)核心思想:先递归排序,再将排好序的左右两部分合并成一个有序序列。1.题目787:给定你一个长度为n的整数数列。请你使用归并排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数 n。第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。输出格式输出共一行,包含 n 个整数,表示排好序的数列。数据范围1≤n≤100000输入样例:53 1 2 4 5输出样例:1 2 3 4 5#includ原创 2021-02-24 20:19:04 · 203 阅读 · 0 评论 -
快排
快排核心思想:先划分区间,再递归排序。题目785:给定你一个长度为n的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数 n。第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。输出格式输出共一行,包含 n 个整数,表示排好序的数列。数据范围1≤n≤100000输入样例:53 1 2 4 5输出样例:1 2 3 4 5#include<stdio.h>#include&l原创 2021-02-24 20:14:36 · 1306 阅读 · 0 评论 -
双指针(最长连续不重复子序列)
双指针:f(n) = o(n)常见问题分类:(1) 对于一个序列,用两个指针维护一段区间,比如快排中的区间划分。(2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作。for (int i = 0, j = 0; i < n; i ++ ){ while (j < i && check(i, j)) j ++ ; // 具体问题的逻辑}题目799: 最长连续不重复子序列给定一个长度为n的整数序列,请找出最长的不包含重复的数的连原创 2021-02-08 12:03:01 · 227 阅读 · 0 评论 -
差分(一维,二维)
差分(一维,二维)定义:存在数组a1, a2, …, an;要构造数组b1, b2, …, bn; 使得ai = b1 + b2+ … +bi;则a称为b的前缀和, b称为a的差分;则有b1 = a1, b2 = a2 - a1, b3 = a3 - a2 … bn = an - an-1(不重要,可用插入自动构造)。应用:1.由b求a:求前缀和,f(n) = o(n);2.让al,…,ar中每个值+c:暴力做法f(n) = o(n), 差分f(n) = o(1)。具体思路:让bl + c原创 2021-02-08 07:20:49 · 360 阅读 · 0 评论 -
前缀和(一维、二维)
前缀和(一维、二维)1.一维前缀和:前缀和:S[i] = a[1] + a[2] + … a[i];区间和([l,r]):a[l] + … + a[r] = S[r] - S[l - 1]。题目795:输入一个长度为n的整数序列。接下来再输入m个询问,每个询问输入一对l, r。对于每个询问,输出原序列中从第l个数到第r个数的和。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数数列。接下来m行,每行包含两个整数l和r,表示一个询问的区间范围。输出格式共m行,每行输出一个原创 2021-02-07 21:26:13 · 178 阅读 · 0 评论 -
高精度(非负数的加减乘除)
高精度(非负数的加减乘除)高精度的几种情况:A + B, A - B, A * b, A / b;其中数据范围一般为A,B <= len(1e6), b <= 1e4。1.高精度加法:题目791:给定两个非负整数,计算它们的和。输入格式共两行,每行包含一个整数。输出格式共一行,包含所求的和。数据范围1≤整数长度≤100000输入样例:1223输出样例:35#include<iostream>#include<vector>usin原创 2021-02-07 21:09:56 · 503 阅读 · 0 评论