problem

LOJ2772

solution

这道题求的是“保证最多”,这个“保证”真的屑啊!

因为我们无法确定实验生成的克数,所以我们应当计算的是最坏情况。

又因为我们可以选择做哪些实验,所以要的是所有实验组合最坏情况下的最大价值。

如果题目读错成直接求最多,那么就会写出线段树优化 dpdpdp,结果样例都过不了!!


将答案数学化长相表示出来,设 dpi:dp_i:dpi​: 已经装了 iii 克反物质,最大保证还能获得多少价值。

转移有,dpi=max⁡1≤j≤n{min⁡lj≤k≤rj{dpi+k+1e9⋅k−cj}}dp_i=\max_{1\le j\le n}\Big\{\min_{l_j\le k\le r_j}\{dp_{i+k}+1e9·k-c_j\}\Big\}dpi​=max1≤j≤n​{minlj​≤k≤rj​​{dpi+k​+1e9⋅k−cj​}}。答案即为 dp0dp_0dp0​。

其实只要搞清楚这一点,列出这个转移,剩下的优化部分已经是非常简单的了。

k∈[lj,rj]→i+k∈[i+lj,i+rj]k\in[l_j,r_j]\rightarrow i+k\in[i+l_j,i+r_j]k∈[lj​,rj​]→i+k∈[i+lj​,i+rj​],这浓浓的滑动窗口味儿。

稍微改写一下,初始化 dpi=1e9⋅idp_i=1e9·idpi​=1e9⋅i,dpi=max⁡1≤j≤n{min⁡lj≤k≤rj{dpi+k}−cj}dp_i=\max_{1\le j\le n}\Big\{\min_{l_j\le k\le r_j}\{dp_{i+k}\}-c_j\Big\}dpi​=max1≤j≤n​{minlj​≤k≤rj​​{dpi+k​}−cj​}。

然后对每个实验都开一个维护递增的单调队列,用队首更新答案。

i−−i--i−−,弹出单调队列中不在 [i+lj,i+rj][i+l_j,i+r_j][i+lj​,i+rj​] 的元素,每次都要新加 i+lji+l_ji+lj​。

这些都是套路,时间复杂度 O(na)O(na)O(na)。

code

#include <bits/stdc++.h>
using namespace std;
#define maxn 105
#define maxv 2000005
#define int long long
const int NB = 1e9;
int n, a;
int l[maxn], r[maxn], c[maxn];
int f[maxv << 1];
deque < pair < int, int > > q[maxn];signed main() {scanf( "%lld %lld", &n, &a );for( int i = 1;i <= n;i ++ ) scanf( "%lld %lld %lld", &l[i], &r[i], &c[i] );for( int i = a + 1;i <= (a << 1);i ++ ) f[i] = -1e18; //将爆出实验的设为极小值 就不会被误判为答案for( int i = a;~ i;i -- ) {f[i] = NB * i;for( int j = 1;j <= n;j ++ ) {//[i+l(j),i+r(j)] 才会对i产生贡献 且是这段里的最小值贡献//i+l(j) 在i+1容量中没有被计入 这里计入while( ! q[j].empty() and q[j].back().second >= f[i + l[j]] ) q[j].pop_back(); //维护单增队列q[j].push_back( make_pair( i + l[j], f[i + l[j]] ) );while( ! q[j].empty() and q[j].front().first > i + r[j] ) q[j].pop_front(); //弹出不在范围内的f[i] = max( f[i], q[j].front().second - c[j] ); //实验是可以选的 所以外层dp比较取较大值}}printf( "%lld\n", f[0] );return 0;
}

「ROI 2017 Day 2」反物质(单调队列优化dp)相关推荐

  1. 算法笔记--单调队列优化dp

    单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队. 单调队列优化dp: 问题引入: dp[i] = min( a[j] ) ,i-m < j ...

  2. poj 2373(单调队列优化dp)

    在长为L(<=1000000)的草地(可看成线段)上装喷水头,喷射是以这个喷水头为中心,喷水头的喷洒半径是可调节的调节范围为[a,b].要求草地的每个点被且只被一个喷水头覆盖,并且有些连续区间必 ...

  3. poj 1821(单调队列优化dp)

    题意:有一道线性篱笆由N个连续的木板组成.有K个工人,你要叫他们给木板涂色.每个工人有3个参数:L 表示 这个工人可以涂的最大木板数目,S表示这个工人站在哪一块木板,P表示这个工人每涂一个木板可以得到 ...

  4. 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)

    题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...

  5. 【计蒜客 - 蓝桥训练】蒜厂年会(单调队列优化dp,循环数列的最大子段和)

    题干: 在蒜厂年会上有一个抽奖,在一个环形的桌子上,有 nn 个纸团,每个纸团上写一个数字,表示你可以获得多少蒜币.但是这个游戏比较坑,里面竟然有负数,表示你要支付多少蒜币.因为这些数字都是可见的,所 ...

  6. 单调队列以及单调队列优化DP

    单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...

  7. POJ 1821 Fence(单调队列优化DP)

    题解 以前做过很多单调队列优化DP的题. 这个题有一点不同是对于有的状态可以转移,有的状态不能转移. 然后一堆边界和注意点.导致写起来就很难受. 然后状态也比较难定义. dp[i][j]代表前i个人涂 ...

  8. 【单调队列优化DP】烽火传递 LibreOJ - 10180

    题目来源 点我进入提交题目 反思 因为目前在学习单调队列优化DP,所以会往单调队列上面想.然后犯了一个错误就是,认为这个题目只要用单调队列就可以完成,单调队列只是用来减少时间复杂度的,遇到了求最优解的 ...

  9. AcWing 1089 烽火传递 题解(动态规划—DP—单调队列优化DP)

    AcWing 1089 烽火传递 单调队列优化DP,思路比较简单,维护一个保持元素单调递增的单调队列,队首就是第i座烽火台能接收到的,代价最小的方案,加上第i座烽火台的代价就是这座烽火台的最小值 #i ...

最新文章

  1. 看看神经网络如何高度还原你的年轻容貌!
  2. 仿iphone日历插件(beta)
  3. kubernetes认证,对接第三方认证系统,对接github认证
  4. 顶级风投First Round Capital对创业者的30个建议
  5. flink自定义trigger详解
  6. “约见”面试官系列之常见面试题之第九十二篇之created和mounted区别(建议收藏)
  7. TQ210 —— s5pv210 Linux内核结构
  8. java时间随机数_java开发代码工具类(时间戳/随机数/日期等)
  9. python识别验证码ocr_Python3使用tesserocr识别字母数字验证码
  10. 对话框的数据交换--MFC深入浅出
  11. 从OPPO TWS耳机看OPPO声学的体面回归
  12. GNU GCC 编译
  13. html5设置谷歌浏览器兼容性,google浏览器
  14. POJ-2632:Crashing Robots(C++实现详细代码)
  15. npm安装vue,在vue/dist目录下没有产生vue.js文件
  16. android signal 6,android项目运行出现Fatal signal 6 (SIGABRT), code -6 in tid 3
  17. 前端入门学习笔记(三十五)vue.js入门(三)条件 v-if 与循环 v-for,v-for 中 in 和 of 的区别
  18. 常用计算机高级语言及其特点,计算机高级语言特点是什么?常见的语种有哪些?...
  19. 2022年全球市场切削刀具总体规模、主要生产商、主要地区、产品和应用细分研究报告
  20. win10电脑打不开我的电脑属性

热门文章

  1. 有趣程序和让人捧腹大笑的注释,你的注释还不够骚
  2. 区块链、自动驾驶、人工智能鏖战开始 谁将成为下一个风口?
  3. 入门 | 机器学习第一课:决策树学习概述与实现
  4. mysql 免安装初始化_mysql免安装版配置步骤详解分享
  5. python pdf 图片_第一节:python提取PDF文档中的图片
  6. php获取qzonetoken,QQ一键登录实现
  7. linux6.5进入救援模式,rhel6.5救援模式修复系统
  8. java调试案例_Spring-boot的debug调试代码实例
  9. python新手入门项目推荐_推荐:一个适合于Python新手的入门练手项目
  10. leetcode刷题可以用python吗_LeetCode刷题——第四天(python)