码迷,mamicode.com
首页 > 其他好文 > 详细

luogu1725 琪露诺

时间:2017-11-30 21:41:38      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:cout   更新   class   std   div   ace   main   return   准备   

单调队列

#include <iostream>
#include <cstdio>
using namespace std;
int n, l, r, dp[400005], a[200005], q[200005], hea, tai;
//dp[i] = max{dp[k]} + w[i] | i-r<=k<=i-l
int main(){
    cin>>n>>l>>r;
    for(int i=0; i<=n; i++) scanf("%d", &a[i]);
    for(int i=l; i<=n; i++){
        while(hea<=tai && q[hea]<i-r)   hea++;//过期了
        while(hea<=tai && dp[q[tai]]<dp[i-l])   tai--;//准备放进去i-l的
        q[++tai] = i-l;//这才更新i-l的
        dp[i] = dp[q[hea]] + a[i];
    }
    int maxn=0;
    for(int i=n-r+1; i<=n; i++) maxn = max(maxn, dp[i]);
    cout<<maxn<<endl;
    return 0;
}

luogu1725 琪露诺

标签:cout   更新   class   std   div   ace   main   return   准备   

原文地址:http://www.cnblogs.com/poorpool/p/7931731.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!