好吧,自己考虑的时候没想过要开多个单调队列来优化dp。。。

首先,如果一个区间被其他区间包含的话,很明显,它被删除也没影响。所以我们先按左节点排序,去除那些包含的区间,然后对接下来有序的区间进行dp。

dp[i][j]表示前i个区间删掉j个且第i个必取能覆盖的最大面积。

dp[i][j]=max(dp[i][j],dp[p][j-(i-p-1)]+calc(p,i))//calc(p,i)表示将第i个区间加到第p个区间后时新增的覆盖面积,因为i-p-1显然需要小于等于k,所以时间复杂度是O(n*k*k),需优化。

之前的区间分为是否与当前区间有重叠部分这样两种。可以发现如果之前的一个dp[x][y]可以更新dp[i][j],那么x-y=i-j-1;

所以我们可以开k个单调队列,如果队头的元素已经和当前第i个区间不重叠,就更新不重叠的答案,并弹出队头。

操作完成后,用队头及有重叠部分的区间来更新答案。

将dp[i][j]-a[i].r(为什么是这个值)放入第i-j个单调队列,进行更新。

具体的程序中写。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<queue>
#define maxn 100009
using namespace std;
int n,k,p[maxn],dp[maxn][109];
struct ding{int l,r;
}a[maxn],b[maxn];
struct ding2{int node,val;
};
deque<ding2>q[maxn];
bool cmp(ding t1,ding t2)
{return t1.l==t2.l?t1.r>t2.r:t1.l<t2.l;}
int main()
{freopen("std.in","r",stdin);freopen("std.out","w",stdout);scanf("%d%d",&n,&k);b[0]=(ding){0,0};for (int i=1;i<=n;i++) scanf("%d%d",&a[i].l,&a[i].r);if (k>=n) {printf("0\n");return 0;}sort(a+1,a+1+n,cmp);int maxx=-1,cnt=0;for (int i=1;i<=n;i++){if (a[i].r>maxx) b[++cnt]=a[i];
//去掉被包含区间else k--;maxx=max(maxx,a[i].r);}if (k<0) k=0; n=cnt;for (int i=1;i<=n;i++){for (int j=0;j<min(k+1,i);j++){int now=i-j-1;while ((!q[now].empty())&&(b[q[now].front().node].r<b[i].l))
//如果当前队头的区间和第i个区间不重叠那就弹出
      {ding2 to=q[now].front();p[now]=max(p[now],to.val+b[to.node].r);
//因为如果有重叠,那么dp[i][j]=dp[x][y]+a[i].r-a[x].r,所以放入队列的元素为dp[x][y]-a[x].r,我们用它来更新不重叠的答案
          q[now].pop_front();}dp[i][j]=max(dp[i][j],p[now]+b[i].r-b[i].l);
//不重叠区间更新if (!q[now].empty())dp[i][j]=max(dp[i][j],q[now].front().val+b[i].r);
//重叠的区间更新int nowv=dp[i][j]-b[i].r;now=i-j;while ((!q[now].empty())&&(q[now].back().val<nowv))q[now].pop_back();q[now].push_back((ding2){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\n",ans);return 0;
}

转载于:https://www.cnblogs.com/2014nhc/p/8516757.html

BZOJ5185: [Usaco2018 Jan]Lifeguards相关推荐

  1. bzoj5185 [Usaco2018 Jan]Lifeguards

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

  2. bzoj5185 [Usaco2018 Jan]Lifeguards(dp+单调队列优化)

    真是太神了orz 我们先贪心地把被包含的线段删掉,把剩下的线段按左端点排序,这样的话右端点显然也是有序的. 设dp[i][k],表示前i个线段,删了k个,且必须保留i线段的最大覆盖长度.枚举上一个线段 ...

  3. 单调队列优化dp--bzoj5185: [Usaco2018 Jan]Lifeguards

    传送门 luoguluoguluogu上据说有一道这个题的弱化版,把删kkk个改成了删111个,那个大概线段树之类的随便做一下就好了 这道题可以先把包含的都去掉,所有线段就是相交或者不相交的了,然后考 ...

  4. 退役前的做题记录1.0

    退役前的做题记录1.0 租酥雨最近很懒qwq,具体表现在写题的时候不想发题解了. 但是想想这样也不太好,就决定发个一句话(半句话到几句话不等)题解上来. 2018-09.18-2018-09.28 [ ...

  5. 1677: [Usaco2005 Jan]Sumsets 求和

    1677: [Usaco2005 Jan]Sumsets 求和 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 626  Solved: 348 [Sub ...

  6. bzoj2020[Usaco2010 Jan]Buying Feed, II*

    bzoj2020[Usaco2010 Jan]Buying Feed, II 题意: FJ开车去买食物,如果他的车上有X份食物.每走一里就花费X元. 城市总共E里路,FJ从0开始走,到E结束(不能往回 ...

  7. bzoj3396[Usaco2009 Jan]Total flow 水流*

    bzoj3396[Usaco2009 Jan]Total flow 水流 题意: 求无环图的最大流.边数≤700. 题解: 管它有没有环.注意本题的节点标号既有大写字母,也有小写字母. 代码: 1 # ...

  8. [BZOJ] 1634: [Usaco2007 Jan]Protecting the Flowers 护花

    1634: [Usaco2007 Jan]Protecting the Flowers 护花 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 827  S ...

  9. BZOJ 1612: [Usaco2008 Jan]Cow Contest奶牛的比赛【Floyd】

    1612: [Usaco2008 Jan]Cow Contest奶牛的比赛 Time Limit: 5 Sec Memory Limit: 64 MB Description FJ的N(1 <= ...

最新文章

  1. python3 socketserver模块 网络服务编程框架
  2. Java获取近七天的数据条数,及页面实现折线图(附前后端代码)
  3. C++函数中那些不可以被声明为虚函数的函数
  4. Repeater的嵌套结合用户控件的使用
  5. nginx学习笔记-01nginx入门,环境搭建,常见命令
  6. ARCHICAD 25 for Mac(cad绘图软件)
  7. 01 自动化测试基础
  8. 交通路标识别(毕业设计)
  9. php解析dcm,DICOM入门(三)——解析DCM文件
  10. python xlwt生成Excel
  11. 用python在大麦网抢票视频_大麦网怎么抢票快 大麦网抢票最快的方法
  12. 松下P2卡数据恢复-删除/格式化100%完美恢复-解决方案
  13. android parcel分析,android – 从Intent检索时Parcel崩溃
  14. 阿里巴巴稀疏模型训练引擎-DeepRec
  15. 【C#】使用WinRAR进行压缩和解压
  16. C++ 跳跃游戏II
  17. 手机邮箱怎么注册申请,手机邮箱在哪里找到,电子邮箱怎么弄?
  18. 树莓派开发笔记(十一):蓝牙的使用,BlueZ协议(双树莓探测rssi并通过蓝牙互传获取的rssi信号强度)
  19. Android通过DownloadManager实现App的版本更新功能
  20. 哈工大计算机学院美女多吗,16所大学男女比例:电子科大最高,哈工大、西电其次,复旦最均衡...

热门文章

  1. Git命令全解析-前端备忘录
  2. OpenCV开发笔记(四十七):红胖子8分钟带你深入了解直方图(图文并茂+浅显易懂+程序源码)
  3. arduino平衡车超声波_制作Arduino自平衡车(一)
  4. 叫你如何查看QQ空间秘密发布者的发布时间
  5. 利用Joypy绘制嵴线图的案例
  6. 帆软BI中界面上如果要替换原有的组件,两种替换方式
  7. 区块链报错3 | truffle unbox 报错 | downloading失败 | unbox failed
  8. Oracle数据库迁移到AWS云的方案
  9. SyntaxError: Non-UTF-8 code starting with '\xd4' in file C:/PyCharmWorkSpace py on line 2
  10. 小米米家投影仪青春版怎么样,和当贝d3x怎么选全面解析让你知道