猴子向右看,FOJ上某题 单调栈

原创 2015年07月06日 19:09:10

N (1 <= N <= 100,000) monkeys in the mountains, conveniently numbered 1..N, are once again standing in a row. Monkey i has height Hi (1 <= Hi <= 1,000,000).

Each monkey is looking to his left toward those with higher index numbers. We say that monkey i "looks up" to monkey j if i < j and Hi< Hj. For each monkey i, we would like to know the index of the first monkey in line looked up to by monkey i.

Input

Input consists of several testcases. The format of each case as follow:

Line 1: A single integer: NLines 2..N+1: Line i+1 contains the single integer: Hi

Output

For each testcase, output N lines. Line i contains a single integer representing the smallest index of a monkey up to which monkey i looks. If no such monkey exists, print 0.

Sample Input

6326112

Sample Output

330660

Hint

Monkey 1 and 2 both look up to monkey 3; monkey 4 and 5 both look up to monkey 6; and monkey 3 and 6 do not look up to any monkey.

题意:告诉n个一排猴子,每个猴子向右看,问第一个比自己高的猴子的位置,没有就输出0,最后一个也是0

#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
#include <stack>
#define N 100009
using namespace std;

int a[N];

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }

        int ans[N];
        memset(ans,0,sizeof ans);
        ans[n]=n;//初始化为n,但是实际值为0
        for(int i=n-1;i>=1;i--)//找右边第一个比a[i]小的位置
        {
            int tt=i;
            while(tt<n&&a[i]>=a[tt+1]) tt=ans[tt+1];
            ans[i]=tt;
        }

        for(int i=1;i<n;i++)
        {
            if(ans[i]==n)//当是最后一个猴子的时候,并不一定保证比当前猴子高
            if(a[i]<a[n])
            printf("%d\n",ans[i]+1);
            else
            cout<<0<<endl;
            else
            printf("%d\n",ans[i]+1);

        }

        cout<<0<<endl;

    }
    return 0;
}





单调栈练习题题解

单调栈单调栈顾名思义就是让栈中的元素是单调的,要么递增,要么递减。同样它也满足栈的性质,先进后出。 单调递增栈,则从栈顶到栈底的元素是严格递增的 单调递减栈,则从栈顶到栈底的元素是严格递减的 练习题单...
  • Z_Mendez
  • Z_Mendez
  • 2015年07月30日 20:14
  • 1339

SCU 2511 Moooo(单调栈模板题)

题意:给出n头牛,每头牛都会发出一个噪声,为v[i]。这个噪声只会被与他相邻高度严格比他高的牛所听到,问牛收到的最大的噪音是多少。 解法:因为我是在黄学长博客上找的题目23333,所以就是一道单调栈...
  • llzhh
  • llzhh
  • 2017年08月21日 15:04
  • 172

POJ - 2559(单调栈入门题)

Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %...
  • qq_24489717
  • qq_24489717
  • 2015年12月11日 18:26
  • 257

POJ 2796:Feel Good 单调栈经典题

Feel Good Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 11626   Accepted: 3212 ...
  • u010885899
  • u010885899
  • 2015年10月15日 09:52
  • 1543

HDU - 1506 Largest Rectangle in a Histogram: 单调栈入门题

题目点此跳转思路 题目意思是有一个由许多矩形组成的一个图形(下底对齐), 求这个图形里能找到的最大矩形的面积, 输入的是各个矩形的高度。 例如下图 很显然,这一题就是要求对于每一个矩形而言,它往左或右...
  • a27038
  • a27038
  • 2017年08月06日 22:14
  • 100

面试编程题-猴子偷桃

近期面试两次碰到这道题,很有意思,哈哈,所以现在写下来纪念一下。 题目一个猴子来到山里的一棵桃树下,发现有一堆桃子。第一天它吃掉一个,然后拿走一半,回到家里,把消息告诉第二个猴子。第二天第二个猴子也来...
  • u014096278
  • u014096278
  • 2016年12月15日 16:08
  • 585

五十道编程小题目 --- 17 猴子吃桃子问题 java

【程序17】  题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩 下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下  的一半零一个。...
  • wangnanwlw
  • wangnanwlw
  • 2016年08月25日 19:52
  • 1250

PAT-猴子选大王(基础编程题)

又是一个半小时,不过还是很开心能做出来, 一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子...
  • qiulh125
  • qiulh125
  • 2015年12月28日 23:26
  • 2871

2016华为机试题:猴子分桃

问题描述: 海滩上有一堆桃子,m只猴子来分,第一只猴子把这堆桃子平均分成m份,多了一个, 这只猴子把多的一个扔入海中,拿走了一份,第二只猴子把剩下的桃子又平均分成m份, 又多了一个,他同样把多的一个仍...
  • gshgsh1228
  • gshgsh1228
  • 2016年03月14日 11:05
  • 607

[BZOJ]4750: 密码安全 单调栈

单调栈
  • baidu_36797646
  • baidu_36797646
  • 2017年10月11日 20:10
  • 141
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:猴子向右看,FOJ上某题 单调栈
举报原因:
原因补充:

(最多只允许输入30个字)