Codeforces 559E - Gerald and Path(dp)
真·难度 *3000 的 D1E hb 跟我们说“做不出来不太应该”。
首先我们将所有线段按 \(a_i\) 从小到大排序,一个很显然的想法是 \(dp_{i,j,d}\) 表示我们已经钦定了前 \(i\) 个线段的方向,其中右端点最靠右的线段为 \(j\),它的方向为 \(d\) 所覆盖的最大长度是多少。
接下来考虑转移,考虑从 \(i\) 转移到 \(i+1\),那么线段 \(i+1\) 覆盖 \(j\) 与 \(i+1\) 中间的部分的长度就是 \(\min(\text{线段}\ i+1\ \text{的右端点}-\text{线段}\ j\ \text{的右端点},\text{线段}\ i+1\ \text{的长度})\)。
但是我们这样计算线段 \(i+1\) 的贡献是错误的,因为可能会出现以下的情况:
这种情况下贡献是无法直接计算的。不过我们注意到在这种情况下线段 \(j\) 被完全包含在线段 \(i\) 中,也就是说线段 \(j\) 的贡献为 \(0\)。于是我们考虑另一种转移方式:枚举下一个被计入贡献的线段 \(k\),直接忽略线段 \([i+1,k-1]\) 的贡献。然后按照上面的方式计算即可——虽然我们知道可能 \([i+1,k-1]\) 中的线段也会产生贡献,也就是说我们算出来的贡献不一定是真正的贡献。但是我们清楚,我们忽略了这些贡献,所得到的答案一定没有标准来得更优,并且最优方案一定会被我们考虑到,所以我们这样计算贡献也是正确的。
回到本题来,我们这样计算其实还会忽略一种贡献,那就是在 \([i+1,k-1]\) 中右端点最靠右的线段 \(j\) 的右端点超过了 \(k\) 的右端点,那这样还会产生 \(\text{线段}\ j\ \text{的右端点}-\text{线段}\ k\ \text{的右端点}\) 的贡献,如下图所示:
也就是说,对于 \([i+1,k-1]\) 的线段,我们贪心地钦定每个线段都朝右(我们假设这些线段朝左都没有贡献了),然后看是否存在某条线段右端点超过 \(k\)。
具体来说,我们枚举 \(k\in [i+1,n]\),以及 \(k\) 的方向 \(d_k\),然后在枚举的过程中,记录下右端点最大的线段编号 \(r\),方向 \(d_r\)。然后 \(\mathcal O(1)\) 从 \(dp_{i,j,d}\) 转移到 \(dp_{k,r,d_r}\),那么它产生的贡献就是 \(\text{线段}\ r\ \text{的右端点}-\text{线段}\ k\ \text{的右端点}+\min(\text{线段}\ k\ \text{的右端点}-\text{线段}\ j\ \text{的右端点},\text{线段}\ k\ \text{的长度})\)。
时间复杂度 \(\mathcal O(n^3)\)
Codeforces 559E - Gerald and Path(dp)的更多相关文章
- codeforces 762 D. Maximum path(dp)
题目链接:http://codeforces.com/problemset/problem/762/D 题意:给出一个3*n的矩阵然后问从左上角到右下角最大权值是多少,而且每一个点可以走上下左右,但是 ...
- CodeForces - 710E Generate a String (dp)
题意:构造一个由a组成的串,如果插入或删除一个a,花费时间x,如果使当前串长度加倍,花费时间y,问要构造一个长度为n的串,最少花费多长时间. 分析:dp[i]---构造长度为i的串需要花费的最短时间. ...
- Educational Codeforces Round 51 D. Bicolorings(dp)
https://codeforces.com/contest/1051/problem/D 题意 一个2*n的矩阵,你可以用黑白格子去填充他,求联通块数目等于k的方案数,答案%998244353. 思 ...
- Codeforces 536D - Tavas in Kansas(dp)
Codeforces 题目传送门 & 洛谷题目传送门 其实这题本该 2019 年 12 月就 AC 的(详情请见 ycx 发此题题解的时间),然鹅鸽到了现在-- 首先以 \(s,t\) 分别为 ...
- Codeforces 295D - Greg and Caves(dp)
题意: 给出一个 \(n \times m\) 的矩阵,需对其进行黑白染色,使得以下条件成立: 存在区间 \([l,r]\)(\(1\leq l\leq r\leq n\)),使得第 \(l,l+1, ...
- Codeforces 467C George and Job(DP)
题目 Source http://codeforces.com/contest/467/problem/C Description The new ITone 6 has been released ...
- Codeforces A ACM (ACronym Maker) (dp)
http://codeforces.com/gym/100650 概要:给出一个缩写,和一些单词,从单词中按顺序选一些字母作为缩写,问方案数. 限制:某些单词要忽略,每个单词至少要选一个字母. dp[ ...
- codeforces 813 D. Two Melodies(dp)
题目链接:http://codeforces.com/contest/813/problem/D 题意:求两个不相交的子集长度之和最大是多少,能放入同一子集的条件是首先顺序不能变,然后每一个相邻的要么 ...
- CodeForces - 446A DZY Loves Sequences(dp)
题意:给定一个序列a,求最长的连续子序列b的长度,在至多修改b内一个数字(可修改为任何数字)的条件下,使得b严格递增. 分析: 1.因为至多修改一个数字,假设修改a[i], 2.若能使a[i] < ...
随机推荐
- ruby基本图片上传
图片上传问题 在我们的项目里,需要实现海报的图片上传,便于更好地向外界展示一个社团活动的基本内容,但是在处理中间件相关问题时遇到了一点小小的挫折.不过这并不要紧,OSS对象存储服务固然好,但是本着交完 ...
- 热身 for computer industry
项目 内容 作业属于 班级博客 作业要求 作业要求 个人课程目标 掌握软件工程基础知识 具体有助方面 个人认知与规划 其他参考文献 博客Ⅰ 博客 Ⅱ 选择计算机 你为什么选择计算机专业?你认为你的条件 ...
- (六)、Docker 之 Dockerfile
1.什么是Dockerfile Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 2.Dockerfile解析过程 前提认知: 每条保留字指令都必须为大写字母 ...
- 热身训练4 Eighty seven
Eighty seven 简要题意: n个卡片,其中第i个卡片的数值为$a[i]$.一共q次询问,每次询问将删去其中3个卡片(可能删除若干相同的卡片)后,问能否选出10个卡片,数值之和等于87. n≤ ...
- 2021.8.24考试总结[NOIP47]
T1 prime 发现只需筛小于等于$mid(\sqrt r,k)$的质数,之后用这些质数筛掉区间内不合法的数即可. $code:$ 1 #include<bits/stdc++.h> 2 ...
- GPIO原理与配置(跑马灯,蜂鸣器,按键)
一.STM32 GPIO固件库函数配置方法 1. 根据需要在项目中删掉一些不用的固件库文件,保留有用的固件库文件 2. 在stm32f10x_conf.h中注释掉这些不用的头文件 3. STM32的I ...
- MyBatis源码分析(三):MyBatis初始化(配置文件读取和解析)
一. 介绍MyBatis初始化过程 项目是简单的Mybatis应用,编写SQL Mapper,还有编写的SqlSessionFactoryUtil里面用了Mybatis的IO包里面的Resources ...
- PWN学习之整数溢出
目录 PWN学习之整数溢出 整数溢出 溢出和回绕 漏洞多发函数 整数溢出例子 PWN学习之整数溢出 整数溢出 如果一个整数用来计算一些敏感数值,如缓冲区大小或数值索引,就会产生潜在的危险.通常情况下, ...
- java性能优化常用工具jps、jstat、jinfo
jps:虚拟机进程状况工具 jps可以用来查看虚拟机进程,基本等同于ps -ef|grep java #查看jps的使用文档 [root@localhost script]# jps -help us ...
- 在Ubuntu下的C语言编程
以运行在虚拟机下的Ubuntu为例: mkdir fenchen 来创建一个文件夹 cd fenchen 切换到这个文件夹下面 vi test.c 创建并编辑一个test.c文件 按 i 编辑,之后把 ...