Tyvj - 1305 单调队列优化dp

今天有点头痛就不写具体细节了,贴完走人

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
using namespace std;
const int maxn = 3e5+11;
typedef long long ll;
int a[maxn],n,m;
ll sum[maxn];
int main(){
	while(cin>>n>>m){
		rep(i,1,n) scanf("%d",&a[i]);
		rep(i,1,n) sum[i]=sum[i-1]+a[i];
		deque<ll> que;
		ll mx=0;
		rep(i,1,n){
			while(!que.empty()&&sum[que.front()]>sum[i]) que.pop_front();
			que.push_front(i);
			while(!que.empty()&&que.back()<i-m) que.pop_back();
			if(i==1) mx=max(mx,sum[1]);
			else mx=max(mx,sum[i]-sum[que.back()]);
		}
		cout<<mx<<endl;
	}
	return 0;
}
posted @ 2018-04-02 18:50  Caturra  阅读(121)  评论(0)    收藏  举报