T1
发现贪心不太好做,考虑二分答案。
考虑一个答案 \(x\) 合法的条件。发现当答案为 \(x\) 时,每种芒果最多选 \(x\) 个。那么将所有芒果选最多的数量,判断是否足够即可。即 \(\sum_{i_1}^{n}{\min(a_i,x)} \ge x \cdot k\)。
在考场上,如果证明比较难,没有太多时间,单调性可以打表观察。
T2
成小丑了。没有看到一次操作的限制,所以不会做,跳过了 T2。
考虑二分长度。长度确定时,发现 check 就是进行一个滑动窗口,单调队列或 st 表都可以,预处理一下差分前缀和就好。
复杂度 \(\mathcal O(n\log n)\)。
T3
很经典的一道题目。死因为变量名写错和哈希写错。熟练度还是不够。
对于两个勉强相等的字符串,考虑找出那个不一样的字符。发现有一段前缀相等和一段后缀相等,那么可以二分+哈希找出相等的那个前缀,再判断剩余的后缀是否相等即可。
对于修改,考虑哈希的本质。哈希的本质为字符串的 \(base\) 进制的映射,即可以表示为 \(\sum_{i=1}^{n}{s_i \cdot base^{i-1}}\)。那么可以用树状数组维护前缀和,修改时加上变化量即可。
复杂度 \(\mathcal O(mn\log^2n)\)。
T4
分成两部分来做。
- 
\(\forall b < 10^6\),直接枚举 \(b\) 即可。
 - 
\(\forall b \ge 10^6\),这时候 \(x\) 最多只有三位,那么枚举 \(x\),二分十进制下第一个大于 \(y\) 的 \(b\)。
 
这种分段的思想非常好用。
有时候发现直接做不出来时,不妨从答案的角度来考虑问题。无论是二分也好,还是观察答案的性质也好,都是不错的思路。
