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

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;
    }
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。

    时间: 2024-12-29 07:55:16

    猴子向右看,FOJ上某题 单调栈的相关文章

    [arc081] F - Flip and Rectangles——思维题+单调栈

    题目大意: 给定一个\(n\times m\)的01矩形,每次可以翻转一行或者翻转一列. 求翻转若干次之后的最大全1子矩形. 思路: 首先我们要知道一个结论:如果一个子矩形可以被翻转成为全1矩形,那么它内部的每一个\(2\times 2\)的子矩形的1的个数为偶数. 如果存在一个\(2\times 2\)的子矩形有奇数个1,那么无论怎么操作都还是奇数. 如果所有的\(2\times 2\)的子矩形都有偶数个1,我们可以先使这个矩形的第一行第一列都变为1,根据奇偶性不难发现整个矩阵此时必定全部都变

    HDU 5033 Building(北京网络赛B题) 单调栈 找规律

    做了三天,,,终于a了... 11724203 2014-09-25 09:37:44 Accepted 5033 781MS 7400K 4751 B G++ czy Building Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 1257    Accepted Submission(s): 358 Special Judg

    再看ftp上传文件

    前言 去年在项目中用到ftp上传文件,用FtpWebRequest和FtpWebResponse封装一个帮助类,这个在网上能找到很多,前台使用Uploadify控件,然后在服务器上搭建Ftp服务器,在本地测试程序上传到ftp服务器一点问题都没有,奇怪的是当发布Web和ftp到同一个IIS下,上传文件时程序直接卡死,然后页面卡死,后来我又发现把Web和ftp分开发布在两台机器上问题又得到解决,所以当时放弃了这个方案. 再看ftp上传文件 前几天偶然看到Wolfy写到一个项目总结,其中提到了用Ser

    从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的(网易)。

    题目描述: 从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的(网易). 分析: 这可以用双端LIS方法来解决,先求一遍从左到右的,再求一遍从右到左的.最后从里面选出和最大的即可. 代码实现: #include <iostream> using namespace std; int DoubleEndLIS(int *arr, int len) { int *LIS = new int[len]; int *lefToRight = new int[len]; //left

    一辈子看不上别人,从来没看清过自己

    这个世界上,最了解你优点的人可能是朋友,但最谙熟你缺点的人却是敌人. 你可能有无数个对手,但只会有一个置你于死地的敌人. 也就是说,这个人比你还了解你的软肋.最危险的敌人,坏就坏在这里,他未必外在强大,但一定心思诡秘.他盯着你,钻研你,单等你的七寸露出来,只轻轻一击,你就败了. 多少人,强势到可以呼风唤雨,却在人性的一个弱点中溃不成军. 这些人的通病是,容易看清楚别人,不容易看清楚自己.在别人的问题上可以斟酌到锱铢必较,而在自己的问题上却可以粗略到走马观花.一颗自私的心,自然会豢养出一双自私的眼

    在UINavigationController自定义返回按钮后实现手势右滑到上一级界面(interactivePopGestureRecognizer)

    在iOS7中,新增加了一个小小的功能,也就是这个self.navigationController.interactivePopGestureRecognizer. 1.情景概况: 在UINavigationController自定义返回按钮后无法实现手势右滑到上一级界面. 2.解决方案: self.navigationController.interactivePopGestureRecognizer.delegate 默认是<_UINavigationInteractiveTransitio

    你看不上的废纸壳瓶罐,在创业者眼里可是大生意

    你家里的纸壳.塑料瓶.易拉罐等废品是怎么处理的?和其他垃圾放在一起随手扔了,还是2块钱一堆卖给了走街串巷的收废品的?如果你开了一家小商店,是不是总是废纸箱攒了一大堆也没人来收?很多人看不上的纸壳瓶罐等废品,在一些创业者眼里却是有利可图的大生意. 废品回收一直是一个关注度不高的行业,但是,近年来,废品回收领域涌现出了很多创业公司,有诸如专注于电子类产品回收的爱回收.再回收,也有全品类回收企业比如回收哥.再生活.闲豆回收.近期,笔者与闲豆回收创始人方浩和再生活创始人夏凡分别进行了交流,以两家为例,探

    从左到右,从上到下,按某个字段编号工具,免费软件

    从左到右,从上到下,按某个字段编号工具,免费软件,支持arcgis10.0,10.1,10.2,如果arcgis9.3,9.2,请你走远点,我们不是一个时代人 下载地址:http://files.cnblogs.com/gisoracle/bhtool.zip

    Android右滑返回上一界面

    今天突然心血来潮,想在自己的项目里面加一个右滑finish界面的功能.思路很简单就是拦截屏幕滑动事件,然后finish当前页面,不多说了,上代码吧. 第一步:利用VelocityTracker计算滑动速度,及一些附带的代码. private VelocityTracker mVelocityTracker = null;//速度记录器 private int getScrollVelocity() { mVelocityTracker.computeCurrentVelocity(1000);