- BC20270041's blog
单调栈&单调队列
- 2024-11-21 21:11:19 @
原理:判断输入の这一个数据能否进入。
//单调栈笔记&C++竞赛团队训练17047
#include<bits/stdc++.h>
using namespace std;
int stk[123456],tt;/*top,顶部*/
int main(){
int n;
cin>>n;
while(n--){
int temp;
cin>>temp;
//temp>栈顶符合(保证栈不为空)
while(tt&&stk[tt]>=temp)tt--;
//stk[tt]就是答案
if(!tt)cout<<-1<<' ';
else cout<<stk[tt]<<' ';
stk[++tt]=temp;
}
return 0;
}
//单调队列笔记&C++竞赛团队训练2120
#include<bits/stdc++.h>
using namespace std;
int a[1234567],q[1234567];
int main() {
int n,k;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
//head,tail
int hh=0,tt=-1;
for(int i=0;i<n;i++){
//增加元素
if(hh<tt&&i-k+1>q[hh])hh++;
while(hh<=tt&&a[q[tt]]>=a[i])tt--;
q[++tt]=i;
if(i>=k-1){
printf("%d ",a[q[hh]]);
}
}
cout<<endl;
hh=0,tt=-1;
for(int i=0;i<n;i++){
//增加元素
if(hh<tt&&i-k+1>q[hh])hh++;
while(hh<=tt&&a[q[tt]]<=a[i])tt--;
q[++tt]=i;
if(i>=k-1){
printf("%d ",a[q[hh]]);
}
}
return 0;
}