【单调队列】【P2627】 修剪草坪
Wa这次竟然不是Uva的题
Description
在一年前赢得了小镇的最佳草坪比赛后,Farm John变得很懒,再也没有修剪过草坪。现在,新一轮的最佳草坪比赛又开始了,Farm John希望能够再次夺冠。
然而,Farm John的草坪非常脏乱,因此,Farm John只能够让他的奶牛来完成这项工作。Farm John有N只排成一排的奶牛,编号为1...N。每只奶牛的效率是不同的,奶牛i的效率为E_i。
靠近的奶牛们很熟悉,因此,如果Farm John安排超过K只连续的奶牛,那么,这些奶牛就会罢工去开派对:)。因此,现在Farm John需要你的帮助,计算FJ可以得到的最大效率,并且该方案中没有连续的超过K只奶牛。
Input
第一行:空格隔开的两个整数 N 和 K
第二到 N+1 行:第 i+1 行有一个整数 E_i
Output
第一行:一个值,表示 Farm John 可以得到的最大的效率值。
Sample Input
Sample Output
Hint
n≤100000,E在int范围内。
答案可能需要使用long long存储
Solution
看这小东西长得这么别致题长成这样就差不多是个DP了。考虑状态,设计fi为考虑前i头牛的ans。
考虑这么转移:
如果选了第i个,那么从i-k-1~i-1个之中就必须不选一个,这样就可以枚举不选的是哪一个,进行转移。
状态转移方程为:
fi=max{fj-1+sumi-sumj|j>=i-k-1}
这么做的时间复杂度为O(nk),在极端情况下n和k同阶,时间复杂度达到了O(n2),于是GG。
考虑优化:
fi=max{fj-1+sumi-sumj|j>=i-k-1}=sumi+max{fj-1-sumj}
因为sumi是一个常数,所以转移只与j有关。于是就妥妥的单调队列。最终时间复杂度O(n),可以通过。
Code
#include<cstdio>
#include<algorithm>
#define rg register
#define ci const int
#define cl const long long int typedef long long int ll; namespace IO {
char buf[];
} template <typename T>
inline void qr(T &x) {
char ch=getchar(),lst=' ';
while(ch>''||ch<'') lst=ch,ch=getchar();
while(ch>=''&&ch<='') x=(x<<)+(x<<)+(ch^),ch=getchar();
if(lst=='-') x=-x;
} template <typename T>
inline void write(T x,const char aft,const bool pt) {
if(x<) {putchar('-');x=-x;}
int top=;
do {
IO::buf[++top]=x%+'';
x/=;
}while(x);
while(top) putchar(IO::buf[top--]);
if(pt) putchar(aft);
} template <typename T>
inline T mmax(const T _a,const T _b) {if(_b<_a) return _a;return _b;}
template <typename T>
inline T mmin(const T _a,const T _b) {if(_a>_b) return _b;return _a;}
template <typename T>
inline T mabs(const T _a) {if(_a<) return -_a;return _a;} template <typename T>
inline void mswap(T &_a,T &_b) {
T _temp=_a;_a=_b;_b=_temp;
} const int maxn = ; int n,k;
ll frog[maxn];
ll sum[maxn];
ll ans;
int que[maxn];int frt,tal; int main() {
qr(n);qr(k);
for(rg int i=;i<=n;++i) {ll &now=sum[i];qr(now);now+=sum[i-];}
for(rg int i=;i<=n;++i) {
if(frt<=tal&&i-que[frt]>k) ++frt;
rg ll ss=frog[i-]-sum[i];
while(frt<=tal&&ss>=frog[que[tal]-]-sum[que[tal]]) --tal;
que[++tal]=i;
if(i<=k) frog[i]=sum[i];
else frog[i]=sum[i]+frog[que[frt]-]-sum[que[frt]];
ans=mmax(ans,frog[i]);
}
write(ans,'\n',true);
return ;
}
Summary
1、方程复杂度太高是可以尝试对方程进行化简,说不定特殊性质就出来了。
2、找到状态难以枚举前面所有元素时,可以考虑枚举特殊点,比如本题中的断点。
【单调队列】【P2627】 修剪草坪的更多相关文章
- P2627 修剪草坪
P2627 修剪草坪 题目描述 在一年前赢得了小镇的最佳草坪比赛后,Farm John变得很懒,再也没有修剪过草坪.现在,新一轮的最佳草坪比赛又开始了,Farm John希望能够再次夺冠. 然而,Fa ...
- 洛谷 P2627 修剪草坪 题解
P2627 修剪草坪 题目描述 在一年前赢得了小镇的最佳草坪比赛后,Farm John变得很懒,再也没有修剪过草坪.现在,新一轮的最佳草坪比赛又开始了,Farm John希望能够再次夺冠. 然而,Fa ...
- P2627 修剪草坪 (单调队列优化$dp$)
题目链接 Solution 70分很简单的DP,复杂度 O(NK). 方程如下: \[f[i][1]=max(f[j][0]+sum[i]-sum[j])\]\[f[i][0]=max(f[i-1][ ...
- [洛谷P2627] 修剪草坪
传送门:>Here< 题意:不能有连续超过$k$个奶牛的一段,求最大的和 思路分析 Dp还是容易看出来的. 我的第一感觉是一维,$f[i]$表示前i头奶牛的最大效率.其实这也是可以解的,具 ...
- luogu P2627 修剪草坪
传送门 单调队列优化dp板子 表示不大想写详细做法,自己看代码吧qwq (懒) 注意细节,不然就会跟我一样WA4次 // luogu-judger-enable-o2 #include<bits ...
- bzoj2442[Usaco2011 Open]修剪草坪 单调队列优化dp
2442: [Usaco2011 Open]修剪草坪 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1159 Solved: 593[Submit] ...
- BZOJ_2343_[Usaco2011 Open]修剪草坪 _单调队列_DP
BZOJ_2343_[Usaco2011 Open]修剪草坪 _单调队列_DP 题意: N头牛,每头牛有一个权值,选择一些牛,要求连续的不能超过k个,求选择牛的权值和最大值 分析: 先考虑暴力DP,f ...
- [BZOJ2442][Usaco2011 Open]修剪草坪 dp+单调队列优化
2442: [Usaco2011 Open]修剪草坪 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1118 Solved: 569[Submit] ...
- BZOJ 2442: [Usaco2011 Open]修剪草坪 单调队列
Code: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm& ...
随机推荐
- python一标准异常总结大全(非常全)
Python标准异常总结 AssertionError 断言语句(assert)失败 AttributeError 尝试访问未知的对象属性 EOFError 用户输入文件末尾标志EOF(Ctrl+d) ...
- C++11 type_traits 之is_convertible源码分析
请看源码: struct __sfinae_types { typedef char __one; typedef ]; } __two; }; template<typename _From, ...
- python终极篇 ---django 模板系统
模板系统 . MV ...
- 栈和队列ADT -数据结构(C语言实现)
数据结构与算法分析 栈模型 限制插入和删除只能在表的末端的表 表的末端叫做栈顶(top) 支持Push进栈和Pop入栈操作 //LIFO后进先出表 栈的实现 链表实现 类型声明 struct Node ...
- 正式放弃Edge,重新拥抱Chrome
从Edge还叫斯巴达的时候我就开始用了,本来对浏览器的要求也没多高,能够打开多个选项卡,稳定,支持最新的规范就好了. 但是Edge真的是越来越让我失望了,卡死问题越来越多,崩溃越来越频繁,我也快奔溃了 ...
- C语言链接数据库
一.解释一下函数功能和用法 1.mysql_real_connect 函数原型:MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, co ...
- location 匹配规则 (NGINX)
转:https://moonbingbing.gitbooks.io/openresty-best-practices/ngx/nginx_local_pcre.html location 匹配规则 ...
- Alpha发布文案+美工
文案: Alpha发布文稿 我们是Hello World!团队,下面由我来简要介绍一下我们组的作品,我们组做的是一个飞机射击类游戏,名字叫做空天猎.这个游戏是基于JAVA平台创建的,那么接下来让我给大 ...
- Activity生命周期 与 Activity 之间的通信
一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...
- lintcode-184-最大数
184-最大数 给出一组非负整数,重新排列他们的顺序把他们组成一个最大的整数. 注意事项 最后的结果可能很大,所以我们返回一个字符串来代替这个整数. #### 样例 给出 [1, 20, 23, 4, ...