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的引用. 生成项目时," ...
随机推荐
- ts(keyof,typeof)
ts(keyof,typeof) keyof 获取某类型的键,返回联合类型 interface Person { hair: string; eyesColor: string; } let P1 = ...
- element的upload手动submit前动态设置上传请求地址
标签地址绑定一个变量 动态修改上传请求地址代码: nextTick是DOM更新后触发,不使用nextTick直接submit,上传地址仍然会使用初始url地址 _this = this; this.u ...
- 洛谷 P4048更新题面
[JSOI2010]冷冻波 题目描述 WJJ 喜欢"魔兽争霸"这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能 Frozen Nova 每次可以杀死一个小精灵.我们认为,巫妖和小 ...
- Ubuntu系统添加新的普通用户
1.创建一个新的普通用户 创建了可以登录的yang用户并使用/bin/bash作为shell. 设置密码. 为yang用户增加管理员权限. 切换登录用户为yang. sudo useradd -m y ...
- vue2和vue3配置全局自定义参数及vue3动态绑定ref
在 Vue2.x 中我们可以通过 Vue.prototype 添加全局属性 property.但是在 Vue3.x 中需要将 Vue.prototype 替换为 config.globalProper ...
- Docker 安全加固
一.docker安全加固 1.利用LXCFS增强docker容器隔离性和资源可见性 (proc容器与宿主机之间是共享的 没有进行隔离) 此rpm包在真机桌面q目录中 需先传到虚拟机/root/下 在 ...
- “初始化 Java 工具”期间发生了内部错误, java.lang.NullPointerException
今天刚打开eclipse就报了这个错误,我怀疑是昨晚想关电脑的时候,关闭eclipse太快,没有等待工作空间保存就关了电脑的缘故 错误如图: (图片来自下方链接博客,因为忘记截图了) 我百度后按照提示 ...
- Linux 升级 gcc g++
Linux 升级 gcc g++ Centos7 上升级 gcc g++ # yum -y install centos-release-scl # yum -y install devtoolset ...
- 【QT】打包QT程序
发布QT程序时需要把依赖的库拷贝到程序所在文件夹下,可以使用如下方式: 命令行输入cmd,cd 到程序所在文件夹,输入windeployqt xx.exe --release 注xx.exe是程序的名 ...
- 2023Hgame
2023Hgame Shared Diary 源代码先放一下 const express = require('express'); const bodyParser = require('body- ...