A-数列下标
题意:给你一个序列A,求出一个数列B.
其中Bi表示数列A中Ai右边第一个比Ai大的数的下标(从1开始计数),没有找到这一个下标 Bi 就为0
样例输入:
6
3 2 6 1 1 2
输出:
3 3 0 6 6 0
题意解读:
从当前下标开始数
第一个比3大的数是6,B为3
第一个比2大的数是6,B为3
没有比6大的数, B为0
第一个比1大的数为2,B为6
第一个比1大的数为2,B为6
没有比2大的数 B为0
因此B数列为{3 3 0 6 6 0}
hint:可以直接套用单调栈,需要求第一个比ai大的数,那么从后往前遍历,并运用单调递减栈,如果栈大小不为0的时候,栈顶就是所求的B,如果栈大小为0,就说明i到n并没有比Ai更大的数了,因此B为0
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+5;
typedef long long LL;
stack<int>s;//栈存放的是下标
int a[N],b[N];
int main(){int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=n;i>=1;i--){while(s.size()&&a[s.top()]<=a[i])s.pop();if(s.size())b[i]=s.top();else b[i]=0;s.push(i);}for(int i=1;i<=n;i++){if(i!=1)cout<<" ";cout<<b[i];}system("pause");return 0;
}