洛谷P1725

P1725 琪露诺

点击查看代码
#include<bits/stdc++.h>
using namespace std;

const int N = 2e6 + 10;
vector<int>dp(N);
vector<int>a(N);

int main() {
    int n, l, r; cin >> n >> l >> r;
    for(int i = 0; i <= n; i++) cin >> a[i];
    for(int i = n ; i >= n - l ; i -- ) dp[i] = a[i] ;
    
    deque<int> q;
    q.push_back(n + 1);

    for(int i = n ; i >= l ; i-- ){//从i-l跳到[i,i-l+r]
		while(q.size() && dp[q.back()] <= dp[i])q.pop_back() ;
		q.push_back(i) ;
		while(q.size() && q.front() > i - l + r)q.pop_front() ;
		
		dp[i - l] = dp[q.front()] + a[i - l] ;
		
	}
    //最开始思路是
    //dp[i] = max[dp[i - L, i - R]] + a[i]
    //dp[n] = max[dp[n - L, n]] + a[n]
    //反推的话更轻松一些
    cout << dp[0] << '\n';
    return 0;
}
posted @ 2025-05-14 16:32  Chuan81  阅读(1)  评论(0)    收藏  举报