06 2022 档案
摘要:如果一个二维网格中数据不重复,可以确定其鞍点最多有一个。 假设鞍点是列极大行极小, 则,与鞍点同行或同列的点显然不是鞍点, 与鞍点不同行列的点z,可以对应,鞍点行列中的两个点x和y 且显然x<y(因为x<鞍点<y) 如果z<x,则z不为列极大,如果z>y,则z不为行极小, 如果x<z<y,则z不为列
阅读全文
摘要:对于大数,可以使用string存储。 如果要构造最大的大数,注意数的大小首先比较数的长度,然后从首位往后面的位比较。 例题: https://atcoder.jp/contests/abc257/tasks/abc257_e 首先可以计算出,可以构造出的最长位数 然后再从大到小对每一位,贪心的判断是
阅读全文
摘要:在求组合数时,其除数有阶乘形式,会非常大。 所以需要用除法逆元记录。 有公式1/num=pow(num,P-2)(mod P),P是质数。 其中pow可以用QuickPow算法求出。 在阶乘递推时,可以有n!=(n-1)!*n;从前向后递推 阶乘的逆元在递推时,有1/(n!)=1/((n-1)!)/
阅读全文
摘要:组合数与杨辉三角有一一对应的关系: 根据杨辉三角的构造方式,以及组合数的性质:C(n,m)=C(n-1,m)+C(n-1,m-1) 可得杨辉三角的每一行,都对应着一个固定底数的组合数。 例题: https://codeforces.com/contest/1696/problem/E 同时有组合数公
阅读全文
摘要:单调栈可以获得比第一个比当前数大/小的数的位置。 使用deque也可以用来二分查找。 如下例题: https://codeforces.com/contest/1696/problem/D 可以存储当前数的单调增栈和单调减栈,然后根据栈中首元素的相对位置,进行选择和二分查找。 #include<bi
阅读全文
摘要:如下图灵茶山艾府提供的题解中绿色三角形所示: 可以在一次DFS中,处理出节点的进出“时间”,这样,如果是有直接亲缘关系的节点,则会有时间上的包含关系。 时间用全局变量表示,进入DFS函数时记录进入时间,DFS完全部子树后,返回前,记录出时间。 https://www.bilibili.com/vid
阅读全文
摘要:如果要求子区间中全部数字的平均数大于100,可以先将区间中全部数字都减100,然后再判断区间和是否大于0,这样就可以避免平均数的值和区间长度相关的问题。 例题: AcWing 4487. 最长连续子序列 #include<bits/stdc++.h> using namespace std; typ
阅读全文
摘要:AcWing 1086. 恨7不成妻 数位dp例题 注意一个数不能分别对两个不同的数取余,只能将其保存下来 例如下面代码中的prev_b #include<bits/stdc++.h> using namespace std; typedef long long LL; LL MOD = 10000
阅读全文
摘要:C++中,对负数取模的结果为负数,需要特殊写取模函数 LL Mod(LL num,LL mod) { return (num%mod+mod)%mod; } View Code
阅读全文
摘要:若数位dp中的数字性质要求数字不含前导0,则可以考虑。 dp数组中保留存在前导0的数字种类。 在遍历每一位时,第一位从1开始,其他位从0开始。 然后再把位数低于当前数字的结果(不含前导0)累加。 (含有前导0时,则可以遍历每一位时都从0开始,最后也不用累加结果) (如果数字是否含有前导0对结果(数字
阅读全文
摘要:此题中,dp数组保存存在前导0的windy数(因为在使用时,当前位的前面会存在非0数) 结果为不存在前导0的windy数(循环过程中第一次不包含0)。 #include<bits/stdc++.h> using namespace std; typedef long long LL; LL dp[1
阅读全文
摘要:ABC 256 G - Black and White Stones 题目: https://atcoder.jp/contests/abc256/tasks/abc256_g 题解: https://atcoder.jp/contests/abc256/editorial/4142 思路: 求一个
阅读全文
摘要:数位DP的一般形式是: 在[X,Y]区间内,找到满足某种性质的数的个数。 技巧1:两端区间变为一边区间,计算[0, X]和[0, Y]在相减 技巧2:以树的方式考虑,从高位到低位,考虑枚举的数的当前位小于还是等于Y的当前位。 AcWing 1081. 度的数量 #include<bits/stdc+
阅读全文
摘要:题目链接: https://codeforces.com/contest/1695/problem/D2 https://atcoder.jp/contests/apc001/tasks/apc001_e 解题思路: 可以考虑,对于每个节点v,其有k个子节点,则每个子节点中至少有k-1个侦查点,才能
阅读全文
摘要:题目:https://ac.nowcoder.com/acm/contest/11229/F 题解:https://www.bilibili.com/video/BV1Zv4y1u7hT?p=5&spm_id_from=pageDriver&vd_source=75ae018f8d1181302d7
阅读全文
摘要:整数部分,不断做除法,并取余数,最后倒置。 小数部分,不断做乘法,并取出整数部分。 例题 AcWing 4484. 有限小数 #include<bits/stdc++.h> using namespace std; typedef long long LL; LL GCD(LL a,LL b) {
阅读全文
摘要:容器的resize(n,a) 如果原容器中数据不超过n,则在后面补充a,但是容器中的原内容不变。 如果想全清空需要先clear();
阅读全文
摘要:AcWing 1073. 树的中心 #include<bits/stdc++.h> using namespace std; typedef long long LL; vector<int> adj[10010]; vector<int> w[10010]; int p[10010]; int w
阅读全文
摘要:有根树从根、无根树从任意一个节点开始处理即可 1、不考虑边权,考虑路径中点的个数,可以从任意一个节点开始进行DFS,DFS返回以当前节点为根的子树中,以当前节点为端点的最长路径。 经过当前节点的最长路径,即为以当前节点的子节点为端点的前2长的路径长度的和+1,并以此更新全局最长路径(直径)。 2、边
阅读全文
摘要:简历最好限制在一页纸,项目介绍控制在三四行,具体内容等面试时再讲。 国企喜好复杂的简历,项目可以非常详细地写,可以写多页。 参考: http://erdengk.top/archives/jian-li--mian-shi https://www.bilibili.com/video/BV1gZ4y
阅读全文
摘要:区间dp常用的实现方式有:迭代式和记忆化搜索式。 迭代式可以枚举左右端点,也可以考虑先枚举区间长度,这样小区间就会在大区间之前被计算。大区间通过分界点由小区间转移。 例题 AcWing 282. 石子合并 此题直接枚举区间长度和左端点,右端点不超过n。 AcWing 1068. 环形石子合并 此题可
阅读全文
摘要:前序遍历的第一个元素是根,设其为r,则可以在中序遍历中找到r,并分别确定左右子树的前序遍历和中序遍历。这样递归求解即可。 注意,在中序遍历中查找r时,可以不用遍历,而是预处理出每个r在中序遍历I中的位置invI,这样就可以在O(1)的时间查找到。 是否可以生成一棵二叉树的条件为,每一次递归,判断r在
阅读全文
摘要:当动态规划需要的数组范围太大,且当前状态只与前几维状态相关时,可以用滚动数组存储。 例如 二个滚动数组 dp[i&1]...=dp[i-1&1]... 三个滚动数组 dp[i%3]...=dp[(i-1)%3]....+dp[(i-2)%3].....;
阅读全文
摘要:对于一个首尾相接的数组,设其旋转k1、k2、k3...次后可以恢复原状。 且k1<k2<k3<...。 则可以肯定,k1为这个数组的循环节,且k2、k3...均为k1的倍数。 一种求循环节的方法为: 对长度为n的循环字符串,先从小到大遍历可能的循环节的长度i,判断是否n%i==0,然后对其中的除第一
阅读全文
摘要:291. 蒙德里安的梦想 此题使用状态压缩dp进行计算,状态表示使用一个数j,其中j的二进制位为1的位置表示1*2的第一个小方格并向后延伸。 由于1*2的第二个小方格和2*1的任意一个小方格与后面是没有联系的,对于后面的处理是等价的, 所以状态只用表示和后面产生联系的1*2的第一个小方格。 转移方法
阅读全文
摘要:根据三个等价条件,可以将n^2个数的GCD转化为n个数的GCD,且这n个数是连续的,可以通过线段树在log时间求解。 转化方式为 a与b的GCD=a与a-b的GCD,因为b=x*GCD。
阅读全文
摘要:设f(x)为x的最大平方除数(x的除数且为平方数),两数i与j相乘为平方数,等价于i/f(i)*j/f(j)为平方数且由于i / f(i)与j / f(j)不可能被任何质数整除两次以上则两数i与j相乘为平方数,等价于i / f(i)= j/ f(j)且f(i)可以在sqrt(i)的时间复杂度求出。
阅读全文
摘要:dp中的状态机模型会增加一维表示当前的状态。根据状态间的转移方式进行dp 1052. 设计密码 此题需要结合kmp和状态机模型 状态的定义是 dp[i][j]表示遍历到字母i,且匹配了长度为j的模板串,匹配模板串的长度即为状态。 状态的转移根据i-1位的匹配长度,以及i位的字母,计算i位的匹配长度。
阅读全文
摘要:对一个字符串的子字符串,判断回文一般需要O(n)的时间, 但是如果预先处理出子字符串的哈希值,则可以在O(1)的时间判断。 具体方法是,如果是小写字母,则可以用26进制数进行记录。 base=26; for(...) ha[i]=ha[i-1]*base+(str[i]-'a'); 再反着进行一次哈
阅读全文
摘要:C++中class和struct除了空的默认构造函数,还存在传入初始化列表的默认构造函数。 使用方式为: struct s { int a,b; double c; } int main() { s s1={1,1,1.1}; } View Code 但是在类内如果提供了构造函数,则不会生成默认构造
阅读全文
摘要:背包问题可以用dp数组记录最大值。 可以新增另一个数组count,记录等于最大值的方案数, 这样,在算出最大值后,在求解一遍可以以最大值转移过来的方案数的和,即可得到最大值的方案数。 AcWing 11. 背包问题求方案数 代码如下: #include<bits/stdc++.h> using na
阅读全文
摘要:有依赖的背包问题,节点有树形结构的依赖。 可以递归计算。 递归的过程中,首先对节点的每个子树,计算在不同体积下的最大价值,即dp[u][i]。 dp[u][i]代表在节点u的子树中,选择不超过体积i的物品所得到的最大价值。 然后对当前节点,将每个子节点的每个体积看做分组背包问题中的物品求解。 在递归
阅读全文
摘要:二进制优化代码比单调队列优化代码更清晰好写。 可以将一维优化成log级别。 其思想是,将数量s,1+2+4+...+s0,对1、2、4、...、s0分别打包, 则小于s的任意一个数量均可由这些打包表示出来。 这样数量为s的多重背包,可分解为这些打包的01背包。 注意,由于此时物品数量增多,必须优化d
阅读全文
摘要:求 a/b(mod p) 其中,p是一个质数。 由费马小定理,有: b^(p-1)=1(mod p) 故 b^(p-2)=b^(-1)(mod p) 故 a/b(mod p) =a*b^(-1)(mod p)=a*b^(p-2)(mod p) 其中b^(p-2)可以用快速幂求解 注意:每一步都要取模
阅读全文