题目描述
给定一个长度为 NN 的数组 aa 和一个常数 kk,数组的值分别为 a1,a2,...,aNa1,a2,...,aN。
定义 F(i)F(i) 表示区间 [max(1,i−k),i][max(1,i−k),i] 的最小值,G(i)G(i) 表示区间 [max(1,i−k),i][max(1,i−k),i] 的最大值。
请你求出 G(i)−F(i)G(i)−F(i) 的最大值。
输入描述
输入第 11 行包含两个正整数 N,kN,k。
第 22 行包含 NN 个非负整数 a1,a2,...,aNa1,a2,...,aN,表示数组 aa 元素的值。
1≤N,k≤1061≤N,k≤106,−106≤ai≤106−106≤ai≤106。
输出描述
输出共 11 行,包含一个整数,表示答案。
输入输出样例
示例 1
输入
6 3
4 6 5 2 3 1
输出
4
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int main()
{
// 请在此输入您的代码
int n,k;cin>>n>>k;
int a[N];
for(int i=1;i<=n;i++)cin>>a[i];
deque<int> q1,q2;
int ans=0;
for(int i=1;i<=n;i++)
{
while(!q1.empty()&&a[q1.back()]<=a[i])q1.pop_back();
q1.push_back(i);
if(!q1.empty()&&i-q1.front()>=k)q1.pop_front();
while(!q2.empty()&&a[q2.back()]>=a[i])q2.pop_back();
q2.push_back(i);
if(!q2.empty()&&i-q2.front()>=k)q2.pop_front();
ans=max(ans,a[q1.front()]-a[q2.front()]);
}
cout<<ans;
return 0;
}