注意:
- k可能大於n
- 彈出值的時候要二分 , 不然會TLE ; 用 c++ 交可以 5s 卡過測試
AC代碼
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<limits.h>
using namespace std;
#define rep(i,l,p) for(int i =l;i<=p;i++)
#define fread() freopen("in.txt","r",stdin)
struct node
{
int x,pos;
node (int _,int __):x(_),pos(__){}
node(){}
};
struct pi
{
int l,r;
}pmax,pmin;
node mmax[1000005],mmin[1000005];
int n,k;
vector<int> ans_1,ans_2;
int main(int argc, char const *argv[])
{
scanf("%d%d",&n,&k);
if(k>n) k = n;
if( k == n){
int res_1 = INT_MAX,res_2 = INT_MIN,t;
rep(i,1,n){
scanf("%d",&t);
res_1 = min(res_1,t);
res_2 = max(res_2,t);
}
printf("%d\n%d\n",res_1,res_2 );
return 0;
}
pmax.l = pmax.r = 0;
pmin.l = pmin.r = 0;
rep(i,1,n){
int t;
scanf("%d",&t);
int l = i - k + 1;
while( pmax.r > pmax.l && mmax[pmax.l+1].pos < l ){
pmax.l++;
}
while( pmin.r > pmin.l && mmin[pmin.l+1].pos < l){
pmin.l++;
}
while( pmax.r > pmax.l && t >= mmax[pmax.r].x ){
pmax.r--;
}
while( pmin.r > pmin.l && t <= mmin[pmin.r].x){
pmin.r--;
}
pmax.r++;
mmax[pmax.r].x = t;
mmax[pmax.r].pos = i;
pmin.r++;
mmin[pmin.r].x = t;
mmin[pmin.r].pos = i;
if(i<k) continue;
else{
ans_1.push_back(mmin[pmin.l+1].x);
ans_2.push_back(mmax[pmax.l+1].x);
}
}
rep(i,0,ans_1.size()-2){
printf("%d ",ans_1[i]);
}
printf("%d\n",ans_1[ans_1.size()-1] );
rep(i,0,ans_2.size()-2){
printf("%d ",ans_2[i]);
}
printf("%d\n",ans_2[ans_2.size()-1] );
return 0;
}