省选模拟 12
我觉得模拟赛还是写写题解吧,以后找的时候方便。
今天T2挂没了,很不爽。
数列
首先\(O(n^3)\) 的dp显然,枚举分段的端点即可转移。期望得分 40pts。
考虑优化,发现分段的右端点确定的话对于不同左端点的最大值是单调的,于是把平方式子拆一下就可以斜率优化。
斜率优化掉了第二维的枚举,复杂度\(O(n^2)\)。期望得分 60pts。
发现有个特殊性质,序列单调递增,此时我们不需要知道分段的左端点是谁,因为最大值一定是右端点,所以上面的dp变成了一维,维护凸包或者是李超线段树都可以。
这一部分复杂度\(O(n)\)或者\(O(nlogn)\)。期望得分 70pts。
发现上面做法的瓶颈在于枚举端点,因为只有这样才能找出对应的区间最大值。
但是我们可以直接枚举当前为最大值,转移只从前面最大值转移即可。
这里前面可能会有不合法的情况,就是说中间存在比两边都大的数。但是这种情况是一定不优的,所以可以不用在乎他的影响。
显然,最优情况下最后一段的最大值一定是右端点。复杂度 \(O(nlogn)\),期望得分 100pts。
差量
我们直接对每个位置用 qry1,期望得分 10 pts.
序列的值互不相同,实际上我们只需要用qry1找出两个值来,剩下的一个一个用qry2确定即可。期望得分 30pts。
考虑一个事情,我们如果知道序列的一个最值,那么根据差值可以直接确定每个位置的值。
由于权值互不相同,所以每一个差值都是独一无二的,枚举二进制位,每次将下标当前这一位是1的扔进去算差值,一遍加上最值,一遍没有最值,两者得到的集合之差就是每个数和最值的差值。
这样对于每一个差值,我们都可以看它在每个二进制位中是否出现过,从而可以确定这个数的位置。
那么现在的问题变成了求出一个最值。
首先整个序列问一边我们可以得到极差,然后二分一个前缀从而可以得到一个最值的位置,然后qry1把它问出来,然后在看是最大还是最小即可。
询问次数\(3logn\)。期望得分 100pts。
异或
我们直接装压dp,第一维为填的个数,第二维为前缀异或和。暴力转移。期望得分 25pts。
正解咕咕。。