G

include<stdio.h>

int a[1000001];
int top=-1;
void push(int num){
a[++top]=num;
}
void pop(){
printf("%d ", a[top--]);
}
int main(){
int n, i;
int b[1000001]={0};
int c[1000001]={0};
scanf("%d", &n);
for(i=0;i<n;i++){
scanf("%d", &b[i]);
}
int k;
k=b[n-1];
for(i=n-1;i>=0;i--){
if(k>b[i]) k=k;
else k=b[i];
c[i]=k;
}
for(i=0;i<n;i++){
push(b[i]);
while(top!=-1&&a[top]>=c[i+1]&&i!=n-1){
pop();
}
}
while(top!=-1){
pop();
}
return 0;
}

◮:栈操作:遍历排列 p,将每个元素入栈。每次入栈后,检查栈顶元素是否为当前最大元素 current_max,若是则弹出并加入结果序列,同时 current_max 减 1。

剩余元素处理:遍历结束后,若栈中还有剩余元素,依次弹出并加入结果序列

◮:dfs?见笔记P13

posted @ 2025-08-12 15:00  ervgiu28hg34y827  阅读(7)  评论(0)    收藏  举报