在 gsy 的老家有一排山峰,由西往东依次高度为 ai,现在 gsy 想知道如果她站在每一座山峰顶端,向东边(右边)看去,能看到多少座山峰
这里我们认为如果 y 在 x 的右边,而且 ay >= ax,则站在 x 这座山峰上时,没有办法看到 y 右边的山峰
第一行输入一个整数n,表示有n个山峰
接下来一行有 n 个整数 ai,表示由西向东的 n 个山峰的高度。
对于 30% 的数据,1 <= n <= 10^4。
对于 100% 的数据,1 <= n <= 10^6,1 <= ai <= 10^9。
输出n个整数,分别表示第i个山顶可以看见的山峰的个数
5
4 3 5 2 1
2 1 2 1 0
解析:其实题意总结就是找到每个a[ i ]右边第一个大于等于它的值位置b[ i ],此时能看见 b[ i ] - i 个山峰,如果没有就是能看见(n-i)个山峰,然后因为n<=10^6,因此需要O(n)求得b[i],可以利用单调栈来解决,从右向左遍历列表。
1.如果栈为空,则根本没有比它大的元素,记录-1
2.如果栈顶元素大于当前列表元素,那么记录栈顶元素为该元素对应的答案
3.如果栈顶元素小于等于当前列表元素,直接pop栈顶元素,继续比较栈顶元素和当前列表元素
4.将当前列表元素插入到单调栈中
#include
#include
using namespace std;
stack st;
const int N=1000005;
int a[N],b[N];//a存原数组,b[i]存a[i]右边第一个大于等于它的值的下标
int main()
{int n;scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=n;i>=1;i--){if(st.empty()) b[i]=-1;//如果栈为空,它就是当前最大else{if(a[i]<=a[st.top()]) b[i]=st.top();else{while(!st.empty()&&a[st.top()]
上一篇:p2深度学习基本概念简介下笔记
下一篇:信息学竞赛中常用名词