摘要:
1、概念:斜堆是左式堆的自调节形式,实现简单,是特殊的二叉树,其与左式堆的关系类似伸展树与AVL树之间的关系。 2、结构:是二叉树的结构,与左式堆不同,没有Npl。 3、操作:在合并时,将较大堆和较小堆的右子树合并,然后交换较小堆的左右子树。其余操作基本一致。 4、代码实现: #include<io 阅读全文
摘要:
1、二项队列:堆序树的集合,称为森林,堆序树中每一棵都是有约束的形式称为二项树。 2、性质:高度为k的二项树恰好有k个节点。 3、实现: (1)结构:每个二项树包含数据、一个儿子及右兄弟,二项树中的诸儿子以递减次序排列。 (2)采用儿子-兄弟表示法。 #include<iostream> #incl 阅读全文
摘要:
1、NPL(零路径长):从x到一个没有儿子的节点的最短路径的长。 具有一个或者0个儿子的节点的NPL为0,NPL(NULL)=-1。 任意节点的零路径长比它的儿子的零路径长的最小值多1。 2、左式堆 (1)满足二叉堆的所有性质。 (2)对于堆的每一个节点x,左儿子的零路径长度至少与右儿子的零路径长度 阅读全文
摘要:
题目链接:传送门 思路:插入不同的字符与删除不同的字符相同,所以每次判断到不同位置时将这个字符删除然后判断是否为回文串即可, 如果一开始就是回文串,那么答案也是yes。 #include<iostream> #include<cstdio> #include<string> using namesp 阅读全文
摘要:
题目链接:传送门 思路: 考虑每一列有2种颜色,总共有n行,每一行的第一个格确定颜色,由于左右颜色不相同,后面的行就确定了。 所以总共有2^n中结果。 由于n太大,所以要用到费马小定理a^n%mod=a^(n%(mod-1))%mod,所以先求出a的指数,然后用快速幂求解就好了。 #include< 阅读全文
摘要:
题目链接:传送门 思路:主要是n=1,m=2或者n=2,m=1时,不是-1。 #include<iostream> #include<cstdio> #include<cstring> using namespace std; int main(void) { int n,m,i,j; while( 阅读全文
摘要:
思路:逐位处理,在依次遍历十进制的每一位数字的基础上不断更新状态,从而求解dp[i][s]表示第i位,状态为s的数字的个数。 例题一:传送门 思路:求和,然后对N取余。 #include<iostream> #include<cstdio> #include<cstring> using names 阅读全文
摘要:
题目链接:传送门 思路:由于MOD只有9983大小,所以四位小写字母的字符串组合有26+26^2+26^3+26^4=475254种组合。 所以只要每次枚举出从1到475254中的hash值对应的字符串记录在数组中,然后以O(1)的方式查找即可。 注意: (1)每个字符串对应一个唯一的值,所以按照字 阅读全文
摘要:
题目链接:传送门 思路:数位dp的记忆化搜索模板 从高位向低位枚举,逐位确定每一位的6的个数,dp[i][s]表示处理到第i条边,状态为s时的数字的个数。 注意,要使用long long类型。 #include<iostream> #include<cstdio> #include<cstring> 阅读全文
摘要:
题目链接:传送门 思路:考虑二进制数字的情况,可以写成一个二叉树的形式,然后考虑区间[i……j]中满足的个数=[0……j]-[0……i-1]。 所以统计树高为i,中有j个1的数的个数。 对于一个二进制数字,求出每次向右转时的左子树内的个数。 对于非二进制数字,就转换为二进制数字后再求解。 #incl 阅读全文