下午T3 WA60求调




(我又来了)
思路:两次单调栈, fi 表示正在寻找第一个比它大的元素的下标, se 表示正在寻找第二个比它大的元素的下标。

#include<bits/stdc++.h>
using namespace std;
int n,a[100005],f[100005];
stack<int> fi,se;
int main(){
  scanf("%d",&n);
  for(int i=1;i<=n;i++) scanf("%d",&a[i]);
  for(int i=1;i<=n;i++){
    while(!se.empty()&&a[se.top()]<a[i]){
      f[se.top()]=a[i];
      se.pop();
    }
    while(!fi.empty()&&a[fi.top()]<a[i]){
      se.push(fi.top());
      fi.pop();
    }
    fi.push(i);
  }
  while(!fi.empty()){
    f[fi.top()]=-1;
    fi.pop();
  }
  while(!se.empty()){
    f[se.top()]=-1;
    se.pop();
  }
  for(int i=1;i<=n;i++){
    printf("%d ",f[i]);
  }
  return 0;
}

图片
这俩难道不该是差不多的语句吗?
我觉得这俩必错一个

你觉得?到底是哪个,怎么改,你说清楚啊

你这个问题我知道

你再多开一个栈st,把fi的值放到st中,因为如果直接吧fi放进se中的话,顺序会变(因为先进后出),所以先放到st中,顺序反了,再放到se中,又反了一次,反反得正

可以用队列吗?

用栈

A了吗?

em…没有,感觉没懂

哦,好像悟了,我再去试试

已A,感谢

解决方案

给了