0%

传送门

Solution

Fi,len,dF_{i,len, d} 表示以 aia_i 结尾,长度为 lenlen,公差为 dd 的等差数列数量。转移方程为

Fi,len,d=j=1i1Fj,len1,dF_{i,len,d}=\sum\limits_{j=1}^{i-1} F_{j,len-1,d}

阅读全文 »

传送门

Solution

11nn 枚举数字,对于当前数字,若与栈顶元素相同,则弹出栈顶元素,否则压入当前数字。随后将当前栈的状态通过哈希映射到 map 数组中。map 数组负责统计该状态出现的次数

阅读全文 »

传送门

Solution

设有雪顶和无雪顶的山的总高度差为 cc

通过计算代表山峰类型的 0101 矩阵的二维前缀和,可以求出每个大小为 k×kk\times k 的方形区域中,两种类型的山的数量差。设每个方形的数量差分别为 aia_i,则问题转换为方程

阅读全文 »

传送门

Solution

注意到每把武器只使用一种金属锻造,可以独立计算每种金属锭的贡献。

把问题转换为:有一个数 xxnn 个操作,每个操作包含两个参数 aia_ibib_i。当满足 xaix\le a_i,则可执行操作 ii,使 xx 变为 x(aibi)x-(a_i-b_i)。求可对 xx 操作次数的最大值。

阅读全文 »

传送门

Description

有大小为 nn 的数组 aia_i,正整数 llrr。数组中相邻的多个数可绑定为一组。一个数只能在一个组内。求最多能有多少组满足组内元素之和在 [l,r][l,r] 内。

阅读全文 »

传送门

Description

给定一个长度为 nn 的数组 ai{a_i}和正整数 kk,数组可任意排序且不占用操作次数。一次操作可将 ai=ai+ka_i=a_i+k。求最少多少次操作能将该数组变为回文数列,即保证 ai=ani+1a_i=a_{n - i + 1}

阅读全文 »

简介

对比朴素枚举,KMP 的思想是当匹配出现不一样的字符时,根据模式串当前子串的最大相同前后缀,将模式串的指针回退到最大相同前缀的末尾而非模式串的开头,从而优化时间复杂度。

记录子串最大相同前后缀长度的数组为 nextinext_i。下图展示了 nextinext_i 的求解过程。

阅读全文 »

传送门

逐个对集合 PP 中的字符串进行 KMP ,得出其在串 SS 中的所有覆盖区间。问题转换成如何选取相互无重合部分的区间,以 SS 串的左端点为起点,能覆盖最大的连续区域。

对区间以左端点为关键字,从小到大进行排序。定义数组 bib_i 记录点 ii 的左侧是否已被全部无重合地覆盖。枚举区间,若区间左端点的左边已全部覆盖,即 bl=1b_l = 1,则该区间可选取,使 br+1=1b_{r+1} = 1。同时更新答案 ans=rans = r

阅读全文 »

简介

set 和 multiset 作为 C++ STL 的一部分,由红黑树实现,能保持容器内元素始终有序。其插入、查找、删除的时间复杂度均为 Θ(logn)\Theta(\log n)。两者区别在于 set 不允许有重复元素,multiset 允许有重复元素。

这里顺便提起 unordered_set 和 unordered_multiset,底层实现是哈希表,容器内元素无序。插入、查找、删除的时间复杂度最好为 Θ(1)\Theta(1),最坏为 Θ(n)\Theta(n)。空间换时间。

阅读全文 »