题意:略。
题记:
取区间最大值的情况:取维护一个双端队列,每当a[i]进入队尾时,在a[i]之前进入队列且比a[i]小的数是不可能成为区间最大值了,所以这些数可以在队列中删掉。取最小值同理。
#include<bits/stdc++.h> using namespace std; const int N=1e6+10; int a[N]; deque<int>q; int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int n,k; cin>>n>>k; for(int i=1;i<=n;i++){ cin>>a[i]; while(!q.empty()&&i-q.front()+1>k) q.pop_front(); while(!q.empty()&&a[q.back()]>a[i]) q.pop_back(); q.push_back(i); if(i>=k&&i!=n)cout<<a[q.front()]<<' '; else if(i==n)cout<<a[q.front()]<<endl; } q.clear(); for(int i=1;i<=n;i++){ while(!q.empty()&&i-q.front()+1>k) q.pop_front(); while(!q.empty()&&a[q.back()]<a[i]) q.pop_back(); q.push_back(i); if(i>=k&&i!=n)cout<<a[q.front()]<<' '; else if(i==n)cout<<a[q.front()]<<endl; } return 0; }