Sliding Window
双端队列写法需要用C++提交,G++会超时
#include<cstdio>
#include<deque>
using namespace std;
const int N=1000010;
deque<int> q;
int main(void)
{
int n,k,a[N];scanf("%d%d",&n,&k); for(int i=0;i<n;i++) scanf("%d",&a[i]);for(int i=0;i<n;i++){
if(!q.empty()&&i-k+1>q.front()) q.pop_front();while(!q.empty()&&a[q.back()]>=a[i]) q.pop_back();q.push_back(i);if(i+1>=k) printf("%d ",a[q.front()]);}puts("");q.clear();for(int i=0;i<n;i++){
if(!q.empty()&&i-k+1>q.front()) q.pop_front();while(!q.empty()&&a[q.back()]<=a[i]) q.pop_back();q.push_back(i);if(i+1>=k) printf("%d ",a[q.front()]);}return 0;
}
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
int a[1000011];
int OutMin[1000011];
int OutMax[1000011];
int cnt1=0,cnt2=0;
int n,k;
struct cmp1
{
bool operator()(const int a1,const int a2){
return a[a1]>a[a2];}
};
struct cmp2
{
bool operator()(const int a1,const int a2){
return a[a1]<a[a2];}
};
priority_queue<int,vector<int>,cmp1>Q1;
priority_queue<int,vector<int>,cmp2>Q2;
int main()
{
int i;scanf("%d%d",&n,&k);if(k>n) k=n;for(i=1;i<=n;++i) scanf("%d",&a[i]);for(i=1;i<=k;++i){
Q1.push(i);Q2.push(i);}OutMin[cnt1++]=a[Q1.top()];OutMax[cnt2++]=a[Q2.top()];for(i=k+1;i<=n;++i){
Q1.push(i);Q2.push(i);while(i-Q1.top()>=k)Q1.pop();OutMin[cnt1++]=a[Q1.top()];while(i-Q2.top()>=k)Q2.pop();OutMax[cnt2++]=a[Q2.top()];}for(i=0;i<=(n-k);++i) printf("%d ",OutMin[i]); puts("");for(i=0;i<=(n-k);++i) printf("%d ",OutMax[i]); return 0;
}