随笔分类 - acw基础
摘要:merge_sort(l, r)返回区间[l, r]内逆序对的个数,而区间[l, r]内的逆序对个数是左半边的逆序对个数merge_sort(l, mid)和右半边逆序对个数merge_sort(mid + 1, r)之和外加左右两边构成的逆序对个数。 #include <iostream> usi
阅读全文
摘要:归并排序板子 归并排序也用的分治思想,思路是将理想情况(n=2k)下长度为n的序列不断地分成两份,直到分成n个长度为1序列,然后自底向上地合并两个有序序列。 #include <iostream> using namespace std; const int N = 100010; int
阅读全文
摘要:快选板子 实际上是在快排板子上改了改 #include <iostream> using namespace std; const int N = 100010; int n, k; int q[N]; int quick_sort(int l, int r, int k){ if(l == r)
阅读全文
摘要:快排板子 从小到大排序 以j分界 #include <iostream> using namespace std; const int N = 100010; int n; int q[N]; void quick_sort(int l, int r){ if(l >= r) return; int
阅读全文
摘要:唉,好久没写题了,全面退化... 翰翰和达达饲养了 N 只小猫,这天,小猫们要去爬山。 经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<)。 翰翰和达达只好花钱让它们坐索道下山。 索道上的缆车最大承重量为 W,而 N 只小猫的重量分别是 \(C_1,C_2...C
阅读全文
摘要:区间合并模板题 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。 我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。 由于马路上有一些区域要用来建地铁。 这些区域用它们在数轴上的起始点和终止点表示。
阅读全文
摘要:给定 n 个区间 li,ri,要求合并所有有交集的区间。 注意如果在端点处相交,也算有交集。 输出合并完成后的区间个数。 例如:[1,3]和[2,6]可以合并为一个区间[1,6]。 输入格式 第一行包含整数n。 接下来n行,每行包含两个整数 l 和 r。 输出格式 共一行,包含一个整数,
阅读全文
摘要:二段性:对于一个长度x,当长度x能够满足条件时,所有满足长度≤x的长度t,都能够满足条件,所以能够二分出长度的最大值。 实数二分,因为是实数,所以二分的终止条件不能用l < r来判断,而是应该根据题目要求的精度p令终止条件为r - l > 1e-(p + 2)。 复杂度:\(O(nlog(
阅读全文
摘要:给一个数n,求它的约数个数 因为n可以唯一分解成质因数的乘积即n = p_1^{\alpha1}p_2^{\alpha2}...p_t^{\alpha t},所以n的约数c的形式应该是$c= p_1^{\beta1}p_2^{\beta2}...p_t^{\beta t}\(,对于任何两组不同的
阅读全文
摘要:筛选出从2~n的所有素数 埃氏筛 对2~n中的每个数k,筛去k在2~n中的每一个倍数,最后剩下的就是2~n的所有素数,因为相当于每一个数k都会被2~k - 1的所有数筛一遍,一旦k存在2~k - 1的约数,那么他必定会被筛掉,反之k一定不会被筛掉。 **注意:**k是素数 ⇔ k不存在2~k - 1
阅读全文
摘要:给一个数n,对他进行质因数分解 代码 for(int i = 2; i <= n; i ++) if(n % i == 0){ cout << i << endl; while(n % i == 0) n /= i; } 证明以上循环可以输出n的所有质因数 当n为质数时,只输出n,得证。 当n不是质
阅读全文
摘要:给一个数n, 求[1, n]内的所有约数 由于当i | n,必有(n / i) | n,并且这两个约数关于\sqrt n对称,所以要枚举出所有的约数,只需要枚举到1,...,[\sqrt n]的约数即可,并且对于任意的i \in {1,... [\sqrt n]}都有$i < n
阅读全文
摘要:乘法逆元 需要乘法逆元的原因:对于两个超大的正整数a, b, long long无法存储,保证b | a, 现在要计算(a / b) mod m,其中m为素数。考虑以下计算方法: 认为a / b = (a %m) / (b % m) %m,这个显然不对。 所以为了能够方便的算出(a / b) m
阅读全文
摘要:找长度为k的窗口中的最大值(单调减队列),最小值(单调增队列) #include<iostream> using namespace std; const int N = 1000010; int n, k; int a[N]; int q[N], hh = -1, tt = 0; int main
阅读全文
摘要:输入一串数字,给你 M 个询问,每次询问就给你两个数字 X,Y,要求你说出 X 到 Y 这段区间内的最大数。 输入格式 第一行两个整数 N,M 表示数字的个数和要询问的次数; 接下来一行为 N 个数; 接下来 M 行,每行都有两个整数 X,Y。 输出格式 输出共 M 行,每行输出一个数。 数据范围
阅读全文
摘要:星星的坐标按照y坐标升序给出,当y坐标相同时,按照x坐标升序给出,那么可以得到给出的顺序时是按照y坐标分层,从左向右给出的,即先给出y = 1一层,再给出y = 2一层的所有星星... 那么有结论:在给出某一个星星的坐标(x_i, y_i)时,它的y坐标一定是最大的,
阅读全文
摘要:使用线段树维护一段长度为n的区间,线段树的空间要开4n的原因 设要维护的区间为[1, n]长度为n 若n = 2^k, k = 0, 1, 2, 3, ... 那么构造的线段树的结点个数不多不少刚好用2^{k + 1} - 1 < 2n个, 所以开2n足够,此时的线段树为
阅读全文
摘要:f(i, j)表示在我摆放第i列的时候,i - 1列1*2方格伸出来的情况为j的所有摆法的集合,存储摆法数量 有f(i, j) = D, D是所有满足以下两个条件的其他状态的集合中存储数量的和 从i - 2列伸出来的方格情况k和i - 1列伸出来的方格的情况之间没有冲突(k & j == 0
阅读全文
摘要:a*x \equiv b \ (mod \ m) 即存在y 使得a*x = m * y + b 即ax -my=b 令y'= -y 有ax + my'=b ax \equiv b \ (mod \ m)有解等价于ax + m*y'=b有解 联想扩展欧几里得算法,若
阅读全文