社区讨论
#2和#7WA了,dalao帮忙看一下
P1886【模板】单调队列 / 滑动窗口参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @loc25n3h
- 此快照首次捕获于
- 2023/10/30 06:43 2 年前
- 此快照最后确认于
- 2023/11/04 12:19 2 年前
CPP
#include<cstdio>
using namespace std;
const int M=1e6+1;
long long n,k,w[M],ma[M],mi[M],p=-0xfff,q=-0xfff,min_=0xffffffff,max_=-0xffffffff,l,r;
void xy(int t,int l,int r){
for(int t=l;t<=r;t++){
if(w[t] < min_){
min_ = w[t];
p=t;
}
}
mi[t]=min_;
min_=0xfffffff;
}
void yx(int u,int l,int r){
for(int u=l;u<=r;u++){
if(w[u] > max_){
max_ = w[u],
q=u;
}
}
ma[u]=max_;
max_=-0xfffffff;
}
int main(){
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++)
scanf("%lld",&w[i]);
l=1,r=k;
for(int i=1;i<=n;++i){
if( p < l )
xy(i,l,r);
else {
if(w[r] < w[p] )
mi[i]=w[r],p=r;
else mi[i]=w[p];
}
if( q < l )
yx(i,l,r);
else {
if(w[r] > w[q] )
ma[i]=w[r],q=r;
else ma[i]=w[q];
}
if(l < n-k+1)
++l,++r;
}
for(int i=1;i<=n-k+1;i++)
printf("%lld ",mi[i]);
printf("\n");
for(int i=1;i<=n-k+1;i++)
printf("%lld ",ma[i]);
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...