猴子向右看,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: N
  • Lines 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;
    }
    





    相关文章推荐

    神奇的单调栈

    • 2017年10月27日 15:47
    • 1.3MB
    • 下载

    XMUT acdream 数据结构专场 C题(单调栈)

    C - 最大的矩形 Problem Description 在ACdream王国中有一排由N个矩形房子组成的住宅区,每个房子高为h[i],小Z想知道,在这些矩形房子中,你能找到的最大矩形面积是多...

    Codeforces Round #344 (Div. 2) C 题题解 (贪心+单调栈)

    C. Report time limit per test 2 seconds memory limit per test 256 megabytes input ...

    POJ 2559(第三届河南省程序设计大赛F题(单调栈应用))

    Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: ...

    Terrible Sets(单调栈,一开始还被题目描述吓到了,理解样例后发现就是纸老虎题。。。)

    Link:http://poj.org/problem?id=2082 Terrible Sets Time Limit: 1000MS   M...

    BZOJ 3039 玉蟾宫 单调栈

    Problem 3039. – 玉蟾宫 3039: 玉蟾宫Time Limit: 2 Sec  Memory Limit: 128 MBDescription有一天,小猫rainbow和freda来...

    BZOJ 1057 ZJOI2007 棋盘制作 单调栈

    题目大意:给定一个黑白两色的矩阵,求最大的黑白相间的子正方形和子矩阵 将奇数位置的点反色,然后就是求纯色的最大子正方形和子矩阵 将矩阵一层层剖分,每层上方是一段类似于▆▃▇▂▉的东西,用单调栈跑出...
    • PoPoQQQ
    • PoPoQQQ
    • 2015年01月20日 09:25
    • 852

    hdu 1506(dp || 单调栈)

    题意:这题是要找最大的矩形面积。 解题思路:这题的关键是要找每个条形能够往左和往右能够到达的最大长度。我最开始的思路是单调栈去维护,只要入栈的元素比栈顶元素小,栈顶就要出栈,并且知道其最右能够到达...

    洛谷1901 发射站(单调栈)

    洛谷1901 发射站 本题地址: http://www.luogu.org/problem/show?pid=1901 题目描述     某地有 N 个能量发射站排成一行,每个发射站 i 都有不...

    HDU 1505 City Game (单调栈+最大子矩阵面积)

    City Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota...
    内容举报
    返回顶部
    收藏助手
    不良信息举报
    您举报文章:猴子向右看,FOJ上某题 单调栈
    举报原因:
    原因补充:

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