题意

给定 \(n\) 个区间,必须去掉其中的 \(K\) 个,询问能够保留的区间并的最大值。

\(n \leq 10^5\ ,K \leq 100\) 。

分析

  • 定义状态 \(f_{i,j}\) 表示前 \(i\) 个区间中去掉了 \(j\) 个且强制选 \(i\),最多能够得到多大的区间并。

  • 转移比较显然: \(f_{i,j}=\max_{k=i-j-1}^{i-1}\{f_{k,j-(i-k-1)}+val(k,i)\}\) , \(val(k,i)\) 表示 \(i\) 不和 \(k\) 交的部分。

  • 根据 \(j-(i-x-1)=k\) 可以得到 \(j-i+x+1=k\) ,即 \(i-j-1=x-k\) ,\(x\) 表示转移位置。

  • 所以对于转移可以搞到一个 \(i -j\) 的位置并用单调队列位置维护最优转移。

  • 总时间复杂度为 \(O(nk)\) 。

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define rep(i,a,b) for(int i=a;i<=b;++i)
  4. #define pb push_back
  5. typedef long long LL;
  6. inline int gi(){
  7. int x=0,f=1;char ch=getchar();
  8. while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
  9. while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
  10. return x*f;
  11. }
  12. template<typename T>inline bool Max(T &a,T b){return a<b?a=b,1:0;}
  13. template<typename T>inline bool Min(T &a,T b){return b<a?a=b,1:0;}
  14. const int N=1e5 + 7;
  15. int n,K,ans;
  16. int f[N][104],gg[N];
  17. struct data{
  18. int l,r;
  19. bool operator <(const data &rhs)const{
  20. if(l!=rhs.l) return l<rhs.l;
  21. return r>rhs.r;
  22. }
  23. }v[N],b[N];
  24. struct node{int id,val;};deque<node>q[N];
  25. int main(){
  26. n=gi(),K=gi();
  27. rep(i,1,n) v[i].l=gi(),v[i].r=gi();
  28. sort(v+1,v+1+n);
  29. int ndc=0,lst=-1;
  30. rep(i,1,n){
  31. if(v[i].r>lst) b[++ndc]=v[i],lst=v[i].r;
  32. else K--;
  33. }
  34. if(K<0) K=0;
  35. rep(i,1,ndc){
  36. rep(j,0,min(i-1,K)){
  37. int p=i-j-1;
  38. for(;!q[p].empty()&&b[q[p].front().id].r<b[i].l;q[p].pop_front())
  39. Max(gg[p],q[p].front().val+b[q[p].front().id].r);
  40. Max(f[i][j],gg[p]+b[i].r-b[i].l);
  41. if(!q[p].empty())
  42. Max(f[i][j],q[p].front().val+b[i].r);
  43. int val=f[i][j]-b[i].r;
  44. p=i-j;
  45. for(;!q[p].empty()&&q[p].back().val<=val;q[p].pop_back());
  46. q[p].push_back((node){i,val});
  47. }
  48. }
  49. rep(i,1,ndc)
  50. rep(j,0,min(i-1,K)) if(ndc-i+j==K) Max(ans,f[i][j]);
  51. printf("%d\n",ans);
  52. return 0;
  53. }

[Luogu4182][USACO18JAN]Lifeguards P[单调队列]的更多相关文章

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

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

  2. BestCoder Round #89 B题---Fxx and game(单调队列)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5945     问题描述 输入描述 输出描述 输入样例 输出样例 题意:中文题,不再赘述: 思路:  B ...

  3. 单调队列 && 斜率优化dp 专题

    首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...

  4. FZU 1914 单调队列

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=1914 题意: 给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个 ...

  5. BZOJ 1047 二维单调队列

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 题意:见中文题面 思路:该题是求二维的子矩阵的最大值与最小值的差值尽量小.所以可以考 ...

  6. 【BZOJ3314】 [Usaco2013 Nov]Crowded Cows 单调队列

    第一次写单调队列太垃圾... 左右各扫一遍即可. #include <iostream> #include <cstdio> #include <cstring> ...

  7. BZOJ1047: [HAOI2007]理想的正方形 [单调队列]

    1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2857  Solved: 1560[Submit][St ...

  8. hdu 3401 单调队列优化DP

    Trade Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  9. 【转】单调队列优化DP

    转自 : http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列是一种严格单调的队列,可以单调递增,也可以单调递减.队 ...

随机推荐

  1. 基于php-fpm的配置详解

    php5.3自带php-fpm/usr/local/php/etc/php-fpm.confpid = run/php-fpm.pidpid设置,默认在安装目录中的var/run/php-fpm.pi ...

  2. Sharepoint 2013 多服务器域的目录服务器和搜索服务的配置

    一般而言,大部分的sharepoint的管理工作均可以通过Centrlal Admin完成,可惜这个操作不得不要用powershell. 假如Webfront服务器叫 WebServer 目录服务器叫 ...

  3. return 返回值的问题

    def yue(): print("1. 打开手机") print("2. 打开陌陌") print("3. 找个漂亮的小姐姐") prin ...

  4. const修饰的成员是类成员,还是实例成员?

    很抱歉,我以为只有static修饰的成员是类成员,可以通过类名直接访问,然而,const 修饰的成员也属于类成员,直接通过类名访问,不能通过实例变量访问. 做维护久了,深刻的理解,扎实的基础对写出高质 ...

  5. C# winform webbrowser如何指定内核为IE11?

    1)假设你应用程序的名字为MyApplication.exe 2)运行Regedit,打开注册表,找到 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsof ...

  6. linux下10款markdown软件

    原文:https://linux.cn/article-7623-1.html 在这篇文章中,我们会点评一些可以在 Linux 上安装使用的最好的 Markdown 编辑器. 你可以在 Linux 平 ...

  7. js之点击值发生变化

    点击值发生变化,应用场景,比如像阿里云那样我通常密码是以******的形式存在,我必须要点击查看,它才会以明文显示. 在实际开发中,比如以智能门锁为例,安装门锁时,有个叫密码输入框的表单,这个是选填项 ...

  8. 使用VS Code发布博客

    使用VS Code 发布文章 这也是学习别人怎么去使用VS Code 发布文章 上传图片 这是我上传的图片 通过插件的方式上传 ctrl+alt+aQQ截图 使用插件 Markdown All in ...

  9. 你都用python来做什么?

    首页发现话题   提问     你都用 Python 来做什么? 关注问题写回答     编程语言 Python 编程 Python 入门 Python 开发 你都用 Python 来做什么? 发现很 ...

  10. 纯CSS + 媒体查询实现网页导航特效

    纯css+媒体查询实现网页导航特效 附上效果图: 代码如下,复制即可使用: <!DOCTYPE html> <html lang="en"> <hea ...