合集-算法
摘要:## 二分查找 ### 要求 数据是有序且单调的 ### 模板 从左到右 ```c++ while (l > 1; //(l+r)/2 if (check(mid)) r = mid; // check()判断mid是否满足性质 //arr[mid] >= x else l = mid + 1; }
阅读全文
摘要:求$a^n$: 传统做法:$a \times a \times ...\times a$,时间复杂度O(n) 快速幂算法: $5^{13} \to 5 \times 5^6 \times 5^6 \to 5 \times 15625 \times 15625$ 复用相同的数 $2^8 \to (2^
阅读全文
摘要:> 化大为小 离散化的本质是建立了一段数列到自然数之间的映射关系(value -> index),通过建立新索引,来缩小目标区间,使得可以进行一系列连续数组可以进行的操作比如二分,前缀和等… 化大为小,把稀疏离散化简为稠密连续的一段 模板: ```c++ vector alls; // 存储所有待离
阅读全文
摘要:## 前缀和 ### 一维前缀和 公式: $$ s[i] = s[i - 1] + a[i] $$ 模板: ```c++ const int N = 10000 + 10; int n,m; int a[N],s[N]; int main() { scanf("%d%d",&n,&m); for (
阅读全文
摘要:模板: ```c++ for (int i = 0, j = 0; i < n; i++) { while (j < (i) && check(i, j)) j++; //题目的具体逻辑 } ``` 核心思想: 先把暴力的解法写出来,看是否有单调性,若有则可用双指针 ```c++ for (int
阅读全文
摘要:**位运算都是对操作数在内存中的二进制位进行操作** 注意:只能操作整数类型,不能操作浮点数! 因为整数在内存中表示的是自己本身的值,而浮点数却不是(IEEE745) 这种限是编译器限制的,因为对以浮点表示法的浮点数进行位运算没有数学意义 搜罗一番,只找到其一个用途,从硬件上快速支持浮点数fabs,
阅读全文
摘要:`cin`可以读取连续元素的单个元素,类似`getchar()` 使用`printf`时最好添加头文件 #`include ` `%08.3f`, 表示最小宽度为8,保留3位小数,当宽度不足时在前面补上(对整型补0时不能打点号) `fgets`不会删除行末的回车字符 `strcmp(a, b)`比较
阅读全文
摘要:`lowbit(n)`取出n在二进制表示下最低位的1的位置 ```c++ int lowbit(int x) { return (x & -x); } ``` 原理就是将x的原码与上x的补码(-x:补码, ~x:反码, 补码等于反码加一) eg: 6的原码:0110 6的补码:1010 &运算: 0
阅读全文
摘要:>KMP算法是一种**字符串匹配**算法,可以在 O(n+m) 的时间复杂度内实现两个字符串的匹配 KMP算法通过记录**相等前后缀的最大长度**使得匹配串上的指针不回溯,并且快速跳过不匹配区域 其中最主要的是模式串中个个位置的公共(相等,~~公共这两个字搞得我迷糊了半天~~)前后缀的最大值,它将是
阅读全文

浙公网安备 33010602011771号