假期
题目
经过几个月辛勤的工作,FJ决定让奶牛放假。假期可以在1…N天内任意选择一段(需要连续),
每一天都有一个享受指数W。但是奶牛的要求非常苛刻,假期不能短于P天,否则奶牛不能得到足
够的休息;假期也不能超过Q天,否则奶牛会玩的腻烦。FJ想知道奶牛们能获得的最大享受指数。
Input
第一行:N,P,Q.
第二行:N个数字,中间用一个空格隔开,每个数都在longint范围内。
Output
一个整数,奶牛们能获得的最大享受指数。
Sample Input
5 2 4
-9 -4 -3 8 -6
Sample Output
5
Hint
50% 1≤N≤10000
100% 1≤N≤100000
1<=p<=q<=n
选择第3-4天,享受指数为-3+8=5。
题解
求前缀和sum,
若要使[l,r]区间的值最大,则sum[l - 1]需最小。
用双端队列deque做单调队列求最小
s
u
m
[
k
]
sum[k]
sum[k] 且
i
−
q
<
=
k
<
=
i
−
p
i-q<=k<=i-p
i−q<=k<=i−p
代码
#include<iostream>
#include<deque>
using namespace std;
long long n,x,y,a,s[200001],ans=-2147483647;//有负数,所以赋最小值
deque<int> e;
int main()
{
cin>>n>>x>>y;
for(int i=1; i<=n; i++)
{
cin>>a;
s[i]=s[i-1]+a; //求前缀和
}
for(int i=x; i<=n; i++)
{
while(!e.empty()&&s[e.back()]>s[i-x]) e.pop_back();
e.push_back(i-x);//找到合适的位置push
while(!e.empty()&&e.front()<(i-y)) e.pop_front();//弹出“过时”的元素
ans=max(s[i]-s[e.front()],ans);
}
cout<<ans;
}