A
题解
知识点:模拟
时间复杂度 \(O(1)\)
空间复杂度 \(O(1)\)
代码
B
题解
知识点:模拟。
倒着来,很方便。
时间复杂度 \(O(n)\)
空间复杂度 \(O(n)\)
代码
C
题解
知识点:贪心,枚举。
显然最小花费是 \(|s[n]-a[1]|\) ,最大化路线的方式是按序走过 \(s[1]\) 到 \(s[n]\) 的所有字母。
把每个字母的下标放进桶中 , \(s[1]\) 比 \(s[n]\) 小则从 \(s[1]\) 正序,否则从 \(s[1]\) 倒序。
时间复杂度 \(O(n)\)
空间复杂度 \(O(n)\)
代码
D
题解
知识点:贪心,枚举,双指针。
处理出 \(y-x\) 得到每个成员的贡献,从小到大排序,最小的和最大的两人一组即可最大化分组数量,不能分配就跳过较小的。
时间复杂度 \(O(n)\)
空间复杂度 \(O(n)\)
代码
E
题解
知识点:贪心。
\(i\) 从 \(2\) 开始依次询问。先询问 \((1,i)\) ,如果结果 \(-1\) 则输出 \(i-1\) ;否则,再询问一次 \((i,1)\) ,如果答案和 \((1,i)\) 不同则输出两个答案之和,否则继续下一个 \(i\) 。除去特判 \(n \in [3,25]\) 会因为询问到 \(-1\) 结束的情况,其他情况只需要一组答案不同即可,概率很高。
时间复杂度 \(O(1)\)
空间复杂度 \(O(1)\)
代码
F
题解
知识点:枚举,前缀和,数论。
注意到一个数字 \(\mod 9\) 的答案和所有数位加起来 \(\mod 9\) 的答案相同,因此先对 \(s\) 数位预处理模意义前缀和。
然后处理出所有 \(w\) 长度的串的余数,把串首坐标放进桶中对应余数的位置,只需要存两个最左边的即可。
对于每组询问,遍历余数 \(a,b\) 满足 \(a \cdot re + b \equiv k \pmod 9\) ,其中 \(re\) 为 \([l,r]\) 的余数。将余数 \(a,b\) 对应的串下标更新一下答案即可,答案可以用 pair
存,方便更新。注意特判 \(a = b\) 的情况,需要同一个余数的前两个下标。
时间复杂度 \(O(n+m)\)
空间复杂度 \(O(n)\)
代码
G
题解
知识点:线性dp。
预处理出 \(s\) 中所有能删除 \(t\) 的下标,暴力 \(O(n^2)\) 处理即可,存进 vector
。随后dp一下前 \(i\) 个能删除位置的最小删除次数。
设 \(f[i]\) 为考虑到第 \(i\) 个能删除的位置,删除 \([1,v[i]]\) 所有能删除的段,且一定删除第 \(i\) 段的最小删除次数。设 \(tot[i]\) 为能够达成 \(f[i]\) 删除次数的对应的方案数。
对于 \(v[i]\) ,我们枚举上一个删除的位置 \(v[j]\) ,先保证 \(i,j\) 不重合即 \(v[i]-v[j]\geq m\) ,然后保证 \(i,j\) 中间没有别的能删除的段即 $v[k] - v[j] < m $ 以及 $ v[i] - v[k] < m$ 。于是可以转移:
最后统计末尾重合的一段的最小删除次数,以及对应的总方案数。
时间复杂度 \(O(nm^2)\)
空间复杂度 \(O(n)\)
代码
标签:
留言评论