真是太神了orz
我们先贪心地把被包含的线段删掉,把剩下的线段按左端点排序,这样的话右端点显然也是有序的。

设dp[i][k],表示前i个线段,删了k个,且必须保留i线段的最大覆盖长度。枚举上一个线段的位置j,那么我们有转移dp[i][k]=max{dp[j][k−(i−j−1)]+w(i,j)}dp[i][k]=max\{dp[j][k-(i-j-1)]+w(i,j)\}
w(i,j)表示把线段i接在线段j后面增加的长度。 这样的复杂度是O(nk2)O(nk^2)的,需要优化。

我们发现如果dp[x][y]能够转移到dp[i][j],则有j=y+i-x-1,即x-y=i-j-1.因此我们在转移dp[i][j]时,所有的决策就是满足x-y=i-j-1的dp[x][y],并且分成两类:
1、线段x,i不相交,则w(i,j)=len[i],我们只需维护所有不相交的最大的dp[x][y]即可。
2、线段x,i相交,则贡献为dp[x][y]+b[i].r-b[x].r,我们维护dp[x][y]-b[x].r的最大值即可。
我们用n个单调队列来维护即可。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <utility>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
#define N 100010
#define pa pair<int,int>
inline char gc(){static char buf[1<<16],*S,*T;if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}return *S++;
}
inline int read(){int x=0,f=1;char ch=gc();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();return x*f;
}
int n,K,dp[N][110];//dp[i][k],前i个区间,删了k个,且必须保留i区间的最大覆盖长度
struct interval{int l,r;
}a[N],b[N];
inline bool cmp(interval a,interval b){return a.l==b.l?a.r>b.r:a.l<b.l;}
deque<pa>q[N];
int mx[N];//用单调队列维护相交情况的最优决策,用mx记录不相交情况的最优决策
int main(){
//  freopen("a.in","r",stdin);n=read();K=read();for(int i=1;i<=n;++i) a[i].l=read(),a[i].r=read();sort(a+1,a+n+1,cmp);int mxr=0,tot=0;for(int i=1;i<=n;++i){if(a[i].r>mxr) b[++tot]=a[i],mxr=a[i].r;else K--;}if(K<0) K=0;n=tot;for(int i=1;i<=n;++i){for(int j=0;j<=K;++j){if(j>=i) break;int id=i-j-1;while(!q[id].empty()&&b[q[id].front().second].r<=b[i].l){//不相交了就弹出来int x=q[id].front().second;q[id].pop_front();mx[id]=max(mx[id],dp[x][x-id]);}dp[i][j]=max(dp[i][j],mx[id]+b[i].r-b[i].l);if(!q[id].empty()) dp[i][j]=max(dp[i][j],q[id].front().first+b[i].r);id=i-j;int val=dp[i][j]-b[i].r;while(!q[id].empty()&&q[id].back().first<=val) q[id].pop_back();q[id].push_back(make_pair(val,i));}}int ans=0;for(int i=1;i<=n;++i)if(K-(n-i)>=0) ans=max(ans,dp[i][K-(n-i)]);printf("%d\n",ans);return 0;
}

bzoj5185 [Usaco2018 Jan]Lifeguards(dp+单调队列优化)相关推荐

  1. Codeforces 1077F2 Pictures with Kittens (hard version)(DP+单调队列优化)

    题目链接:Pictures with Kittens (hard version) 题意:给定n长度的数字序列ai,求从中选出x个满足任意k长度区间都至少有一个被选到的最大和. 题解:数据量5000, ...

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

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

  3. luogu4182 [USACO18JAN] Lifeguards P (单调队列优化dp)

    显然可以先把被覆盖掉的区间去掉,然后排个序,左.右端点就都是单调的 设f[i][j]表示前i个区间中删掉j个,而且钦定i不能删的最大覆盖长度 (如果不钦定,就要有一个删掉的状态,那我无法确定前面的到底 ...

  4. bzoj5185 [Usaco2018 Jan]Lifeguards

    http://www.elijahqi.win/archives/2987 Description 农夫约翰为他的奶牛们开了一个游泳池,他认为这将有助于他们放松和生产更多的牛奶.为确保安全,他请了N只 ...

  5. BZOJ5185: [Usaco2018 Jan]Lifeguards

    好吧,自己考虑的时候没想过要开多个单调队列来优化dp... 首先,如果一个区间被其他区间包含的话,很明显,它被删除也没影响.所以我们先按左节点排序,去除那些包含的区间,然后对接下来有序的区间进行dp. ...

  6. [NOI2005]瑰丽华尔兹(DP+单调队列优化)

    题目来源:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有 ...

  7. [luogu 4292][bzoj 1758][WC2010] 重建计划(点分治 + dp + 单调队列优化 + 启发式合并)

    [WC2010]重建计划 problem solution code problem 洛谷指路 solution 一看那个道路平均价值的式子:AvgValue=∑e∈Sv(e)∣S∣\text{Avg ...

  8. CodeForces - 372CWatching Fireworks is Fun+DP+单调队列优化

    [题目描述] CodeForces - 372CWatching Fireworks is Fun 题目的大概意思就是在一个编号为1-n的街道上现在按照时间顺序放烟花,每个烟花获得的幸福感为b−abs ...

  9. [USACO18JAN]Lifeguards P 洛谷黑题,单调队列优化DP

    传送门:戳我 这道题有两个版本,S和P,S是K等于1的情况,显然可以用线段树水过. P版本就难了很多,洛谷黑题(NOI/NOI+/CTSC),嘿嘿. 我自己也不是很理解,照着题解写了一遍,然后悟到了一 ...

最新文章

  1. 给 Windows 驱动程序安装提速
  2. 如何在React Native中写一个自定义模块
  3. 【matlab】面积图(area函数的应用)
  4. 在Ant的javac中指定源文件编码方式,以避免警告: 编码 GBK 的不可映射字符的错误...
  5. cf1561D Up the Strip(D1D2)
  6. 学成在线--13.RabbitMQ工作模式
  7. 这个机器人不学数据集,“纯玩”get各类家务技能,LeCun觉得很赞
  8. 手把手教你从零开始搭建个人博客,20分钟上手
  9. [实验手册]用2500路由器做自动安装实验
  10. 已有一个名为“frmadd”的组件。组件的名称必须是唯一的,而且名称必须不区分大小
  11. spring 整合 JUnit(spring 内单元测试类调用带注入的报空指针异常NullPointException)
  12. C++学习:第三阶段(C++提高编程)————B站黑马程序员C++学习笔记
  13. QQ快速登录协议分析
  14. 求无序数组的中位数(c语言版本)
  15. python出现syntaxerror_python 报错syntaxerror怎么解决
  16. veu项目中引入jquery
  17. BlenderGIS:No ImageIO解决办法 天地图地图资源
  18. Java 简单图片 马赛克,黑白画,珠纹化,油画效果等处理技术 原理及实现 (简单UI)
  19. 智慧城市服务平台硬件采购清单(参考)
  20. 深入浅出的web语义化理解

热门文章

  1. 淘宝官方商品详情接口
  2. 扫描图片怎么变成电子版?不止扫描仪
  3. 1.PlantUML-时序图
  4. TableView如何让行或列只读
  5. CentOS7设置笔记本合盖不休眠
  6. python字符串按ascii码排序_C# 字符串按 ASCII码 排序的方法
  7. javaweb指导书
  8. Python 入门之控制结构 - 顺序与选择结构
  9. 程序设计第二十二题 空心三角形
  10. 超快速!10分钟入门Keras指南