CF1557总结

CF1557总结

Codeforces Round #737 (Div. 2)

先看了 A 。意思是要把序列分成两个子序列,使得两序列各自平均值的和最小,输出最小值,要求 \(O(n)\) 。想半天然后猜结论,搞了十来分钟结果发现好像可以直接拿最大的分一组。其他的分一组,然后几分钟打完发现是对的。

然后看B,是问把序列断成 \(k\) 块,再重拼能不能给他排好序。看到 \(T \le 10^3\)\(N \le 10^5\) ,以为是 \(O(n)\) ,但我只会离散化然后统计有几个地方要断开,而离散化是带 \(log\)​ 的。于是放下 B 看了 C 。

C 很有意思,是一道数论题。问有多少构造正整数集合 \(S\)​ 方案可以使得其与和大于等于异或和。题目中对 \(S\) 的限制还有:必须包含 \(n\)​ 个元素,且每个元素都要小于 \(2^k\)​ 。显然,最后一个限制是说元素二进制下为 \(k\)​​ 位。那我们套路地考虑从大向小的一个比较过程,因为位运算中每一位是独立的,而且如果前面的位有了区别,那后面的位是没有贡献的。考虑从当前位开始比较,那么当有奇数个 \(1\) 且不是所有数都是 \(1\) 时,对答案没有贡献(异或和比较大)。当有偶数个 \(1\) 而且也不是全 \(1\) 时,还是分不出大小,所以这些情况需要留到下一位去解决。有奇数个 \(1\) 而且全都是 \(1\) 时,也是不分大小。而当有偶数个 \(1\) 且全部是 \(1\)​ 时,已经可以对答案进行贡献了。然后把每种的当前位方案数,得到的贡献算一下,然后递归或者递推一下就行了。

这时候回到 B ,发现数据范围其实是 \(\sum n \le 3 \times 10^5\)​ ,那就用前面提到的 \(O(n\log n)\)​​ 离散化做法即可。

然后来看D,就是问,给定一个长度为 \(n\) 的有序序列,每个元素是一个区间集合,最少删去多少个,使得剩下的序列中,每两个相邻的区间集合都相连,相邻两个区间集合连在一起定义为 \(S_1\) 中某个区间与 \(S_2\) 中某区间有交集。总区间数为 \(m\) 。复杂度要求是 \(O(n\log n)\) 级别。我乱想半天,什么鬼都没想到,就想到均摊 \(O(nm)\) 的能否连的预处理。估计着也写不出来了,于是弃疗,口胡起来。结果口胡一个 DP ,三维。乱想两下,发现可以变成一维。即设 \(dp_i\) 表示已经处理前 \(i\) 个区间集合,且最后一个保留的区间集合是 \(i\) 时,最小的删除数。然后考虑转移时 \(dp_i = \min \{ dp_j +(i-j-1)|j\text{与}i\text{相连}\}\) 这时候如何做到 \(O(\log n)\) 转移。显然要离散化,然后我最开始想到要把 \(j\) 用挂表法挂在塔包含的区间中,然后就可以访问到每一个可能转移的 \(j\) 。继续优化,考虑转化方程,提出 \(i\) 来,就是\(dp_i = \min \{ dp_j -j|j\text{与}i\text{相连}\}+i-1\) 这样,我们就不需要挂表了,直接考虑在这个区间的最小值更新一下。想到这里,显然可以直接线段树维护一下。至于复杂度,总的区间数是 \(m\) 个,离散化后要 \(4m\) 个位置,所以复杂度实际上是 \(O(n+m\log(4m))=O(m\log m)\)​。可惜的是,到最后结束5分钟才写出来,而且懒得再维护方案了(光是求答案就花了25分钟)。结束后,PCQ 说这个题很套路,反正我是没见过这类的套路,不过我的思路确实绕了个大圈子才想到正解。

E 也蛮有意思,是个国际象棋交互,你控制后,对面有只王。你不知道王的位置,但知道你每走一步后王往哪个方向走了。要求你在 \(130\) 步内让王无路可走。CZA 说有点感觉了,和吟唱的金色花海有点像。

posted @ 2021-08-10 21:33  Diwanul  阅读(46)  评论(0编辑  收藏  举报