哈哈嗨我又来了嗷。考虑到这次 ABC 没有英文题解,洛谷搬题速度的浮动范围的相对误差为 \frac{1}{eps},所以发在这里。
别问我为什么没有 G 题题解。
代码在比赛搜我的用户名 chenxi2009 找提交记录。
A
入门模拟题。
我们读入字符串 S,依次判断最后三个字母是否依次为 t、e、a 即可。
B
入门模拟题。
我们读入字符串 S,遍历其每个子串 S[i\cdots j],数其中 t 的个数,按题意计算出分数并取 \max 即可。
对 t 的个数做前缀和可以做到 O(\vert S\vert)。
C
橙/黄,二分,排序。
这种题还是比较抽象呃。
考虑对手最多把每种茶包都拿出 b-1 个,再多拿出一个他就输了。所以考虑对每一个 b 预处理出答案,为每一种茶包至多拿出 b-1 个可以取出多少个,再加上一。
考虑由 b-1 的答案推知 b 的答案,两个答案的差值是“有多少种茶包的个数大于等于 b-1 ”,提前把 A 排序后二分递推即可。注意特判无解。无解当且仅当 b>\max A_i。
D
黄,也许可以称得上是动态规划题?
观察一个子串,考虑怎么样的子串是美丽的。
注意到后三种操作不会改变 0 的个数,第一种操作会使得 0 的个数 -2。所以当 0 的个数为奇数时,一定最后会剩下一个 0。反之易证 0 可以被消灭完。因此一个子串是美丽的当且仅当 0 的个数是偶数。
套路化地,把一个子串当做两段前缀相减,子串的 0 的个数是偶数当且仅当两段前缀的 0 的个数奇偶性相同。统计 0 的个数为奇数的前缀个数 a,偶数为 b (注意在这里我们把空的前缀也当做一个前缀),则答案为 \begin{pmatrix}a\\2\end{pmatrix}+\begin{pmatrix}b\\2\end{pmatrix}。
时间复杂度 O(N)。
E
黄,数学。做法比较多样。
考虑枚举所有 O(N^2) 个点对构成的边,根据题目定义梯形的定义是有至少一对对边平行的四边形,容易想到根据这些边的斜率做统计,答案为 \sum_{斜率 x}\begin{pmatrix}以 x 为斜率的边数\\2\end{pmatrix}。吗?
还没完。注意到这样子平行四边形有两组对边平行,会被统计到两次。考虑用上面那个答案减去平行四边形的个数。
根据初三几何知识,平行四边形对边平行且相等,一种做法是统计斜率的时候再加上边长,统计平行且相等的边对数。另一种做法是我们知道平行四边形的对角线相互平分,也就是它们的对角线共用中点,枚举中点统计边对也可。
实现可以使用 map,时间复杂度 O(N^2\log N),需要卡常。也可以使用手写哈希或 unordered_map,注意非基础类型,如 pair 作为键时需要手写一个返回值类型为 size_t(值域同 long long)的 pair 的函数 Hash 用来为 unordered_map 提供哈希的第一步映射。具体实现 bdfs,反正不会影响 unordered_map 本身的正确性,顶多影响时间效率罢了。时间复杂度 O(N^2),大常数。
F
蓝/紫,动态规划,组合数学,矩阵乘法,线段树。
求勘误&观感反馈。
思路
相邻两个茶壶中至少有一个装茶,等同于不能有两壶相邻的咖啡。我们考虑朴素的动态规划,f_{i,j,0/1} 表示 i 个茶壶,其中有 j 壶咖啡,最后一壶是茶/咖啡的方案数。递推式为(当前不考虑 a_i 的限制):
发现这个式子很像组合数的递推式啊,简单思考发现令 G_{i,j} 为 i 壶中有 j 壶为咖啡的方案数,则有 G_{i,j}=\begin{pmatrix}i-j+1\\j\end{pmatrix}。这个是插板法经典结论就不在这里细说了。
接下来我们考虑在两个相邻的有值的 a_i 之间进行状态转移,接下来我们令 f_{i,0/1} 表示前 i 个茶壶,有 a_i 个装了咖啡,最后一壶是茶/咖啡的方案数。考虑由 i 转移到 j,令 l=j-i,d=a_j-a_i,有:
因为我们限制了第 j 壶是茶,所以要在剩下 l-1 个位置中选出 d 壶咖啡。
因为我们限制了第 j 壶是咖啡,所以第 j-1 壶是茶,剩下 l-2 个位置中有 d-1 壶咖啡。
第 i+1 个位置一定是茶,第 j 个位置为茶,剩下 l-2 个位置中有 d 壶咖啡。
第 i+1 个位置一定是茶,第 j 个位置为咖啡,所以第 j-1 个位置为茶,剩下 l-3 个位置中有 d-1 壶咖啡。
发现可以写成矩阵乘法的形式:
然后就比较明了了,我们对每个有值的 a_X 挂一个矩阵,求值就是用 \begin{bmatrix}0 & 1\end{bmatrix} 和依次乘起来的所有矩阵相乘即可。
结束了吗?没有结束,最后还有一段是没有咖啡的个数的限制的。手玩或者简单推可以发现长度为 i 的没有个数限制的填充方案数为 F_{i+2},F 为斐波那契数列。
整理可得令上面求值那一步得到的矩阵是 \begin{bmatrix}A & B\end{bmatrix},最后一个有值的 a_i 为 a_{lst},则答案为 A\times F_{n-lst+2}+B\times F_{n-lst+1}。
挂矩阵的操作用一个线段树维护矩阵乘法即可,另开一个 set 记录有值的 a_X 的位置,易知修改 a_X 只会影响 X 和 X 后第一个有值的位置的矩阵,做单点修改就行。
我们视矩乘复杂度为常数,时间复杂度为 O(N+Q\log N)。
不建议使用 vector 实现矩乘,否则需要大力卡常。