社区讨论

#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 条回复,欢迎继续交流。

正在加载回复...