hiho 1620 - 股票价格3 - 无限制的单调队列?

题目链接

小Hi最近在关注股票,为了计算股票可能的盈利,他获取了一只股票最近N天的价格A1~AN。  

小Hi想知道,对于第i天的股票价格Ai,几天之后股价会第一次超过Ai。  

假设A=[69, 73, 68, 81, 82],则对于A1=69,1天之后的股票价格就超过了A1;对于A2=73,则是2天之后股票价格才超过A2。

输入

第一行包含一个整数N。  

以下N行每行包含一个整数Ai。  

对于50%的数据,1 ≤ N ≤ 1000  

对于100%的数据,1 ≤ N ≤ 100000, 1 ≤ Ai ≤ 1000000

输出

输出N行,其中第i行代表对于第i天的股票价格Ai,几天之后股价会第一次超过Ai。  

如果Ai+1~AN之内没有超过Ai,输出-1

--------------------------------------------------------------------------------------------------------------------------------------------------------

维护一个单调递减的队列,每push一个元素,pop掉所有小于他的元素,而pop掉的这些元素的结果正是当前元素。

每个元素进出队列各一次,复杂度为2N

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100100;
int q_val[N],q_ind[N];
int ans[N];
int q_rear = 0;

int main(){
    int n,tint; cin>>n;
    for(int i=0;i<n;i++,q_rear++){
        scanf("%d",&tint);
        while(q_rear>0&&q_val[q_rear-1]<tint){
            q_rear--;
            ans[q_ind[q_rear]]=i-q_ind[q_rear];
        }
        q_val[q_rear]=tint;
        q_ind[q_rear]=i;
    }
    while(q_rear-->0) ans[q_ind[q_rear]]=-1;
    for(int i=0;i<n;i++) printf("%d\n",ans[i]);
    return 0;
}

 

转载于:https://www.cnblogs.com/redips-l/p/7794443.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值