【CF940E】Cashback(单调队列dp)
传送门
Solution:
既然是删掉k/c个,那么k<c是不删除的无意义,k=c删除1个,c<=k<2c还是删除1个,那么相当于第c+1个到第k个放在上一区间是无意义的。证明:假如前c个的最小值是mini ,如果
a[c+1]<mini,那么删掉的就是a[c+1],不值得,如果a[c+1]>=mini,那么删除的还是mini,把c+1个划分到上个区间也是无意义的。
但如果长度为2c的话就能删除2个,但一定不如化成2个c长度的区间优秀。假如前c个的最小值是mini1,次小值是mini2,后c个的最小值是mini3,假如mini2<mini3,那么删除
mini1+mini3>mini1+mini2,划分成2段更好,如果mini2>=mini3,那么删除的还是mini1+mini3,是等价的。
这样我们就能想到区间dp了,f[i]为到i位置能减去的最大的和是多少,可以从f[i-1]转移过来,就相当于把i分到一个长度不到c的区间里,无法减去值,也可以从f[i-c]转移过来,说明吧i-
c+1到i分成一个长度为c的区间,然后删掉里面的最小值
分析到这儿我们发现其实就是一个RMQ+dp 对于RMQ 这道题可以用单调队列来解决 当然 st表,线段树也是可以的
友情提示:用stl的deque会炸哦~
/*1、维护区间最值;
2、去除冗杂状态;
3、保持队列单调(最大值是单调递减序列,最小值是单调递增序列);
4、最优选择在队首*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,c;
ll a[100005],sum,b[100005],dp[100005];
ll q[100005];
int main()
{cin>>n>>c;c=min(c,n+1);for(int i=1;i<=n;i++){cin>>a[i];sum+=a[i];}int head,tail;q[head=tail=1]=1;for(int i=2;i<=c-1;i++){while(a[q[tail]]>=a[i]) {tail--; }q[++tail]=i;}for(int i=c;i<=n;i++){while(head<=tail&&q[head]<=i-c) head++;while(head<=tail&&a[q[tail]]>=a[i]) tail--;q[++tail]=i;b[i]=a[q[head]]; }for(int i=c;i<=n;i++) dp[i]=max(dp[i-1],dp[i-c]+b[i]);cout<<sum-dp[n];return 0;
}
转载于:https://www.cnblogs.com/Patrickpwq/articles/9461512.html
【CF940E】Cashback(单调队列dp)相关推荐
- bzoj1791,P4381-[IOI2008]Island【基环树,树形dp,单调队列dp,树的直径】
正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P4381 题目大意 有n个岛,n条无向边(保证每个岛都有边连到).走过 ...
- P3580 [POI2014]ZAL-Freight(单调队列dp)
P3580 [POI2014]ZAL-Freight(单调队列dp) 考虑两辆车怎么样是最优的. t1,t2,St_1,t_2,St1,t2,S t1+St_1+St1+S 第一辆车:[t1,t ...
- Codeforces 940 E.Cashback (单调队列,dp)
Codeforces 940 E.Cashback 题意:一组数,要分为若干个区间,每个区间长度为ki(1<=ki<=n),并且对于每个区间删去前ki/c(向下取整)个小的数(即对区间升序 ...
- Codeforces Round #466 (Div. 2): E. Cashback(单调队列+DP)
题目链接:http://codeforces.com/contest/940/problem/E 题意:给你一个长为n的序列和一个数字c,你要将这个序列切成若干段,对于每一段,这段中最小的[n/c]个 ...
- Codeforces 940E: Cashback 单调队列优化DP
传送门 题目描述 给你一个长度为n的数列a和整数c 你需要把它任意分段 每一段假设长度为k,就去掉前 ⌊kc⌋\lfloor\frac{k}{c}\rfloor⌊ck⌋小的数 最小化剩下的数的和 分 ...
- 刷题总结——烽火传递(单调队列+dp)
题目: 题目描述 烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有 n 个烽火台,每个烽火 ...
- POJ 1821 单调队列+dp
题目大意:有K个工人,有n个墙,现在要给墙涂色.然后每个工人坐在Si上,他能刷的最大范围是Li,且必须是一个连续子区间,而且必须过Si,他刷完后能获得Pi钱 思路:定义dp[i][j]表示前i个人,涂 ...
- P3957-跳房子【单调队列,dp,二分】
前言 链接: https://www.luogu.org/record/show?rid=7915892 这就是之前普及组的第四题- 大意 有n个格子,每个格子有价值.机器人有固定的跳跃距离d,用k个 ...
- BZOJ 1791 岛屿(环套树+单调队列DP)
题目实际上是求环套树森林中每个环套树的直径. 对于环套树的直径,可以先找到这个环套树上面的环.然后把环上的每一点都到达的外向树上的最远距离作为这个点的权值. 那么直径一定就是从环上的某个点开始,某个点 ...
最新文章
- AWS ML deploy platform
- 2017-2018-20172309 《程序设计与数据结构》第八周学习总结
- 十四、JavaScript表单中的验证API
- 致我们最最最最最最最最最最最最最优秀的班主任——王老师
- Spark1——介绍
- vs怎么把textbox输入的实数放置变量里_方程的计算机处理96(3)_C++vs
- 他从阿里离职,放弃“好几个亿”,他的英语课20000元/天,现在,你可以免费学!...
- 23.多线程 实现的两种方式
- Sublime Text3中 less 自动编译成 css 的方法
- struts2中的addActionError addFieldError addActionMessage的方法
- java map size 不准确_java1.7以前ConcurrentHashMap的size方法
- html 360登录自动填写,汇总:如何在360浏览器中删除自动填写的表单?
- 网页端epub阅读器你试过吗?这些阅读器竟然这么好用,书迷必看
- 驱动人生6网卡版 v6.1.19.90 官方版
- JRebel设置快捷键+激活方式
- 谷歌浏览器,如何不用翻墙,下载插件?
- Selenium与phantomjs安装与环境配置,以及易班网站模拟登陆操作
- 加油中国,雄起汶川-快乐工作,快乐生活(多图)
- UI设计师常用什么工具 怎么用AE导出GIF动画
- 阿里云服务器一年多少钱?最便宜的一年