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 说有点感觉了,和吟唱的金色花海有点像。

CF1557总结的更多相关文章

随机推荐

  1. Javaweb 登陆与验证码

    本次记录分角色登陆以及验证码的Servlet. 1.登陆验证 <html><%-- Created by IntelliJ IDEA. User: jiachenglin Date: ...

  2. SimplCommerce 核心

    EF配置 using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks ...

  3. mysql8改密码

    登录后执行语句 ALTER USER 'test'@'localhost' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY '新密码'; 修改Host范围 updat ...

  4. 剑指 Offer II 二分查找

    068. 查找插入位置 class Solution { public: int searchInsert(vector<int>& nums, int target) { int ...

  5. 51电子-STC89C51开发板:目录

    51电子(我要电子:www.51dz.com),是国内最早一批的电子类相关网站,在深圳有实体店. 这个系列文章以 STC89C51 来做笔记,讲解使用过程. --------------------- ...

  6. TCP&UDP测试工具使用方式方法

    第一项:测试TCP 步骤1:首先需要一台电脑上建立一个TCP服务器.并设置一个端口号如下图60003即可.并开启服务 步骤2:在另外一台电脑上,创建一个客户端连接,如下图.输入服务器的IP地址和端口号 ...

  7. 3、app自动化:使用appium定位元素的方式及元素的常用操作

    前提: 没有的包,要先进行对应包的安装 如:pip install Appium-Python-Client 一.定位元素,包括属性定位和xpath定位方式 a\属性定位 属性 定位方式     示例 ...

  8. 阻塞I/O,非阻塞I/O,同步I/O,异步I/O

    根据应用程序是否阻塞自身运行分为: 阻塞I/O:是指应用程序在执行I/O操作后,如果没有获得响应,          就会阻塞当前线程,不能执行其他任务. 非阻塞I/O:是指应用程序在执行I/O操作后 ...

  9. Pyodide读取CSV、EXCEL

    from pyodide.http import pyfetch, open_url pyfetch(url="/your/URL/goes/here", method=" ...

  10. 搭建Kubord管理k8s/EKS以及Harbor私有仓库教程

    eks首先要去aws后台进行创建,这里不再讲解详细的过程,下面讲解如果通过命令行以及kuboard调度esk服务. 安装docker以及docker-compose yum install docke ...