5 条题解

  • 1
    @ 2023-8-5 0:29:19

    这道题大意就是让我们求区间内的最大最小值,就是一道RMQ问题,可以用单调队列解决。

    单调队列,顾名思义就是一个所有元素都有单调性的队列,我们可以建立一个队列来维护这些数据。

    首先每加入新元素前,我们要检查队首是否还在需统计的区间中,若否,出队。

    其次,维护队列单调性。以区间最大值为例,如果当前元素比队尾元素大,就不停出队,直到元素不大于队尾元素为止。

    处理完后,区间的最大值就是队首元素,直接输出即可。

    以下为部分代码,为防止复制就没全贴上来了(笑):

    //区间最小值
    for(int i=1;i<=n;i++){
    		while(!q.empty()&&i-k>=q.front()){
    			q.pop_front();
    		}//检查队首是否还在需统计的区间中
    		while(!q.empty()&&a[i]<=a[q.back()]){
    			q.pop_back();
    		}//维护队列单调性
    		q.push_back(i);
    		if(i>=k){
    			cout<<a[q.front()]<<" ";
    		}//输出
    	}
    	cout<<endl;
    	q.clear();//一定要清空,因为你接下来还有算区间最大值
    

    信息

    ID
    65
    时间
    1000ms
    内存
    128MiB
    难度
    4
    标签
    递交数
    255
    已通过
    121
    上传者