c语言编程*三角形图形右看齐,EOJ 3213 向右看齐

题目描述

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

#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]

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

#include

#define N 1000001

using namespace std;

int main()

{

stack > 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

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] <

return ;

}

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

P2947 &lbrack;USACO09MAR&rsqb;向右看齐Look Up--单调栈

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

EOJ Monthly 2019&period;2 题解&lpar;B、D、F&rpar;

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

EOJ &num;276

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

洛谷 P2947 &lbrack;USACO09MAR&rsqb;向右看齐Look Up【单调栈】

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

【洛谷P2947】向右看齐

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

EOJ Problem &num;3249 状态压缩&plus;循环周期&plus;反向递推

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

EOJ Monthly 2018&period;7

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

EOJ Monthly 2018&period;4

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

随机推荐

关于PHP位运算的简单权限设计

写在最前面 最近想写一个简单的关于权限处理的东西,之前我也了解过用二进制数的位运算可以出色地完成这个任务.关于二进制数 的位运算,常见的就是“或.与.非”这三种简单运算了,当然,我也查看了下PHP手册 ...

HDU 4791 Alice&&num;39&semi;s Print Service&lpar;2013长沙区域赛现场赛A题&rpar;

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4791 解题报告:打印店提供打印纸张服务,需要收取费用,输入格式是s1 p1 s2 p2 s3 p3.. ...

Spring源码学习之:模拟实现BeanFactory,从而说明IOC容器的大致原理

spring的IOC容器能够帮我们自动new对象,对象交给spring管之后我们不用自己手动去new对象了.那么它的原理是什么呢?是怎么实现的呢?下面我来简单的模拟一下spring的机制,相信看完之后 ...

Quartz 第五课 SimpleTriggers 官方文档翻译

对于SimpleTrigger你需要知道它的启动总是在一个特殊的时间点或者有你设置的重复时间段中.直白来说,如果你想在2005年1月13日,正好上午11时23分54秒触发,然后执行五次,每十秒钟. 从 ...

2386&colon;Lake Counting-poj

总时间限制:  1000ms 内存限制:  65536kB 描述 Due to recent rains, water has pooled in various places in Farmer J ...

OOAD-设计模式(一)概述

前言 在我们很多时候设计代码都是需要用到各种不一样的设计模式的,接下来着几篇给大家领略一下设计模式.知道设计模式的作用,以及在代码的具体体现.很多时候我们看不懂代码就是因为我们不知道它使用的设计模式. ...

3&period;2station

题意火车进入,然后要求以最大字典序输出 解题思路:先用一个数组储存当前位置之后最大的数字是什么,然后把已经进站的最后一节火车和还没进站的车的最大值,哪个更大,如果已经进站的更大,那么就先出站,否则就先 ...

搞清Image加载事件&lpar;onload&rpar;、加载状态&lpar;complete&rpar;后,实现图片的本地预览,并自适应于父元素内&lpar;完成&rpar;

onload与complete介绍 complete只是HTMLImageElement对象的一个属性,可以判断图片加载完成,不管图片是不是有缓存:而onload则是这个Image对象的load事件回 ...

check process id exists

kill -0 pid sending the signal 0 to a given PID just checks if any process with the given PID is run ...

poj 1125 Stockbroker Grapevine&lpar;最短路径&rpar;

Description Stockbrokers are known to overreact to rumours. You have been contracted to develop a me ...

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值