CF1534F2 Falling Sand (Hard Version)
个人思路:
每个点向相邻沙子连边,向本列和相邻 \(2\) 列下方第一个沙子连边。
对于一个 DAG,所有入度为 \(0\) 的点会覆盖全部点。我们缩点即可通过 F1。
但是这样做是过不了 F2 的。
我们发现一个沙子下落,其下面的所有沙子都会下落,也就是说,第 \(i\) 列从下往上第 \(a_i\) 个沙子一定会直接或间接下落。
我们维护每行取最上方的沙子,它一定能覆盖一个连续的区间。因为每行只能让相邻两列下落,不可能不连续。
那么我们只需要求出每列最高点的覆盖区间,这个问题就转化为了区间覆盖问题。
先求区间。
我们对每个点计算相邻两列不比这个点高的最高点的位置,对其建边。这可以通过从低往高枚举每一行实现。
我们从每列最高点分别向两边搜索,不断沿边走,到达一个点后不断往上走直到上方相邻的点没沙子。以左边为例,在第 \(i\) 列小于 \(a_i\) 时,停止搜索,此时区间左端点就是 \(i+1\)。
然后区间覆盖,比较简单。
我们维护下标 \(now\) 与 \(R\),表示当前覆盖了 \([1,now]\),已有线段中可以覆盖到 \(R\)。到一个节点时,用以该节点为左端点的线段更新 \(R\),如果这个点没有被覆盖,\(now \leftarrow R\),表示直接覆盖到 \(R\)。
上述算法假了,hack 如下:
6 8
#.#..##.
..####..
..#..###
..##.##.
.#.####.
####.#..
1 2 2 3 1 5 2 1
显然可以在第 \(4\) 列走回第 \(3\) 列,第 \(1\) 列即可覆盖所有。
必须 dfs。与 F1 类似,向本列和相邻 \(2\) 列下方第一个沙子连边,然后暴力沿边搜索。
最坏情况下每个点走一遍全图,直接寄。
然后就不会了。
正解:
上述算法是假的,一个点覆盖区间连续的结论是错误的,例如 test #\(5\)。
但是我们发现可以覆盖一个点的列是连续的区间,因为如果某一列最高点不能覆盖到一个点,整列的点都不能覆盖到这个点,而外面的列需要通过这一列,也覆盖不到。我们可以通过 dfs 计算每个点的区间左端点和右端点。
我们从左到右枚举每列最高的位置,从这里进行搜索,搜到的点的区间左端点为当前枚举到的列。我们不搜已经搜过的点,因为是从左往右搜,先搜到的一定比后搜到的更优。
题目转化为若干个限制条件 \([l_i,r_i]\) 表示区间内的数至少选一个。
我们贪心选点。假设我们上一个选点位置 \(pre\),这一次选点位置 \(p\) 应当满足:
- \(p\) 最右可以选到所有 \(l_i > pre\) 的限制中 \(r_i\) 的最小值,否则不满足限制。
- \(p\) 选的越靠右越好,因为剩下的限制更少,接下来选点数更少。
发现每次直接选所有 \(l_i > pre\) 的限制中 \(r_i\) 最小值,可以对每个位置预处理得到。
这道题虽然正解是建图 \(+\) 缩点 \(+\) dp \(+\) 贪心的难度为 \(3000\) 的题,却可以简单的搜索。
一定要扔进校内模拟赛。
CF1534F2 Falling Sand (Hard Version)的更多相关文章
- Using zend-paginator in your Album Module
Using zend-paginator in your Album Module TODO Update to: follow the changes in the user-guide use S ...
- CMSIS-SVD Example (Schema Version 1.1)
<?xml version="1.0" encoding="utf-8"?> <!-- File naming: <vendor> ...
- idea 2019 1 spring boot 启动报错 An incompatible version [1.2.12] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]
1.构建一个简单springboot工程,日志打印报错内容如下: 15:38:28.673 [main] DEBUG org.springframework.boot.devtools.setting ...
- ASP.NET Core: You must add a reference to assembly mscorlib, version=4.0.0.0
ASP.NET Core 引用外部程序包的时候,有时会出现下面的错误: The type 'Object' is defined in an assembly that is not referenc ...
- java -version 问题
我把 JAVA_HOME 从8改成了 7 , 为什么还是 显示的8啊 ! E:\sv0\jars>java -version java version "1.8.0_111" ...
- 记一次jdk升级引起的 Unsupported major.minor version 51.0
之前jdk 一直是1.6,tomcat 是6.x 版本,, 现在引入的新的jar, 出现 Caused by: java.lang.UnsupportedClassVersionError: org/ ...
- Java–cvc-complex-type.4:Attribut ‘version’ must appear on element ‘web-app’
问题解析: 在web.xml中的以下代码中 <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi=" ...
- 在idea中maven项目jdk编译version总是跳到1.5
bug描述 项目ide: idea 项目构建工具:maven bug现象:每次修改pom之后,idea自动扫描一遍,然后发现默认的compile级别跳到5.0. 每次手动去setting里修改comp ...
- 未能加载文件或程序集“Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5”或它的某一个依赖项。系统找不到指定的文件。
在创建ASP.NET MVC项目过程中发生了这个异常 未能加载文件或程序集"Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0 ...
- 无法解决“Microsoft.SharePoint.Security, Version=15.0.0.0,”与“Microsoft.SharePoint.Security, Version=14.0.0.0”之间的冲突
VisualStudio 2013创建控制台项目,.NetFramework选为4.5.生成目标平台:x64.然后添加对Microsoft.SharePoint.dll的引用. 生成项目时," ...
随机推荐
- JS中两个数组对象筛选
const arr1 = [ {id: 1, name: 'aaa'}, {id: 2, name: 'bbb'}, {id: 3, name: 'ccc'}, {id: 4, name: 'ddd' ...
- vmware 克隆虚拟机前删除网络文件
解决办法: 删除 /etc/udev/rules.d/70-persistent-net.rules文件,系统重启后重新自动生成 ··· rm -rf /etc/udev/rules.d/70-per ...
- git连接不上,使用git镜像
github有一个镜像网站:把github替换为kgithub
- Win上好用的App们
recaps 习惯了mac的输入法切换键(CapsLock),在win下真是各种不适应.于是,找到了这个recaps.亲测好用(Win10 LTSC,键盘布局添加的英文.中文,中文用的第三方输入法). ...
- SSB调制与解调(Simulink&Matlab)
题目:基于Simulink的SSB信号调制与解调仿真 参考文章 一.实验目的与要求 目的:学习SSB信号的调制与解调仿真 要求: 具有MATLAB的仿真结果并附上代码 具有基于Simulink的模块的 ...
- HIVE- 删除功能
删除分区: ALTER TABLE table_name DROP PARTITION (partition_name='20220101');
- 传递数据(props)
student.vue <template> <div> <h3>{{msg}}</h3> <h3>姓名:{{name}}</h3&g ...
- Linux下clang、gcc、intel编译器最新版本安装笔记
转自 http://t.zoukankan.com/opangle-p-2838554.html
- 雪花算法生成ID重复问题
转载自: https://www.jianshu.com/p/71286e89e0c5
- mysql企业常用集群架构
转自 https://blog.csdn.net/kingice1014/article/details/76020061 1.mysql企业常用集群架构 在中小型互联网的企业中.mysql的集群一般 ...