传送门:戳我

这道题有两个版本,S和P,S是K等于1的情况,显然可以用线段树水过。

P版本就难了很多,洛谷黑题(NOI/NOI+/CTSC),嘿嘿。

我自己也不是很理解,照着题解写了一遍,然后悟到了一点东西。

dp方程很好想:

dp[i][j]表示处理到第i个元素,已经删掉了j个,但取了第i个。

dp[i][j]=max(dp[k][j-i-k-1])。表示考虑上一个取的区间是k,然后删去的个数就是j-i-k-1。

时间复杂度是O(N*K*K)。显然不满足题目数据(或许卡卡常能过?)

那么考虑单调队列优化

因为我自己也有点蒙圈,怕误导大家,就摘抄了其他巨佬的博客

/*  这段内容摘自luogu用户babingbaboom的博客:https://www.luogu.org/blog/user51357/solution-p4182

考虑优化dp转移

对于第i个区间,设其左端点为l

我们先看一看方程,会发现对dp[i][j]产生贡献的i'-j'=i-1-j

  1. 对于i之前的那些右端点<=l的区间,它们与i没有重叠部分,所以只要在它们当中取max,再加上第i个区间的长度即可

  2. 对于那些与i有重叠部分的区间,在当前区间右移的时候,这些dp的贡献会变,但相对大小不会变,所以可以维护一个单调队列,dp[i][j]对应的单调队列的编号为i-1-j,每次先把队头的那些已经跑到左边的区间弹出去(算成1的贡献),然后取队头就是当前的有重叠的状态中的最大答案

然后当前dp值算出来以后要插进对应的单调队列中(编号为i-j的单调队列),如果队尾状态加上与当前状态的右端点差还没有当前状态的dp值大的话,就把它从队尾弹出

*/

代码实现如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define maxn 100001
using namespace std;
inline void read(int &x)
{x=0;int f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}x*=f;
}
int N,K,dp[maxn][110];
int p[maxn];
struct coww{int l,r;friend bool operator < (coww a,coww b){if(a.l==b.l)return a.r>b.r;elsereturn a.l<b.l;}
}arr[maxn],cow[maxn];
struct node{int node,val;
};
deque<node>que[maxn];
int main()
{read(N);read(K);if (K>=N){printf("0");return 0;}for(int i=1;i<=N;i++)    {read(arr[i].l);read(arr[i].r);}sort(arr+1,arr+1+N);int right=0,cnt=0;cow[0]=(coww){0,0};for(int i=1;i<=N;i++){if(arr[i].r>right)cow[++cnt]=arr[i],right=arr[i].r;else    K--;}if(K<0) K=0;N=cnt;    for(int i=1;i<=N;i++){int u=min(K+1,i);for(int j=0;j<u;j++){int now=i-j-1;while(!que[now].empty()&&cow[que[now].front().node].r<cow[i].l){node to=que[now].front();p[now]=max(p[now],to.val+cow[to.node].r);que[now].pop_front();}dp[i][j]=max(dp[i][j],p[now]+cow[i].r-cow[i].l);if (!que[now].empty())dp[i][j]=max(dp[i][j],que[now].front().val+cow[i].r);int nowv=dp[i][j]-cow[i].r;now=i-j;while ((!que[now].empty())&&(que[now].back().val<nowv))que[now].pop_back();que[now].push_back((node){i,nowv});}}int ans=0;for (int i=1;i<=N;i++)for (int j=0;j<min(i,K+1);j++)if (j+N-i==K)ans=max(ans,dp[i][j]);printf("%d",ans);
}

View Code

转载于:https://www.cnblogs.com/sherrlock/p/9814507.html

[USACO18JAN]Lifeguards P 洛谷黑题,单调队列优化DP相关推荐

  1. 洛谷试炼场 4-8单调队列

    layout: post title: 洛谷试炼场 4-8单调队列 author: "luowentaoaa" catalog: true mathjax: true tags: ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 24张图带你彻底理解Java中的21种锁
  2. 计算机视觉深度学习顶会_顶会论文接收量再破纪录,计算机视觉创新正在发生什么变化?丨 CVPR 2019分享会...
  3. CentOS常用到的查看系统命令
  4. WOC?老板让我从Word中复制出1000张图片?
  5. html导航栏代码跳转,微信小程序自定义底部导航栏tabBar(含跳转页面wx.navigateTo)...
  6. 快速解决工作中遇到经典的括号匹配问题
  7. Java中基础数据类型分类
  8. webpack入门 --初级压缩
  9. linux 启动rsyslog服务_我的服务器怎么老这么慢,难道说是被挖矿了?linux开机启动项自查...
  10. SpringBoot之项目实践一
  11. 系统学习机器学习之误差理论
  12. 测试岗(平安银行)面试总结
  13. 淘宝以图搜图接口,图片搜索商品接入指南
  14. aics6圆角插件怎么安装_AI圆角插件!助你更快设计字体 Xtream Path1.4的安装使用教程...
  15. 微信运动怎么打开?如何查看微信运动步数?原来是这样做的…
  16. 电商私域流量搭建规划社群运营推广sop销售转化计划书表格模板方案
  17. 天翼云云主机快照、云硬盘备份、云主机备份之间的区别
  18. 天耀18期 – 03.Java基本语法【作业】.
  19. MATLAB函数大全 .
  20. 谷歌浏览器旧版本下载地址

热门文章

  1. GB/T28181国标视频直播平台LiveGBS支持录像回放吗云端录像录制在哪里
  2. 微信小程序消息订阅超详细流程步骤
  3. GOOGLE HACKS巧妙使用网络搜索的技巧和工具(第二版)已经出版(上)--IT man
  4. .NET Interop 互操作 COM+
  5. 赵小楼《天道》《遥远的救世主》深度解析(37)丁元英参加酒局前的小插曲:从冯世杰的刁难找茬说说“心是愿望,神是境界”
  6. 宇视科技线上c语言笔试答案,宇视科技2016招聘试题.docx
  7. select 字符串
  8. 稀里糊涂的准备开始了……
  9. 【H5】 svg画扇形饼图
  10. Chrome的一些快捷键