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 说有点感觉了,和吟唱的金色花海有点像。
CF1557总结的更多相关文章
随机推荐
- git如何把本地文件夹和远程仓库关联
场景: 1,有一个本地项目,没有上传到git过,你在远程新建了一个仓库,想把这个本地的代码推送到该仓库 2,直接想把本地代码推送到远程并创建该本地文件对应的仓库(这种情况不可以实现) 解决方法: 本地 ...
- CTF学习笔记(三)php部分
三.常见PHP用法与漏洞 (〇)php的备份文件与phps php的备份文件一般是*.php.bak,在根目录下输入/index.php.bak, 下载 备份文件. phps文件就是php的源代码文件 ...
- python multiprocessing调用cython openmp方法需要采用spawn方式
先说结论,在Linux系统,如果python multiprocessing要调用的cython的方法中包含了多线程,比如openmp C code,必须手动设定spawn方式产生多进程. 更多的细节 ...
- Metasploit渗透测试框架二
Metasploit基本使用方法 Metasploit基本命令 Metasploit程序需要使用Postgresql数据库. Postgresql是一种特性齐全的自由软件的对象-关系型数据库管理系统( ...
- LENGTH,LENGTHB
LENGTH 1.语法 length(string) 2.说明: 统计字段的字符长度 3.示例: select length('abcd') from dual; --返回值:4 select len ...
- vue+vant打包,vue+vant-ui小程序,微信支付
微信JS支付代码_前端调用微信支付接口 其实参照官方文档一步一步操作不是很难,但很多人在签名这个地方就总是出现问题,因为文档中签名时使用的字段大小写时错误的....好坑啊!!然而PHP版本的代码官方有 ...
- kafka 常见命令以及增加topic的分区数
基础命令 1.创建topic kafka-topics.sh --bootstrap-server ${kafkaAddress} --create --topic ${topicName} --pa ...
- Java-如何打包下载成.zip文件
打包下载成.zip文件 项目背景 公司使用vue + SpringBoot实现批量下载功能 今天在调试批量下载这个功能.打包成.zip文件时,在返回给前端浏览器出现报错信息: 后端报错: ERROR ...
- 使用Apache PDFBox实现拆分、合并PDF
目录 使用Apache PDFBox实现拆分.合并PDF 问题背景 Apache PDFBox介绍 拆分PDF 合并PDF 拆分 + 合并 完整代码 参考: 使用Apache PDFBox实现拆分.合 ...
- JS 根据base64获取文件宽高
const {width, height} = await this.getImgSize(base64) async getImgSize(base64) { const image = new I ...