算法
冲冲冲(ಡωಡ)
这个作者很懒,什么都没留下…
展开
-
牛客练习赛79
牛客练习赛79A 炼金术师题目简述:两个人分别对一个数组进行填数 第一个人第i次填的颜色为i区间为[0,ai]。进行n次填充,而第二个人对另一个数组进行填色,他可以选择[1,n][1,n]中的任意一种颜色,以及任意的一个右端点rr,将该画布的[0,r][0,r]区间染成此次选择的颜色。求第二个人最少最少次可以将数组变成第一个人一样。题目分析:因为第一个人(此后成为甲)染色有后面的覆盖前面的颜色,所以我们可以用一个栈来模拟这道题目,如果栈顶的数小于将要入栈的数,那么意味着后面的数会覆盖前面染过的区原创 2021-03-27 10:32:39 · 161 阅读 · 0 评论 -
图论 单源最短路径问题 Dijkstra算法
#include<bits/stdc++.h>using namespace std;typedef long long ll;//const int N=20;const int mod=9901;const int INF=1000000;#define forn(i,a,b) for(int i=a;i<b;i++)//*****************************************************************const in原创 2020-12-10 19:33:43 · 77 阅读 · 0 评论 -
快乘与快速幂
快乘与快速幂#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=20;const int mod=9901;#define forn(i,a,b) for(int i=a;i<b;i++)//*****************************************************************//int a[10000000];ll qui原创 2020-11-30 16:28:58 · 59 阅读 · 0 评论 -
ST算法(求区间最值问题)
给定一个长度为N的序列A,ST算法能在 O(NlogN)时间的预处理后,以O(1)的时间复杂度在线回答“数列A中下标在 l ~ r 之间的数的最大值是多少”这样的区间最值问题。 一个序列的子区间个数显然有 O(N^2)个,根据倍增思想,我们首先在这个规模为O(N^2)的状态空间里选择一些 2 的整数次幂的位置作为代表值。 设 F[i , j] 表示数列 A 中下标在子区间 [i, i + 2^j -1] 里的数的最大值,也就是从 i 开始的 2^j 个数的最大值。递推边界显然是 F[i, 0原创 2020-11-01 22:00:01 · 239 阅读 · 0 评论 -
c++中读入一行字符创的方法
读入一行字符串,以回车键结束读入有两种方法,如下:方法一:getline()读入整行数据,它使用回车键输入的换行符来确定输入结尾。调用方法: cin.getline(str, len);第一个参数str是用来存储输入行的数组名称,第二个参数len是要读取的字符数。 1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 char str[30]; 7 cin.getline(s原创 2020-10-30 09:27:04 · 245 阅读 · 0 评论 -
模板
数论素数的判定原创 2020-10-28 22:15:55 · 79 阅读 · 0 评论 -
高效判断素数
高效判断是否为素数在大于4的所有整数中,都可以将其表示为6n-1,6n,6n+1,6n+2,6n+3,6n+4;分析如下:6n 与 6n+2 与 6n+4 都可以被2整除所以不可能是素数那么素数只能出现在6n-1与6n+1中int judge_prime(int n){ if(n==1 || n==4) return false; if(n==2 || n==3) return true; if(n%6!=1 || n%6!=5) return false; for(int i=5原创 2020-10-28 22:08:26 · 121 阅读 · 0 评论 -
卡特兰数
卡特兰数卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名。卡特兰公式的应用很广泛,最典型的四种应用问题现描述如下:此数的递归公式为 h(n ) = h(n-1)(4n-2) / (n+1)。令h(1)=1,h(0)=1卡特兰数的应用 实质上都是递归等式的应用括号化 矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种)原创 2020-09-29 20:07:20 · 78 阅读 · 0 评论 -
前缀和 差分
对于一个数列A,他的差分数列B定义为: B[1] = A[1] ,B[i] = A[i] - A[i-1] ( 2<=i<=n) 容易发现,“前缀和” 和 “差分” 是一对互逆运算,差分序列B的前缀和序列就是原序列A,前缀和序列S的差分序列也是原序列A。 把序列A的区间 [l,r] 加上 d(即把 Al,Al+1……Ar 都加上 d),其差分序列 B 的变化为 Bl 加 d,Br+1 减 d,其余位置不变。 列如数列 1 3 6 3 9 10 20,让位置在[2,5]范围内加原创 2020-09-17 20:18:45 · 88 阅读 · 0 评论 -
c++ fixed setprecision()
c++,fixed,setprecision(),setw()fixed固定的意思,在cout时,强制的把float类型和double类型输出小数,而不是科学计数法的形式。setprecision(),设置输出的小数的小数点后显示几位,比如setprecision(2)表示小数点后显示两位。cout<<fixed<<setprecision(保留的位数)<<要输出的数字;...原创 2020-09-15 16:50:03 · 5271 阅读 · 1 评论 -
负数的二进制表示
负数的二进制的表示例如:-5 在计算机中是如何表示的呢在计算机中整数是直接用原码表示,例如单字节5,在计算机中就表示为:0000 0101。负数以其正值的补码形式表示,如单字节-5,在计算机中表示为1111 1011。就是正数安位取反后再加一...原创 2020-09-13 15:58:59 · 163 阅读 · 0 评论 -
并查集学习笔记
并查集:并查集适用于不相交的集合问题题目链接#include <bits/stdc++.h>using namespace std;int a[10000];int find_set(int x){ if(x!=a[x]) find_set(a[x]); else return x;}void union_set(int x,int y)//合并并查集{ x=find_set(a[x]); y=find_se原创 2020-09-04 16:21:47 · 82 阅读 · 0 评论 -
2020年暑假算法笔记
2020年暑假算法笔记2020年7月11日:map 相关用法Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。1、map简介map是一原创 2020-09-03 15:38:30 · 373 阅读 · 1 评论 -
康拖展开式+逆康拖展开式
康拓展开式:康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩,在组合数学中,其解决的是当前排列在全排列中的名次问题。简单来说,给定一个 n 位数的全排列,可根据康托展开公式确定其应是字典序中的第几个排列。由于康托展开计算的是某个全排列方式在该全排列集合中的字典序,其映射关系是唯一的,而且单调,因此映射关系是可逆的,故而当给定一个全排列的所有字符,以及某个字典序编号,可以利用逆康托展开得到相应的那个全排列。总而言之就是求出该排列在全排列中排第几;计算公式:其中a[ i ] 表示的原创 2020-09-03 15:36:48 · 243 阅读 · 0 评论 -
线段树学习笔记
线段树:线段树其实是一个二叉搜索树,它存储的是一个区间的信息每个节点以结构体的方式存储结构体包括区间的左右端点外加区间和其它看情况加区间要维护的信息线段树的基本思想是二分特殊性质有:每个节点的左孩子的区间范围确定对于节点k,左孩子节点为2k,右孩子为2k+1,这符合完全二叉树的性质线段树的基本操作:建树,单点查询,单点修改,区间查询,区间修改1.建树struct node{ int l,,t; int sum;//l,r分别表示区间左右端点 sum表示区间和}tr原创 2020-09-03 10:30:19 · 63 阅读 · 0 评论 -
树状数组笔记
树状数组是对一个数组改变某个元素和求和比较实用的数据结构。两中操作都是O(logn)。传统数组(共n个元素)的元素修改和连续元素求和的复杂度分别为O(1)和O(n)。树状数组通过将线性结构转换成伪树状结构(线性结构只能逐个扫描元素,而树状结构可以实现跳跃式扫描),使得修改和求和复杂度均为O(lgn),大大提高了整体效率。给定序列(数列)A,我们设一个数组C满足C[i] = A[i–2^k+ 1] + … + A[i]其中,k为i在二进制下末尾0的个数,i从1开始算!则我们称C为树状数组。下面的问转载 2020-09-02 16:09:53 · 88 阅读 · 0 评论 -
A除以B (20)
A除以B (20)时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)题目描述本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。输入描述:输入在1行中依次给出A和B,中间以1空格分隔。输出描述:在1行中依次输出Q和R,中间以1空格分隔。输入例子:123456789050987654321 7输出例子:17636684150141093原创 2020-09-02 13:16:56 · 124 阅读 · 0 评论 -
大数求余数 和 大数求商
大数求余数核心算法while(k) { res=res*10+a[i]; res=res%7; k--; }大数求商大数求余数和大数求商都在这里面for(int i=1;i<len;i++){ t=(temp*10+s[i]-'0')/a; cout<<t;//t为商,逐个输出 temp=(temp*10+s[i]-'0')%a原创 2020-09-02 13:11:12 · 205 阅读 · 1 评论 -
数论2 GCD + LCM
数论2:同余 + GCD + LCM带模运算的性质:(a + b) % p = (a % p + b % p)%p(a - b) % p = (a % p - b % p) % p(a * b) % p = (a % p * b % p )%p(a ^ b) % p =((a % p) ^ b)% p整数分除例题:余数求和原创 2020-08-26 16:44:54 · 83 阅读 · 0 评论 -
数论1 素数+约数+反素数
数论1 素数+约数+反素数素数:素数是指只能被自身整除和被1整除的数(大于1的自然数,1不是素数)不是素数的数为合数常见的题型有:素数的判定+素数的筛选两种题型素数的判定:试除法(如果n不能被【0,根号n】内的所有数整除,那么就为素数)加速技巧:>4的素数总是会被 6x+1 或 6x-1整除素数的筛选:素数埃氏塞法(复杂度:n* log log n,素数分布:x/ln x)代码略(不断塞出素数的倍数)线性塞法(欧拉塞法)(复杂度 n) 常用const int N原创 2020-08-26 11:37:07 · 181 阅读 · 0 评论 -
筛选法求素数
筛选法求素数#include <cstdio>#include <iostream>#include <cstring>using namespace std;int a[100000];void prime()//求1~100000内的素数{ a[1]=0;//1不是素数 for(int i=2;i<100000;i++) { if(a[i]==1) { for(int原创 2020-08-21 20:02:59 · 102 阅读 · 0 评论 -
数位dp
数位dp数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足一些条件数的个数。所谓数位dp,字面意思就是在数位上进行dp咯。数位还算是比较好听的名字,数位的含义:一个数有个位、十位、百位、千位…数的每一位就是数位啦!之所以要引入数位的概念完全就是为了dp。数位dp的实质就是换一种暴力枚举的方式,使得新的枚举方式满足dp的性质,然后记忆化就可以了。新的枚举:控制上界枚举,从最高位开始往下枚举,例如:ri=213,那么我们从百位开始枚举:百位可能的情况有0,1,2(觉得这里枚举0有问题的原创 2020-08-21 17:08:30 · 198 阅读 · 0 评论 -
kmp
kmp算法笔记一般匹配字符串时,我们从目标字符串str(假设长度为n)的第一个下标选取和ptr长度(长度为m)一样的子字符串进行比较,如果一样,就返回开始处的下标值,不一样,选取str下一个下标,同样选取长度为n的字符串进行比较,直到str的末尾(实际比较时,下标移动到n-m)。这样的时间复杂度是O(n*m)。ababaca这里我们要计算一个长度为m的转移函数next。next数组的含义就是一个固定字符串的最长前缀和最长后缀相同的长度。比如:abcjkdabc,那么这个数组的最长前缀和最长后缀相同原创 2020-08-20 22:36:29 · 263 阅读 · 0 评论 -
位运算
位运算位运算就是计算机用二进制来与计算,并不需要我们自己将该数转换成二进制位运算基础:& 按位与| 按位或^ 按位异或~ 取反<< 左移用来将一个数的各二进制位全部左移N位,右补0右移将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数, 高位补0奇技淫巧应用一 用O(1)时间检测整数n是否是2的幂次.思路解析:N如果是2的幂次,则N满足两个条件。N>0N的二进制表示中只有一个1一位N的二进制表原创 2020-08-19 15:27:13 · 69 阅读 · 0 评论 -
字典树
字典树字典树应用于:节省大量空间存储单词或字符串,并可以实现快速查找字典树利用树形结构存储单词(第一个字母放在第一层,第二个放在第二层以此类推)字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没有该单词,如果在就在该字母的孩子节点里找是不是有单词的第二个字母,没有说明没有该单词,有的话用同样的方法继续查找.字典树不仅可以用来储存字母,也可以储存数字等其它数据*/字典树有模板的,主要操作包括创建和删除,要牢记字典树有两种实现原创 2020-08-18 17:00:08 · 58 阅读 · 0 评论