摘要:
悬线法是一种更优秀的枚举方式,保证了枚举悬线的集合包含了极大子矩形所在的集合,而且由最大子矩形一定是极大子矩形的定理可知,这种枚举方式可以求出最大子矩形。 具体做法是维护矩形中每个元素对应最近的左边和右边的障碍点,再维护一个高度数组记录下每个点向上可以延伸多高,还有对应的矩形向左向右可以到达的最大宽 阅读全文
摘要:
首先,在这道题的搜索框架中,在对每一位进行枚举时,复杂度为$O(n^2)$,但是可知最优解序列的长度不会太长。 其次,采用 $bool$ 类型返回值时,是一种存在性搜索,并不一定能够得到最优解。 综合以上两点,需要采取迭代化搜索,每次限制在当前层中找出一个符合条件的答案,如果找到了的话一定是最优解。 阅读全文
摘要:
在这里采用的是哈希+二分的方法。 根据回文串的性质可知,可以将回文分成奇回文和偶回文分别进行处理。 对于奇回文来说,每次枚举的端点一定是重合的,因此只需计算出端点左右公共的长度是多少即可,因此二分的是以该枚举点为中心的左半边共有多少个字符。 对于偶回文来说,每次枚举的端点不一定是相等的,因此在二分的 阅读全文
摘要:
取进制数为131,每次$O(N)$时间预处理出幂次和母串的滚动哈希值。 代码如下 cpp include using namespace std; const int maxn=1e6+10; const int base=131; char s1[maxn],s2[maxn]; unsigned 阅读全文
摘要:
题目:给定一个序列,求其第 K 大的数是多少。 时间复杂度$O(n)$ 代码如下: cpp include using namespace std; const int maxn=5e6+10; inline int read(){ int x=0,f=1;char ch; do{ch=getcha 阅读全文
摘要:
题目:给定一个序列a[ ],共 N 个正数,现有 M 次询问,每次给出一个 T ,需要求出最大的 k ,满足$\Sigma_{i=1}^ka[i] using namespace std; const int maxn=1e5+10; int sum[maxn],n,m; int main(){ s 阅读全文
摘要:
这是一道可以练习哈希表的模板题。关于哈希表的操作均有涉及。 哈希函数的选取是这道题的关键。这道题的关键字是一个长度为6的序列,并且序列与开始顺序、时钟顺序均无关。 因此,采用哈希函数$H[x]=\Sigma_{i=0}^5a[i]+\prod_{i=0}^5a[i]$,即:用加和乘的相加来进一步保证 阅读全文
摘要:
哈希表是一种用空间来换取时间的高效桶式数据结构,一般可以在常数时间内回答对某个元素性质的询问。 一般在出现 对于每个x有多少个P(x)符合要求 这种情况时,经常用哈希表来存储x,同时x也称作关键字(key),这意味着对于每个x,都会对应一个符合条件的val值。 用途 1. 哈希判重 我们可以开一个$ 阅读全文
摘要:
题目大意:给定一棵树,树上点有标记,给定一棵树的$dfs$序标记序列,求有多少种可能的子树形态。(子树之间有序) 这是一道区间计数类DP,涉及到树的$dfs$序。 这道题区间的划分点 $k$ 的意义是:对于区间在[ l+1 , k 1 ]的序列,作为这棵树的第一棵子树。因为子树之间是有序的,所以第一 阅读全文
摘要:
这道题是典型的环形石子归并模型,破环成链后时间复杂度为$O(n^3)$ 不过,因为题目中所给的数字可能是负数,仅仅记录区间内合并之后的最大值并不满足动态规划的最优子结构性质。因此,还需要额外记录下区间合并后的最小值,由最小值和最大值即可组合出整个区间的最大值。 代码如下: cpp include i 阅读全文