对于这道题,还有一道相类似但弱于此题的Lifeguards S;
由于这个跟区间的取舍相关,所以要用dp来做
想到设\(dp[i][j]\)为在前i个区间中删掉j个并且第i个必取的最优值.
那么显然状态转移方程为:
\[dp[i][j] = max(dp[i][j], dp[x][j-(i-x-1)] +v(x, i))\]
其中,\(v(x, i)\)为加上第i个区间后新增的贡献,因为区间i可能和区间k重合,所以\(v(x, i)\)并不一定是i的长度.
但是...这个dp的时间复杂度是\(O(NKK)\)

所以我们要开单调队列优化.
这里的单调队列用"queue"中的deque来实现.
考虑到如果之前的一个dp[x][y]能更新dp[i][j],那么x - y = i - j - 1;
而又因为更新可分为区间x和区间i重叠以及不重叠2种:

  • 重叠:更新为dp[x][y] + i的右端点坐标 - x的右端点坐标.

    可以看出,如果要使答案最大,我们一定只会选取 (dp[x][y] - x的右端点坐标) 最大的那一个.所以对于重叠的区间,可以用单调(不增)队列维护 (dp[x][y] - x的右端点坐标) 的值,每次只要选取队头的元素做贡献(加上区间i的右端点坐标)即可.

  • 不重叠:更新为:dp[x][y] + i的右端点 - i的左端点.

    对于这个来说,我们将单调队列的队首一直弹出直到队首区间有和区间i重叠, 对于这些没有重叠的元素, 因为维护的是(dp[x][y] - x的右端点坐标),所以还要将其加上x的右端点坐标,再取max后加上区间i的贡献.

最后区间i算完后,要把区间i也像这样将(dp[i][j] - i的右端点坐标)加入单调队列.

而这样的单调队列有多个, 我们用i-j作为区间dp[i][j]的"(dp[x][y] - x的右端点坐标)"的单调队列的关键字,即dp[i][j]对应单调队列\(i-j\);

最后再求一下答案就好了,说到底还是dp.

送上代码:

#include "bits/stdc++.h"using namespace std;
struct Node {int l, r;
};
struct Node2 {int id, val;
};const int MAXN = 1e5 + 10;
const int MAXK = 1e2 + 10;
int N, K, p[MAXN], dp[MAXN][MAXK];
Node a[MAXN], b[MAXN];
deque <Node2> q[MAXN];bool cmp(Node x, Node y) {return x.l == y.l? x.r > y.r : x.l < y.l;
}int main() {freopen("a.in", "r", stdin);freopen("a.out", "w", stdout);scanf("%d%d", &N, &K);for(int i = 1; i <= N; ++i)scanf("%d%d", &a[i].l, &a[i].r);sort(a + 1, a + N + 1, cmp);int cnt = 0, lst = -1;for(int i = 1; i <= N; ++i) {if(a[i].r > lst) b[++cnt] = a[i];else K--;lst = max(lst, a[i].r);}N = cnt, K = K < 0 ? 0 : K;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().id].r < b[i].l)) {Node2 to = q[now].front();p[now] = max(p[now], to.val + b[to.id].r);//加上b[to.id].r的原因是维护队列时减去了b[to.id].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 n = dp[i][j] - b[i].r;now = i - j;while(!q[now].empty() && (q[now].back().val < n))//将dp[i][j]所对应的单调队列也更新q[now].pop_back();q[now].push_back((Node2){i, n});}int res = 0;for(int i = 1; i <= N; ++i)for(int j = 0; j <= min(i, K + 1); ++j)if(j + N - i == K)res = max(res, dp[i][j]);printf("%d\n", res);return 0;
}

以上内容均为原创,转载请注明出处.
参考:https://www.luogu.org/blog/user21621/solution2-p4182

つづく...

转载于:https://www.cnblogs.com/hnfms-jerry/p/solution-Lifeguards_P.html

問題の解決策 [USACO18JAN]Lifeguards P(题解)相关推荐

  1. 騰訊大廈有39層的問題解決方案。

    [size=large]問題:[/size] 腾讯大厦有39层,你手里有两颗一抹一眼的玻璃珠.当你拿着玻璃珠在某一层往下扔的时候,一定会有两个结果,玻璃珠碎了或者没碎.大厦有个临界楼层.低于它的楼层, ...

  2. java menuitem 乱码_MenuItem 顯示中文亂碼問題解決方案

    今天在使用Java做系統托盤圖標(TrayIcon),需要為其增加一個右鍵彈出菜單(PopupMenu),在使用菜單項(MenuItem)時,遇到了一個非常痛苦的事情:中文亂碼----.這個問題不經常 ...

  3. linux grub error 22,Linux系統grub常見錯誤問題解決

    Linux在現在已經很強大了,導致Linux系統越來越受到電腦用戶的歡迎,於是很多人開始學習Linux時,學習時你可能會遇到Linux系統grub常見錯誤問題,這裡將介紹Linux系統grub常見錯誤 ...

  4. ASP.NET MVC Identity 兩個多個連接字符串問題解決一例

    按照ASP.NET MVC Identity建立了一個用戶權限管理模塊,由于還要加自己已有的數據庫,所以建立了一個實體模型,建立了之后,發現登錄不了: 一直顯示"Login in faile ...

  5. mysql 登录一大串,Mysql processlist 一大堆sleep 問題解決

    為了測試一個檔案,我會一直debug step step 然後可能就關閉在繼續更改,有天我發現我要更改資料時,資料庫動不了了 至於為什麼資料庫動不了呢,請教了主管後在資料庫打上 show proces ...

  6. IE不能為讀(written)問題解決(轉載)

    我在附上这个问题的最终教程,希望斑竹加精,因为这个问题确实出现的比较多... 该内存不能为read或written的解决方案- -Tag: 该内存不能为"read"    该内存不 ...

  7. VS 2005 文本编码小技巧 --中文亂碼問題解決

    VS2003使用代码生成器生成的代码加入到工程会很郁闷的,在智能提示中是乱码,在VS2005中有一个选项可以解决这个问题.      今天将一个工程从VS2003转到VS2005,打开中文的注释都变成 ...

  8. oracle连接数一直超出,Oracle超出最大連接數問題及解決(…

    用過Oracle的應該都熟悉如何查看和設置Oracle數據庫的最大連接數.這里就再啰嗦一遍. 查看當前的連接數,可以用select count(*) from v$process; 設置的最大連接數( ...

  9. mysql error 1534_如何解決mysqlimport: Error: 13, Can”t get stat of 的問題 | 學步園

    今兒在看mysql用戶手冊的時候,看到備份恢復哪裡的mysqlimport的個命令時,操作後出現了一個很奇怪的問題. 複製代碼 代碼如下: root@zhou:/usr/local/mysql# my ...

最新文章

  1. mysql 生成json,结合CONCAT()和COALESCE()在MySQL中生成JSON
  2. java 1.7 事件监听_17.7Listener监听器
  3. MongoDB时间类型
  4. 求助帖:android开发初期:为什么我在活动二设置的singInstance模式跑到活动三去了???
  5. TCP/IP 协议简单分析
  6. 何时查询2021高考成绩长春市,2020年吉林长春成人高考成绩查询入口(已开通)...
  7. assign,copy,strong,weak,nonatomic的理解
  8. 如何使用SAP HANA Studio的PlanViz分析CDS view性能问题
  9. 【剑指offer】面试题23:链表中环的入口节点
  10. jupyter notebook 增加kernel的方法
  11. lucene-SpanNotQuery和SpanOrQuery交迭与全局跨度
  12. 纯CSS实现二级下拉导航菜单
  13. 记第一次组装台式电脑的小经历
  14. P值计算(Excel)
  15. 宝宝吃饭不乖,怎么办?
  16. Web安全—文件上传漏洞
  17. 6-3 计算Fibonacci数列每一项时所需的递归调用次数 (10 分)
  18. 制作流程图用什么软件比较好?这些简单好用的制作软件推荐给你
  19. 向量检索的索引构建算法综述
  20. 同或门真值表_逻辑函数表达式、真值表.ppt

热门文章

  1. 多级下料问题的建模--中英文翻译
  2. border-image
  3. windows设置CPU主频
  4. 个人信用报告内容组成和解读(七) ---本人声明、异议标注、查询等
  5. 蓝绿部署、AB测试、灰度发布、⾦丝雀发布、滚 动发布的概念与区别
  6. 电机集电环是如何更换与运行的
  7. Mac地址多少位(48位的(6个字节)) IP多少位
  8. SyntaxError: Non-UTF-8 code starting with '\xd4' in file C:/PyCharmWorkSpace py on line 2
  9. 西门子S7-1200控制V90伺服
  10. 【建议背诵】2022下半年软考「高项」100题(2)