dp+单调队列优化。
f[i]表示的状态为以第i天为假期的最后一天所OIER们的最大享受指数。
先用sum数组求出前缀和,f[i]=sum[i]-min{sum[k]}(i-q<=k<=i-p)
单调队列维护单调递增区间,每次队首取出最小值。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxx = 1e5 + 100;
int n, p, q;
long long sum[maxx], ans = -(1 << 62);
int main()
{
freopen( "holiday.in", "r", stdin );
freopen( "holiday.out", "w", stdout );
cin>>n>>p>>q;
for(int i = 1; i <= n; i++)
scanf( "%I64d", &sum[i] ), sum[i] += sum[i - 1];
int que[maxx], h = 0, t = 0;
que[++t] = 0;
for(int i = 1; i <= n; i++)
{
for(; h < t && i - que[h + 1] > q; h++);
ans = max(ans, sum[i] - sum[que[h + 1]]);
for(; h < t && i >= p + 1 && sum[i - p + 1] <= sum[que[t]]; t--);
if(i >= p + 1) que[++t] = i - p + 1;
}
cout<<ans<<endl;
}