一、栈
#include <stdio.h>
#include <iostream>
using namespace std;
#define MAXN 200005
struct Stack{
int stk[MAXN];
int tp;
Stack(){
tp = 0;
}
bool empty(){
if(!tp) return 1;
return 0;
}
int size(){
return tp;
}
int pop(){
if(empty()) return 0;
return stk[tp--];
}
int top(){
if(empty()) return 0;
return stk[tp];
}
void push(int x){
stk[++tp] = x;
}
};
int n,p,w;
int main(void){
Stack s;
cin >> n;
for(int i=1;i<=n;i++){
cin >> p;
switch(p){
case 0:
cin >> w;
w = max(s.top(),w);
s.push(w);
break;
case 1:
if(!s.empty()) s.pop();
break;
case 2:
cout << s.top() << endl;
break;
}
}
return 0;
}
二、单调栈
这个题不知道为什么开了 O2 优化才过的,不是说好了不卡常了吗?
#include <stdio.h>
#include <iostream>
using namespace std;
#define MAXN 3000005
struct destack{
int tp;
int stk[MAXN],num[MAXN];
destack(){
tp = 0;
}
bool empty(){
if(!tp) return 1;
return 0;
}
int top(){
if(empty()) return 0;
return stk[tp];
}
int pop(){
if(empty()) return 0;
return stk[tp--];
}
void push(int x, int i){
stk[++tp] = x;
num[tp] = i;
}
int showans(){
return num[tp];
}
}s;
int n;
int a[MAXN],ans[MAXN];
int main(void){
cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
}
for(int i=n;i>0;i--){
int cnt = s.top();
while((cnt<=a[i]) && !s.empty()){
s.pop();
cnt = s.top();
}
ans[i] = s.showans();
s.push(a[i],i);
}
for(int i=1;i<=n;i++){
cout << ans[i] << " ";
}
return 0;
}