描述

孙悟空大战鲤鱼精,孙悟空在通天河遇到鲤鱼精,他嫉恶如仇,看见妖精就手痒(忘了自己是妖精)。但是鲤鱼精知道孙悟空的厉害,在孙悟空来到通天河,鲤鱼精就跑到了河对面。于是孙悟空就去追鲤鱼精。 我们可以把通天河看成一列格子,从0编号到N,孙悟空只能从小号格子到大号格子,当他在第i号格子,他移动的时候只会到[i+L,i+R]的某一格。每一个格子有一个魔法数Wi,第0号格子指数诶0,当孙悟空在某一格停留时就会获得这个魔法值Wi。孙悟空希望通过通天河时获得最大的魔法,这样他才能狠打一下鲤鱼精,可是孙悟空战斗力高,脑袋不咋地(猴脑),他希望你来帮他计算如何达到对岸,他开始在第0号 格。他只要最后一步落在的位置编号大于了N就算通过了通天河

输入

第1行:3个正整数N, L, R

第2行:N+1个整数,第i个数表示编号为i-1的格子的魔法数A[i-1]

输出

第1行:一个整数,表示最大魔法值。保证不超过2^31-1 第2行:空格分开的若干个整数,表示孙悟空前进的路线,最后输出-1表示到达对岸

样例输入

5 2 3

0 12 3 11 7 -2

样例输出

11

0 3 -1

提示

对于60%的数据:N <= 10,000

对于100%的数据:N <= 200,000

对于所有数据 -1,000 <= A[i] <= 1,000且1 <= L <= R <= N


一道带了spj的单调队列优化dp。

注意元素入队和出队的条件。

代码:

#include<bits/stdc++.h>
#define N 200005
using namespace std;
inline int read(){
	int ans=0,w=1;
	char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans*w;
}
inline int write(int x){
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x/10);
	putchar((x%10)^48);
}
int n,l,r,pred[N],a[N],f[N],q[N],print[N],hd,tl,tot=0;
int main(){
	n=read(),l=read(),r=read(),hd=1,tl=0;
	for(int i=0;i<=n;++i)a[i]=read();
	for(int i=1;i<=n;++i)f[i]=-1e9;
	for(int i=1;i<=n;++i){
		while(hd<=tl&&q[hd]<i-r)++hd;
		if(i>=l){
			while(hd<=tl&&f[q[tl]]<f[i-l])--tl;
			q[++tl]=i-l;
		}
		if(hd<=tl)f[i]=f[q[hd]],pred[i]=q[hd];
		f[i]+=a[i];
	}
	int ans=n-r+1;
	for(int i=n-r+2;i<=n;++i)if(f[i]>f[ans])ans=i;
	write(f[ans]),puts("");
	for(int i=ans;i;i=pred[i])print[++tot]=i;
	print[0]=-1,print[++tot]=0;
	for(int i=tot;~i;--i)write(print[i]),putchar(' ');
	return 0;
}

2018.09.23 孙悟空大战鲤鱼精(单调队列优化dp)的更多相关文章

  1. 2018.09.06 烽火传递(单调队列优化dp)

    描述 烽火台是重要的军事防御设施,一般建在交通要道或险要处.一旦有军情发生,则白天用浓烟,晚上有火光传递军情. 在某两个城市之间有 n 座烽火台,每个烽火台发出信号都有一定的代价.为了使情报准确传递, ...

  2. 2018.07.10NOIP模拟 Knapsack(单调队列优化dp)

    Knapsack 题目背景 SOURCE:NOIP2016-RZZ-4 T2 题目描述 有 n 个物品,第 i 个物品的重量为 ai . 设 f(i,j,k,l,m) 为满足以下约束的物品集合数量: ...

  3. 2018.09.26洛谷P3957 跳房子(二分+单调队列优化dp)

    传送门 表示去年考普及组的时候失了智,现在看来并不是很难啊. 直接二分答案然后单调队列优化dp检验就行了. 注意入队和出队的条件. 代码: #include<bits/stdc++.h> ...

  4. 2018.09.10 bzoj1499: [NOI2005]瑰丽华尔兹(单调队列优化dp)

    传送门 单调队列优化dp好题. 这题其实很简单. 我们很容易想到一个O(T∗n∗m)" role="presentation" style="position: ...

  5. 2018.09.10 bzoj1855: [Scoi2010]股票交易(单调队列优化dp)

    传送门 单调队列优化dp好题. 有一个很明显的状态设置是f[i][j]表示前i天完剩下了j分股票的最优值. 显然f[i][j]可以从f[i-w-1][k]转移过来. 方程很好推啊. 对于j<kj ...

  6. 单调队列优化DP,多重背包

    单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...

  7. bzoj1855: [Scoi2010]股票交易--单调队列优化DP

    单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...

  8. hdu3401:单调队列优化dp

    第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...

  9. Parade(单调队列优化dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others)    ...

随机推荐

  1. 笔记本 T450的鼠标经常不灵

    T450的鼠标经常不灵,鼠标总感觉有延迟. 换了鼠标也是这样. 有人反应说是USB断电, 使用的是省电模式,在设备管理>鼠标>电源选项>节电模式 勾去掉就可以了, 但是我的节点模式是 ...

  2. Yii2 基础学习

    <?php //url创建 echo Url::to(''); // same controller, different action // /index.php?r=management/d ...

  3. AS3 注意点

    当主类new 一个主影片来放内容的时候.在gc此swf时,一定要检查此主影片是否存在,如 private function initStart() { //trace("RightMenu类 ...

  4. ubuntu编译安装php7, 安装openssl

    sudo apt-get install openssl sudo apt-get install libssl-dev

  5. 基于OpenGL编写一个简易的2D渲染框架-05 渲染文本

    阅读文章前需要了解的知识:文本渲染 https://learnopengl-cn.github.io/06%20In%20Practice/02%20Text%20Rendering/ 简要步骤: 获 ...

  6. 13 python 常用的内置方法介绍

    1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...

  7. Technology, globalisation and the squeeze on good jobs

    Technology, globalisation and the squeeze on good jobs技术与全球化冲击好工作“Highest stock market EVER! Jobs ar ...

  8. REST Client

    1.  为什么要使用REST Client 在实际企业开发过程中经常会有这样的需求: 1.我当前开发的这个系统是需要调用其他系统的接口,也就是我们需要频繁的测试接口,尝试不同的入参参数去查看返回结果, ...

  9. scala sparseVetor, SprseMatrix 实现

    def rand(seed:Int):Double={ val rand=new Random(seed) rand.nextDouble()} def rand2(size:Int,seed:Int ...

  10. centos7 端口转发

    firewall-cmd --add-masquerade   firewall-cmd --add-forward-port=port=3001:proto=tcp:toaddr=172.17.18 ...