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] < ...
随机推荐
- 【UE4】GAMES101 图形学作业5:光线与物体相交(球、三角面)
总览 在这部分的课程中,我们将专注于使用光线追踪来渲染图像.在光线追踪中最重要的操作之一就是找到光线与物体的交点.一旦找到光线与物体的交点,就可以执行着色并返回像素颜色. 在这次作业中,我们要实现两个 ...
- 力扣 - 剑指 Offer 53 - I. 在排序数组中查找数字 I
题目 剑指 Offer 53 - I. 在排序数组中查找数字 I 思路1 一般来说,首先想到的是使用一个变量,从头开始遍历整个数组,记录target数组出现的次数,但是这样的时间复杂度是O(n),还是 ...
- Noip模拟21(持续翻车)2021.7.20
读题总是读错是不是没救了... T1 Median 中位数:按顺序排列的一组数据中居于中间位置的数. 能用上的高亮符号都用上了... 当时忘了就离谱.... 理解什么是中位数(真是个憨憨)后就可以开始 ...
- 2021.7.29考试总结[NOIP模拟27]
T1 牛半仙的妹子图 做法挺多的,可以最小生成树或者最短路,复杂度O(cq),c是颜色数. 我考场上想到了原来做过的一道题影子,就用了并查集,把边权排序后一个个插入,记录权值的前缀和,复杂度mlogm ...
- 常用Java API:Calendar日期类
摘要 在蓝桥杯中有关于日期计算的问题,正好java中的Date类和Calendar类提供了对日期处理的一些方法.Date类大部分方法已经废弃了,所以本文将详细介绍Calendar类. Calendar ...
- Spring Cache 带你飞(一)
Spring 3.1 版本引入基于 annotation 的 cache 技术,提供了一套抽象的缓存实现方案,通过注解方式使用缓存,基于配置的方式灵活使用不同缓存组件.代码具有相当的灵活性和扩展性,本 ...
- linux中的strip命令简介
转载:https://blog.csdn.net/qq_37858386/article/details/78559490 strip:去除,剥去 一.下面是man strip获得到的信息,简 ...
- IP数据报中如果不分片,分片标志值是什么?
过了好久才解决这个简单的问题,罪过罪过- 答案:如果IP数据报不分片,分片标志DF(Don't Fragment)会被设置为1.分片标志MF(More Fragment)设置为0. 下面是详细解释: ...
- log4j日志集成
一.介绍 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务 器.NT的事件记录器.UNIX Syslog ...
- feign微服务调用携带浏览器信息(header、cookie)
import feign.RequestInterceptor; import feign.RequestTemplate; import org.apache.commons.collections ...