01 2019 档案
摘要: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
阅读全文
摘要:1、定义:将优先级最高的元素先出队列的队列。 2、基本操作:入队(插入),出队(删除优先级最高的元素,代码中以元素值最小为优先级最高),构建堆, 修改元素等。 3、二叉堆:父节点小于子节点的完全二叉树。 性质: (1)结构性:完全二叉树结构 (2)堆序性:父节点的值小于子节点的值 3、代码实现: (
阅读全文
摘要:题目链接:传送门 思路:有点不理解,就是通过有限次数变为全部为0的字符串, 以三位数的字符串为例,有些字符串可能存在循环,100->010->101->010->001->100。 但是,随机的情况可能最后变为全部为0的字符串,所以“cnznb”。 正规题解:每𝑛次操作看作一轮,每轮的操作都是从0
阅读全文
摘要:题目链接:传送门 思路:因为存在负值边,所以一开始就想广搜求出最短路径,结果错了,后来发现是没用好bfs。 题解上说可以用拓扑排序求带负权值边的最短路径,这次get到了。 就是邻接表的使用还不太熟悉,代码是参考排名第一的大佬的。 #include<iostream> #include<cstdio>
阅读全文
摘要:题目链接:传送门 思路:要求最后求出的时间尽可能的小,一开始我只想到了用排序分别讨论ai和bi的大小, 后来发现结果与两者都有关系,然后……就没做出来。 后来看了题解,发现如果只要让ai/bi尽可能大,就能保证所得到的时间是最小的,让ai/bi 降序排序,然后贪心即可。 #include<iostr
阅读全文
摘要:题目链接:传送门 思路:一开始我觉的数据很大,可能是找规律的题目,我就列了条件,发现如果n>=∑3^(i-1) (i-1>=0)并且,n<=∑3^i 则 n为最少可以由i位数组成,然后就不知道怎么做了。 看来题解才想到用求和公式呀,然后就是i=log(2*n+1)。 因为是大数,之后又不知道怎么做了
阅读全文
摘要:题目链接:传送门 知识点: (1)三个点,三角形求面积公式 (2)精度问题: double 15-16位(参考文章) float 6-7位 long long 约20位 int 约10位 unsigned int 是int的两倍(参考文章) (3)nth_element()函数 思路:一开始想直接暴
阅读全文
摘要:题目链接:传送门 思路:欧拉函数的性质:前n个数的欧拉函数之和为φ(n)*n/2,由此求出结果。 参考文章:传送门 #include<iostream> #include<cmath> #include<cstdio> #include<cstring> using namespace std; t
阅读全文
摘要:一、欧拉函数 1、定义:对于正整数n,欧拉函数φ(x)是求小于n中与n互质的数字的数目。 2、公式: φ(x)=x(1-1/p(1))(1-1/p(2))(1-1/p(3))(1-1/p(4))…..(1-1/p(n)) 其中p(1),p(2)…p(n)为x 的所有质因数;x是正整数; φ(1)=1
阅读全文
摘要:字典树 1、定义:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计 2、优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高 3、模板: co
阅读全文
摘要:题目链接:传送门 思路:建立一个32位的字典树,对每一个要插入的数字查找它异或的最大值(就是尽量全部二进制的值都相反), 然后获得两个数异或的最大值。 #include<iostream> #include<cstdio> #include<cstring> using namespace std;
阅读全文
摘要:题目链接:传送门 思路:注意是比较人第一天女装的概率和连续两天女装的概率 Ans=P(两次都取到女装P1)/P(第一次取到女装P2) P1=x*(x-1)/n*(n-1)+y*(y-1)/m*(m-1) P2=x/n+y/m; 然后化简,注意四舍五入 代码: #include<iostream> #
阅读全文
摘要:题目链接:传送门 思路:找最少有几个点,先求出每个点的覆盖范围,就是一个点最大可以到达的地方是y相同的地方而且直线距离是d, 所以x范围在[x-sqrt(d*d-y*y),x+sqrt(d*d-y*y)]内均符合条件;如果有相交的地方就是可以忽略这个点。 #include<iostream> #in
阅读全文
摘要:题目链接:传送门 思路:字符串hash,终止条件竟然判断错了,真是太大意了。 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 1001000; typedef un
阅读全文
摘要:题目一(poj-2965):传送门 思路:递归+枚举,遍历每一种情况,然后找出最小步骤的结果,与poj-1753类似。 #include<iostream> #include<cstdio> #include<cstring> //#include<ctime> using namespace st
阅读全文
摘要:题目一:传送门 思路:动态规划,从每一行来看,每次更新求出这一点的最大值,dp[i]=MAX(dp[i-1],dp[i]+dp[i-2]),不会出现 两个数字相邻的情况;先对行进行更新,再对列进行更新。 #include<iostream> #include<cstdio> #include<cst
阅读全文
摘要:题目一:传送门 题意:有一个4*4的棋盘,每次翻转一个棋子和它的上下左右的四个棋子,判断翻转多少次之后可以变为纯色的棋盘。 思路:总共有C(0,16)+C(1,16)+C(2,16)+……+C(16,16)=2^16次,所以最多有16个棋子被翻动,然后从(0,0)个棋子开始,依次翻转其他棋子, 判断
阅读全文
摘要:题目一:传送门 思路:主要是找到状态, 考虑字母有两种状态,大写和小写, 从小写变为大写的变化方式有两种:保持cap状态,或者按住shift键; 从小写变为大写也有一种变化方式:按住shift键; 看起来很乱,但是主要就是是否为cap状态,shift可以看做多按一次键, 不能算作状态,所以一个字母就
阅读全文
摘要:题目一:传送门 思路:水题,模拟即可 题目二:传送门 思路:dp,决策每个充电站是否要充电。(决策只有搜索,DP两种解决方法) (1)考虑状态的个数,n+2个,因为除了n个还有位置0,终点len两种状态; 前一个状态可以推出后一个状态,所以可以得到循环的顺序外循环1--n,内循环i-1--0。 (2
阅读全文
摘要:题目一:传送门 思路:就是简单的bfs,注意仔细审题,加上对转弯次数的判断。 题目二:传送门 思路:简单dp,记录每一秒每个位置接到的大饼的数量。 状态转移方程:dp[i][j]=max(dp[i][j] , dp[i-1][j]+a[i][j] , dp[i-1][j-1]+a[i][j] , d
阅读全文
摘要:题目链接:传送门 思路: (1)建立线段的信息,每个线段存储l到r的线段的x位置和y的起始点与终点。 建立线段树的节点信息,每个节点代表一个区间的信息,x表示区间的横坐标的位置,l,r表示纵坐标的范围,flag表示是否标记过,cover表示线段的覆盖次数。 (2)先将y的位置按照从小到大排序,再将边
阅读全文
摘要:题目链接:传送门 参考文章:传送门 思路: (1)对字符串进行翻译,求出s1(未翻译),s2(已翻译)字符串,并分别对s1,s2进行hash操作。 (2)比较s1的后x位和s2的前x位的hash值,求出最长的长度的中间位置。 #include<iostream> #include<cstdio> #
阅读全文
摘要:题目链接:传送门 思路: 就是找最多多少个扫帚,每个扫帚上有连续递增的序列,就是找一个最多重复数字的重复次数。 由于是30位,每次用char*类型,然后用hash映射一下,排序找最多就行了。 注意: (1)num最小也是1。 (2)注意前导零。 #include<iostream> #include
阅读全文
摘要:思路:给字符串做一个映射,两个元素相同,则他们的hash值必定相同。 注意:hash表必须是unsigned int类型,保证每个映射都是正数。 例题: Description 给出两个字符串W和T,求T中有几个W子串。 Input 第一行为数据数. 每组数据有两行W和T,表示模式串和原始串. Ou
阅读全文
摘要:一、散列简介 1、散列技术:允许以常数时间插入、删除、查找的技术 2、散列表:包含关键字,具有固定大小的数组。(散列表的实现叫做散列) 3、散列函数:每个关键字被映射到0到size-1中的某个位置,这个映射叫做散列函数。(散列表的大小一般为素数,减少冲突) 4、冲突:当两个关键字同时映射到一个位置时
阅读全文
摘要:题目链接:传送门 参考文章:传送门 思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树。 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 5
阅读全文