luogu4182 [USACO18JAN] Lifeguards P (单调队列优化dp)
显然可以先把被覆盖掉的区间去掉,然后排个序,左、右端点就都是单调的
设f[i][j]表示前i个区间中删掉j个,而且钦定i不能删的最大覆盖长度
(如果不钦定,就要有一个删掉的状态,那我无法确定前面的到底到哪是没删的)
那么有$f[i][j]=max\{f[k][j-(i-k-1)]+R[i]-max(L[i],R[k])\} ,k<i$
稍微理解一下:k是我们下一次钦定要选的,中间的区间就都扔掉,然后有两种情况:k和i重合或不重合,那新增加一个i区间多覆盖的长度就要从i的左端点和k的右端点挑一个较大的减一减
复杂度$O(nk^2)$,显然需要优化
现在我们考虑f[i][j]到底能从哪些状态转移过来
设能转移到f[i][j]的状态是f[k][l],然后根据上面的式子,我们发现k-l=i-j-1 ,就是说当i和j固定时,l只和k有关
而且在这些状态中,对于一些比较小的k,它是和i区间不相交的,也就是它的贡献只和它的f有关
那我们就在这些k中先取一个最大的f[k][l],然后加上i区间的长度,作为一个可选的答案
对于剩下那些k,它的贡献就变成了f[k][l]-R[k],也是和i无关的
那我们就可以用一些单调队列,每个单调队列q[i]维护k-l=i的k,l的最大贡献
我们每次求f[i][j]的时候,先把q[i-j-1]中队头表示的区间不与i相交的踢出去,然后这个要求的最大值就是队头,然后再把f[i][j]加到q[i-j]里就完事了
为了方便统计答案,我们增加一个从1e9到1e9的区间,然后钦定它要选就可以了
#include<bits/stdc++.h>
#define pa pair<int,int>
#define ll long long
using namespace std;
const int maxn=,maxk=; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct POS{
int l,r;
}pos[maxn],p[maxn];
int N,K;
int f[maxn][maxk];
int que[maxn][maxk],qh[maxn],qt[maxn],ma[maxn]; inline bool cmp(POS a,POS b){
return a.l==b.l?a.r>b.r:a.l<b.l;
} int main(){
int i,j,k;
//freopen("testdata.in","r",stdin);
N=rd(),K=rd();
for(i=;i<=N;i++){
pos[i].l=rd(),pos[i].r=rd();
}sort(pos+,pos+N+,cmp);
int mm=;
for(i=,j=;i<=N;i++){
if(mm<pos[i].r) p[++j]=pos[i],mm=pos[i].r;
}K-=N-j;N=j;
if(K<=){
int ans=;
for(i=;i<=N;i++){
ans+=max(,p[i].r-max(p[i-].r,p[i].l));
}printf("%d\n",ans);
}else{
p[N+].l=1e9,p[N+].r=1e9;N++;
for(i=;i<=N;i++){
for(j=;j<=min(i-,K);j++){
int ii=i-j-;
while(qh[ii]<qt[ii]&&p[que[ii][qh[ii]]].r<=p[i].l){
ma[ii]=max(ma[ii],f[que[ii][qh[ii]]][que[ii][qh[ii]]-ii]);qh[ii]++;
}int hh=que[ii][qh[ii]];
f[i][j]=max(ma[ii]+p[i].r-p[i].l,f[hh][hh-ii]+p[i].r-max(p[hh].r,p[i].l));
ii=i-j;int qq=que[ii][qt[ii]];
while(qh[ii]<qt[ii]&&f[qq][qq-ii]-p[qq].r<=f[i][j]-p[i].r){
qt[ii]--;qq=que[ii][qt[ii]];
}que[ii][++qt[ii]]=i;if(!qh[ii]) qh[ii]++;
}
}
printf("%d\n",f[N][K]);
}
return ;
}
luogu4182 [USACO18JAN] Lifeguards P (单调队列优化dp)的更多相关文章
- [Luogu4182][USACO18JAN]Lifeguards P[单调队列]
题意 给定 \(n\) 个区间,必须去掉其中的 \(K\) 个,询问能够保留的区间并的最大值. \(n \leq 10^5\ ,K \leq 100\) . 分析 定义状态 \(f_{i,j}\) 表 ...
- 单调队列优化DP,多重背包
单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...
- bzoj1855: [Scoi2010]股票交易--单调队列优化DP
单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...
- hdu3401:单调队列优化dp
第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...
- Parade(单调队列优化dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others) ...
- BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP
BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP Description 有一排n棵树,第i棵树的高度是Di. MHY要从第一棵树到第n棵树去找他的妹子玩. 如果MHY在 ...
- 【单调队列优化dp】 分组
[单调队列优化dp] 分组 >>>>题目 [题目] 给定一行n个非负整数,现在你可以选择其中若干个数,但不能有连续k个数被选择.你的任务是使得选出的数字的和最大 [输入格式] ...
- [小明打联盟][斜率/单调队列 优化dp][背包]
链接:https://ac.nowcoder.com/acm/problem/14553来源:牛客网 题目描述 小明很喜欢打游戏,现在已知一个新英雄即将推出,他同样拥有四个技能,其中三个小技能的释放时 ...
- 单调队列以及单调队列优化DP
单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...
随机推荐
- 2018 Multi-University Training Contest 1 部分简单题解析
Preface ACM系列赛第一站,没有进前200还是很伤的. 主要是T2当时没写出来就GG了,后来看了下其实不是很难. 题目按照比赛时我们A的顺序讲,其实我都是被陈潇然大佬和ZWC带飞的. T1 M ...
- EZ 2018 05 26 NOIP2018 模拟赛(十六)
这次难道就是传说中的标准分大赛?而且这次比赛的链接不翼而飞了 一堆人153pts然后就有Rank4?看来这个Rank4不值钱了,才涨了50+的Rating. 不过还好最后5min的时候想出了T1正解, ...
- flask-admin 快速打造博客 系列一
前言: 我想分享flask+flask-admin快速打造博客的详细教程,可是发现网易课堂已经有相应的免费课堂了,所以就不打算一点一滴的在这里做笔记,分享这些东西了.所以我主要集中在flask-adm ...
- centos下部署NTP时间服务器同步环境记录
1)服务端部署 安装所需软件包 [root@test ~]# yum -y install ntp ntpdate 服务端自己先手工同步一次时间. [root@test ~]# ntpdate ntp ...
- 20135323符运锦期中总结----Linux系统的理解及学习心得
一.网易云课堂 1.各章节总结 第一周:计算机是如何工作的http://www.cnblogs.com/20135323fuyunjin/p/5222787.html 第二周:操作系统是如何工作的ht ...
- <<浪潮之巅>>阅读笔记三
纵看世界,横看国内.我们国内也有很多很优秀的企业正在走向或者已经处于浪潮之巅.阿里巴巴.腾讯和百度这三巨头应该是我们计算机行业的龙头.但是 不得不说,在创新方面我们做的并不多,这是值得每一个从事计算机 ...
- Junit4测试用例
一.题目简介 测试一元一次方程的求解 二.源码的github链接 https://github.com/liujing1994/test1 三.所设计的模块测试用例.测试结果截图 一元一次方程测试 ...
- python 生成器、列表解析式、yield、迭代器
开局一张图总结关系 一.列表解析式 我们习惯生成列表通过list = [1, 2, 3]的方式.还有一种很方便的列表生成方式 list = [a*2 for a in range(10)],或者lis ...
- Java与JavaScript 完美实现字符串拆分(利用数组存储)与合并的互逆操作
Java: String typeStr = "1,2"; String[] typeArray = typeStr.split(","); typeStr = ...
- [转帖]浅析Servlet执行原理
浅析Servlet执行原理 原贴地址: https://www.cnblogs.com/wangjiming/p/10360327.html 原作者画的图挺好. 自己之前看过iis的一些配置文档 但是 ...