单调队列
- 三个步骤:
- 判断队头决策与i的距离是否超出M的范围,若超出则出队
- 此时队头就是右端点为i时,左端点j的最优选择
- 不断删除队尾决策,直到队尾的S值小于S[i]。然后把i作为一个新的决策入队。
//单调队列板子 (区间和最大)
int l = 1, r = 1;
q[1] = 0;
for(int i = 1; i <= n; ++i){
while(l <= r && q[l] < i - m) l++; //step 1
ans = max(ans,sum[i] - sum[q[l]]); // step 2
while(l <= r && sum[q[r]] >= sum[i]) r--; //step 3
q[++r] = i;
}
//区间最大值
int l = 1, r = 0;
for(int i = 1; i< =n; ++i) {
while (l <= r && s[i] >= s[q[r]]) r--;
q[++r] = i;
while (l <= r && q[l] < i - m) ++l;
}