题目描述

N 头奶牛被紧急动员起来了,它们排成了一条长列。从左向右看,排在第 i 个位置的奶牛身高为 Hi。约翰一声令下,所有奶牛向右看齐。假设每头奶牛只能看到比自己高的牛。请问它们各自看到的最近的一头奶牛分别是谁呢?
Input

第一行:单个整数 N,1≤N≤106

第二行到 N+1 行:第 i+1 行有一个整数 Hi,1≤Hi≤106
Output

第一行到第 N 行:第 i 行有一个整数 Ci,表示第 i 头奶牛向右看到的最近的一头奶牛编号,如果看不到任何奶牛,Ci 为 0。


一开始用朴素的循环遍历算法,如果单调递减,复杂度是O(n2),显然是不可行的。

听同学讲解后才知道是单调栈,具体见转载的相关博客。

C语言实现

 #include  <stdio.h>
#define N 100010
int main()
{
int n;scanf("%d",&n);
int h[N],ans[N];
for(int i=; i<=n; i++) scanf("%d",&h[i]);
ans[n]=;
for(int i=n-; i>=; i--)
{
if(h[i]<h[i+]) ans[i]=i+;
else if(h[i]==h[i+])ans[i]=ans[i+];
else
{
int j=i;
for(;h[i]>=h[ans[j+]];j++)
if(ans[j+]==) break;
ans[i]=ans[j+];
}
}
for(int i=; i<=n; i++)
printf("%d\n",ans[i]); }是

细读就可以理解含义,最后一头奶牛向右没有,编号是0,依次向前遍历,对于奶牛i,如果高度低于后一头i+1,那么编号i+1,如果高度相同,后一头能看到的最近的奶牛也必然是i能看到的奶牛,故编号为ans[i+1],当高度高于前一头奶牛,就需要向后遍历直到后面的最高的奶牛。显然,这不是单调栈。(逃

并且在第三种情况下,时间复杂度略高。


以下是单调栈的写法,实现语言C++

 #include <iostream>
#include <stack>
#define N 1000001
using namespace std;
int main()
{
stack<pair<int,int> > s;
int T,tmp;cin>>T;
int ans[N];
for(int m=;m<=T;m++){
cin>>tmp;
if(!s.empty())
while(!s.empty()&&s.top().first<tmp){
ans[s.top().second]=m;
s.pop();
}
s.push(make_pair(tmp,m));
}
while(!s.empty()){
ans[s.top().second]=;
s.pop();
}
for(int i=;i<=T;i++) cout<< ans[i] <<endl;
return ;
}

还用一种更快(一点点)的是额外开一个数组记录读取的数字,stack只需要记录下标,或者反过来,总之原理是一样的。

EOJ 3213 向右看齐的更多相关文章

  1. P2947 [USACO09MAR]向右看齐Look Up--单调栈

    单调栈真的很好用呢! P2947 [USACO09MAR]向右看齐Look Up 题目描述 Farmer John's N (1 <= N <= 100,000) cows, conven ...

  2. EOJ Monthly 2019.2 题解(B、D、F)

    EOJ Monthly 2019.2 题解(B.D.F) 官方题解:https://acm.ecnu.edu.cn/blog/entry/320/ B. 解题 单测试点时限: 2.0 秒 内存限制:  ...

  3. EOJ #276

    题面 感觉是个套路题,不是特别难(然而卡常 直接做不可做,改成算每个数的贡献 暴力的想法是容斥,即记录每个数在每行里的出现情况,从总方案中扣掉每一行都没选到这个数的方案,复杂度$O(n^3)$ 我们发 ...

  4. EOJ Monthly 2018.8 D. Delivery Service-树上差分(边权/边覆盖)(边权转点权)(模板题)

    D. Delivery Service 单测试点时限: 2.5 秒 内存限制: 512 MB EOJ Delivery Service Company handles a massive amount ...

  5. 洛谷 P2947 [USACO09MAR]向右看齐Look Up【单调栈】

    题目描述 Farmer John's N (1 <= N <= 100,000) cows, conveniently numbered 1..N, are once again stan ...

  6. 【洛谷P2947】向右看齐

    向右看齐 题目链接 此题可用单调栈O(n)求解 维护一个单调递减栈,元素从左到右入栈 若新加元素大于栈中元素,则栈中元素的仰望对象即为新加元素 每次将小于新加元素的栈中元素弹出,记录下答案 #incl ...

  7. EOJ Problem #3249 状态压缩+循环周期+反向递推

    限量供应 Time limit per test: 4.0 seconds Time limit all tests: 4.0 seconds Memory limit: 256 megabytes ...

  8. EOJ Monthly 2018.7

    准备继续大学acm啦 又要开始愉快的码码码啦 第一次在华东师大OJ上面做题 看来EOJ上的积分体质是假的,我怎么一把上红??? A.数三角形 神tm的防AK题放在A,出题人很不友好啊... 先写了个暴 ...

  9. EOJ Monthly 2018.4

    A. ultmaster 的小迷妹们 Time limit per test: 2.0 seconds Memory limit: 256 megabytes ultmaster 男神和他的小迷妹们准 ...

随机推荐

  1. Hadoop MapReduce编程 API入门系列之MapReduce多种输出格式分析(十九)

    不多说,直接上代码. 假如这里有一份邮箱数据文件,我们期望统计邮箱出现次数并按照邮箱的类别,将这些邮箱分别输出到不同文件路径下. 代码版本1 package zhouls.bigdata.myMapR ...

  2. jsp指令介绍

    JSP指令(directive)是为JSP引擎而设计,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中定义了三个指令: 1.page指令 2.inc ...

  3. android系统源码下载

    ubuntu 安装git curl python 确保主目录下有一个 bin/ 目录,并且该目录包含在路径中: mkdir ~/bin PATH=~/bin:$PATH   下载 Repo 工具,并确 ...

  4. 树的问题小结(最小生成树、次小生成树、最小树形图、LCA、最小支配集、最小点覆盖、最大独立集)

    树的定义:连通无回路的无向图是一棵树. 有关树的问题: 1.最小生成树. 2.次小生成树. 3.有向图的最小树形图. 4.LCA(树上两点的最近公共祖先). 5.树的最小支配集.最小点覆盖.最大独立集 ...

  5. 应用Struts2框架,开发一个加法器,采用两个页面,一个页面输入数据,另一个界面输出结果。

    软件152谭智馗 一.新建maven项目 1.选择菜单file—new—maven project,勾选“Create a &simple project (skip archetype se ...

  6. 决策树构建算法之—C4.5

    这个网站值得收藏一下,原文链接:http://shiyanjun.cn/archives/428.html 决策树算法的优越性在于:离散学习算法进行组合总可以表达任意复杂的布尔函数,并不受数据集的限制 ...

  7. 如何使用Matlab做数字信号处理的仿真1

    例如 第三版数字信号处理P51 -1.14习题时域离散信号的相关性研究x(n)=Asin(ωn)+u(n),其中ω=π/16,u(n)是白噪声,现要求 ⑴.产生均值为0,功率P=0.1的均匀分布白噪声 ...

  8. mysql修改时区的几种方法(转载自https://www.cnblogs.com/shiqiangqiang/p/8393662.html)

    说明: 以下记录修改mysql时区的几种方法. 具体: 方法一:通过mysql命令行模式下动态修改 1.1 查看mysql当前时间,当前时区 select curtime(); #或select no ...

  9. C语言提高 (6) 第六天 文件(续) 链表的操作

    1昨日回顾 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include &l ...

  10. Project Euler 29 Distinct powers( 大整数质因数分解做法 + 普通做法 )

    题意: 考虑所有满足2 ≤ a ≤ 5和2 ≤ b ≤ 5的整数组合生成的幂ab: 22=4, 23=8, 24=16, 25=3232=9, 33=27, 34=81, 35=24342=16, 4 ...