显然可以先把被覆盖掉的区间去掉,然后排个序,左、右端点就都是单调的

设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)的更多相关文章

  1. [Luogu4182][USACO18JAN]Lifeguards P[单调队列]

    题意 给定 \(n\) 个区间,必须去掉其中的 \(K\) 个,询问能够保留的区间并的最大值. \(n \leq 10^5\ ,K \leq 100\) . 分析 定义状态 \(f_{i,j}\) 表 ...

  2. 单调队列优化DP,多重背包

    单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...

  3. 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 ...

  4. hdu3401:单调队列优化dp

    第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...

  5. Parade(单调队列优化dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others)    ...

  6. BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP

    BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP Description 有一排n棵树,第i棵树的高度是Di. MHY要从第一棵树到第n棵树去找他的妹子玩. 如果MHY在 ...

  7. 【单调队列优化dp】 分组

    [单调队列优化dp] 分组 >>>>题目 [题目] 给定一行n个非负整数,现在你可以选择其中若干个数,但不能有连续k个数被选择.你的任务是使得选出的数字的和最大 [输入格式] ...

  8. [小明打联盟][斜率/单调队列 优化dp][背包]

    链接:https://ac.nowcoder.com/acm/problem/14553来源:牛客网 题目描述 小明很喜欢打游戏,现在已知一个新英雄即将推出,他同样拥有四个技能,其中三个小技能的释放时 ...

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

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

随机推荐

  1. Logview_pro破解版

    logViewer Pro 是一款log文件查看器,它可以在短短数秒内打开上G的LOG文件,支持高亮某行文字(例如警告,错误),支持Unicode名字,支持查看的编码:ANSI, OEM, Unico ...

  2. 任务(task)

    任务概述 线程(Thread)是创建并发的底层工具,因此有一定的局限性(不易得到返回值(必须通过创建共享域):异常的捕获和处理也麻烦:同时线程执行完毕后无法再次开启该线程),这些局限性会降低性能同时影 ...

  3. HAProxy 日志输出及配置

    正所谓,没有软件敢说没有bug,人无完人,software is  not perfect software.是软件就可能存在bug,那么如果出现bug,我们就要分析对我们业务的影响及可能如何避免bu ...

  4. Helper

    //检测端口是否使用 public static bool VerifyListenerPort(int port) { bool inUse = false; System.Net.NetworkI ...

  5. C语言----数据类型(基础篇一)

    C语言的入门程序模板 #include <stdio.h> /*使用或者包含系统里面的程序*/ main() /*程序入口点*/ { /*起点*/ +; /*叫计算机执行的指令*/ } / ...

  6. PHP 设置调试工具XDebug PHPStorm IDE

    先下载PHP扩展Xdebug https://xdebug.org, 可以复制自己的phpinfo粘贴到https://xdebug.org/wizard.php中, 会生成需要下载的版本, php. ...

  7. Linux系统本地yum源环境配置记录

    由于IDC的一些服务器没有外网,不能对外访问.所以打算部署一套内网的yum源环境,以供内网服务器使用.以下简单记录下操作过程: 1)下载centos6.9和centos7.3的镜像,并挂载 [root ...

  8. php 中 opendir() readdir() scandir()

    opendir(path,context)若成功,则该函数返回一个目录流,否则返回 false 以及一个 error.可以通过在函数名前加上 “@” 来隐藏 error 的输出. readdir() ...

  9. 第六周-总结&结对编程

    1.结对编程 结对编程的Partner依旧是郑蕊师姐(博客:http://www.cnblogs.com/zhengrui0452/) 我们一起改进的是郑蕊师姐做的“四则运算” 郑蕊师姐之前完成四则运 ...

  10. week3个人作业

    一.必应词典的bug 必应词典占用资源过多,作为后台软件,必应词典的内存占用是其他的四五倍 适应能力弱,经常与其他软件冲突,兼容性差 二.分析 根据我的分析,团队人数6人左右,计算机大学毕业生,并有专 ...