ZCMU--5276: 山峰
创始人
2024-05-06 06:50:44
0

Description

在 gsy 的老家有一排山峰,由西往东依次高度为 ai,现在 gsy 想知道如果她站在每一座山峰顶端,向东边(右边)看去,能看到多少座山峰
这里我们认为如果 y 在 x 的右边,而且 ay >= ax,则站在 x 这座山峰上时,没有办法看到 y 右边的山峰

Input

第一行输入一个整数n,表示有n个山峰

接下来一行有 n 个整数 ai,表示由西向东的 n 个山峰的高度。

对于 30% 的数据,1 <= n <= 10^4。
对于 100% 的数据,1 <= n <= 10^6,1 <= ai <= 10^9。

Output

输出n个整数,分别表示第i个山顶可以看见的山峰的个数

Sample Input

5
4 3 5 2 1

Sample Output

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()]

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...