P1725 琪露诺

P1725 琪露诺


单调队列优化dp

对于不是常数转移的dp转移,我们都可以考虑单调队列转移

然而我们要把数组开大

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int read()
{
	int s=0,f=1;
	char in=getchar();
	while(in<'0'||in>'9')
	{
		if(in=='-')
			f=-1;
		in=getchar();
	}
	while(in>='0'&&in<='9')
	{
		s=(s<<1)+(s<<3)+in-'0';
		in=getchar();
	}
	return s*f;
}
int data[301000];
int dp[301000];
struct node
{
	int value;
	int rank;
};
node queue[2010000];
int head=1,tail;
int n,l,r;
void push(int x,int pos)
{
	while(queue[tail].value<x&&tail>=head)
		tail-=1;
	tail+=1;
	queue[tail].value=x;
	queue[tail].rank=pos;
}
int top()
{
	return queue[head].value;
}
void pop(int pos)
{
	while(queue[head].rank<pos-r)
		head+=1;
	return ;
}
int main()
{
	n=read(),l=read(),r=read();
	if(r<l)
		swap(l,r);
	for(int i=0;i<=n;i++)
		data[i]=read();
	for(int i=1;i<=l-1;i++)
		dp[i]=-0x7fffffff;
	for(int i=l;i<=n+r;i++)
	{
		push(dp[i-l],i-l);
		pop(i);
		dp[i]=data[i]+top();
	}
	int ans=-0x7fffffff;
	for(int i=n+1;i<=n+r;i++)
		ans=max(ans,dp[i]);
	printf("%d",ans);
}
posted @ 2018-04-24 21:53  Lance1ot  阅读(116)  评论(0编辑  收藏  举报