用两个优先队列,一个升序,一个降序;
c++6s,G++tle 求解;
详细见代码:
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int res1[1000002];
int res2[1000002];
struct ss
{
int val;
int x;
};
struct mycomp1
{
bool operator() (ss a,ss b)
{
return a.val>b.val;
}
};
struct mycomp2
{
bool operator() (ss a,ss b)
{
return a.val<b.val;
}
};
int main()
{
priority_queue<ss,vector<ss>,mycomp1> q1;//降序
priority_queue<ss,vector<ss>,mycomp2> q2;//升序
ss sa;
int n,k,i;
while(~scanf("%d%d",&n,&k))
{
int a;
for(i=1;i<=k;i++)
{
scanf("%d",&a);
sa.val=a;sa.x=i;
q1.push(sa);
q2.push(sa);
}
int num1=0,num2=0;
sa=q1.top(); res1[num1++]=sa.val;
sa=q2.top();res2[num2++]=sa.val;
for(int j=i;j<=n;j++)
{
scanf("%d",&a);
sa.val=a;sa.x=j;
q1.push(sa); q2.push(sa);
while(1)
{
sa=q1.top();
if(sa.x<j-k+1) q1.pop();
else {res1[num1++]=sa.val; break;}
}
while(1)
{
sa=q2.top();
if(sa.x<j-k+1) q2.pop();
else {res2[num2++]=sa.val;break;}
}
}
for(i=0;i<num1-1;i++)
printf("%d ",res1[i]); printf("%d\n",res1[i]);
for(i=0;i<num2-1;i++)
printf("%d ",res2[i]); printf("%d\n",res2[i]);
}
return 0;
}