让死亡觊觎我
让恐惧亲吻我……
[A]
不是出题人你T1就不可以稍稍降一下难度吗
开题看到这玩意真的心脏骤停。
当然赛后补出来确实不难。
对全部数排序,并对每个序列排序,枚举最小数;对每个序列维护一个指针,指向后 c_i 个数的位置。当最小数往右移动一格时,只会造成一个序列的指针改变;同时一个序列的最大值改变,由于最大数单调递增,因此直接对当前最大值取 max 即可。(官方做法)
事实上还可以使用 priority_queue 来维护这个过程,做法和上面是类似的。
[B]
最多人过的一题。
倒着模拟即可。
[C]
不是当我 DFS 过了的时候心里真的想骂人。
不过仔细想想也很正常,因为 x \leq 10^9 ,而 2\times 3 \times 5 \times …\times 29 \geq 10^9,因此 DFS 的复杂度是完全可接受的。
[D]
神秘DP。
先对原序列做一遍前缀和,有转移 $fi=\sum{j=len+1,其中f[x][Q1.front()]是f当前行l到r的最小值,g[x][Q1.front()]是g当前行l到r$ 的最小值
既然是只维护最小值,那么就可以上线段树/单调队列。
很显然单调队列复杂度更优,也不容易被卡。
[G]
好妙的一题。
首先我们考虑一下暴力的过程,再逐步来优化它。
首先我们要从小到大枚举一个长度,然后我们要找到这个长度下两个相等且连续的串,然后删除其中一个,重复这个过程。
首先枚举长度肯定优化不掉,但是找到此长度下相等且连续的串,这就有优化的空间了。
我们记当前枚举的长度为 len ,每次我们只枚举 1\times len、2\times len、3\times len …的位置,然后判断 LCP(i-len,i)+LCS(i-len,i) 是否 \geq len ,如果有,那么就存在两个长度相同且相邻的串了。(LCP指最长公共前缀,LCS指最长公共后缀)。
怎么快速求 LCP/LCS ?很显然是可以上后缀树组的,但是没有必要(而且我也不会写),那么我们直接hash一下(况且这样还更快)。
至于删除?不用担心,由于 1+2+3+…+2\sqrt|S| \geq |S|,意味着
不会超过 \sqrt |S| 种子串,因此暴力删除的复杂度最差是 O(n \sqrt n) 的,跟分块一样快。
至此这题就结束了,需要注意实现时下标的一些细节。