省选模拟 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。

正解咕咕。。

posted @ 2022-02-09 10:00  -zxb-  阅读(64)  评论(0编辑  收藏  举报