单调队列解答:
/*******************单调队列!=优先队列单调队列是为了保证队列内的元素具有单调性,在保持了元素原本顺序的同时,对元素进行了过滤,舍弃了会影响单调性的元素而优先队列本质上还是个队列不会舍弃任何元素,每个元素都在队列之中,但是在队列中的位置由优先队列定义的优先级来确定,损失了原数组中的数据相对位置关系。所以很显然,单调队列是解决:寻找在某元素左侧区间或者右侧区间的最值问题,而优先队列的应用是寻找整个区间内的最高优先级别的内容。/*******************#include<iostream> using namespace std; const int N = 1000010; int n, m ,hh , tt; int a[N]; int q[N]; int main(){ scanf("%d%d",&n,&m); for(int i = 0 ; i < n ; i ++) scanf("%d",&a[i]); hh = 0;tt = -1; //单调递增序列 for(int i = 0 ; i < n ; i ++){ //滑动窗口内数据调整 if( hh<=tt && q[hh] < i+1-m ) hh++; while( hh <= tt && a[q[tt]] >= a[i] ){ tt--; } q[ ++tt ] = i; if( i >= m - 1 ) printf("%d ",a[q[hh]]); } puts(""); hh = 0;tt = -1; //单调递减序列 for(int i = 0 ; i < n ;i ++){ //调整滑动窗口内的数据 if(hh <= tt && q[hh] < i+1-m){hh++;} while(hh <= tt && a[q[tt]] <= a[i] ) tt--; q[++tt] = i; if(i >= m-1) printf("%d ",a[q[hh]]); } puts(""); return 0; }
//单调栈,类似单调队列,对不满足单调性的数据进行筛选确保栈内元素单调 #include<iostream> using namespace std; const int N = 100010; int n,m; int st[N],tt; int main(){ cin>>n; int x; for(int i = 0 ; i < n ;i ++){ cin>>x; while( tt > 0 && st[tt]>=x ) tt--; if(tt==0){cout<<-1<<" ";} else{ cout<<st[tt]<<" "; } st[++tt] = x; } return 0; }
原文地址:https://www.cnblogs.com/Flydoggie/p/12259072.html
时间: 2024-10-06 17:56:35