当前位置: 首页 > news >正文

Passing the Message 单调栈两次

What a sunny day! Let’s go picnic and have barbecue! Today, all kids in “Sun Flower” kindergarten are prepared to have an excursion. Before kicking off, teacher Liu tells them to stand in a row. Teacher Liu has an important message to announce, but she doesn’t want to tell them directly. She just wants the message to spread among the kids by one telling another. As you know, kids may not retell the message exactly the same as what they was told, so teacher Liu wants to see how many versions of message will come out at last. With the result, she can evaluate the communication skills of those kids.
Because all kids have different height, Teacher Liu set some message passing rules as below:

1.She tells the message to the tallest kid.

2.Every kid who gets the message must retell the message to his “left messenger” and “right messenger”.

3.A kid’s “left messenger” is the kid’s tallest “left follower”.

4.A kid’s “left follower” is another kid who is on his left, shorter than him, and can be seen by him. Of course, a kid may have more than one “left follower”.

5.When a kid looks left, he can only see as far as the nearest kid who is taller than him.

The definition of “right messenger” is similar to the definition of “left messenger” except all words “left” should be replaced by words “right”.

For example, suppose the height of all kids in the row is 4, 1, 6, 3, 5, 2 (in left to right order). In this situation , teacher Liu tells the message to the 3rd kid, then the 3rd kid passes the message to the 1st kid who is his “left messenger” and the 5th kid who is his “right messenger”, and then the 1st kid tells the 2nd kid as well as the 5th kid tells the 4th kid and the 6th kid.
Your task is just to figure out the message passing route.

InputThe first line contains an integer T indicating the number of test cases, and then T test cases follows.
Each test case consists of two lines. The first line is an integer N (0< N <= 50000) which represents the number of kids. The second line lists the height of all kids, in left to right order. It is guaranteed that every kid’s height is unique and less than 2^31 – 1 .OutputFor each test case, print “Case t:” at first ( t is the case No. starting from 1 ). Then print N lines. The ith line contains two integers which indicate the position of the ith (i starts form 1 ) kid’s “left messenger” and “right messenger”. If a kid has no “left messenger” or “right messenger”, print ‘0’ instead. (The position of the leftmost kid is 1, and the position of the rightmost kid is N)Sample Input
2
5
5 2 4 3 1
5
2 1 4 3 5
Sample Output
Case 1:
0 3
0 0
2 4
0 5
0 0
Case 2:
0 2
0 0
1 4
0 0
3 0


题意 是输出每个左边(右边)比他矮的 且最高的人的高度 也就是向左(向右)找到第一个比他高的 然后他到这个人之间的最高的高度 如果没有 输出0 左右各来一遍单调栈 用flag判断是否存在

代码:


#include <iostream>
#include <cstdio>
using namespace std;

int stack[50002],l[50002],r[50002],top,a[50002],t,n,flag;

int main()
{
    scanf("%d",&t);
    for(int k=1;k<=t;k++)
    {
        top=0;
        scanf("%d",&n);
        a[0]=a[n+1]=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        for(int i=1;i<=n;i++)
        {
            flag=0;
            while(top&&a[i]>=a[stack[top-1]])
            {
                flag=1;
                top--;
            }
            if(flag)l[i]=stack[top];
            else l[i]=0;
            stack[top++]=i;
        }
        top=0;///第二次从右往左用单调栈 一定要更新
        for(int i=n;i>=1;i--)
        {
            flag=0;
            while(top&&a[i]>=a[stack[top-1]])
            {
                flag=1;
                top--;
            }
            if(flag)r[i]=stack[top];
            else r[i]=0;
            stack[top++]=i;
        }
        printf("Case %d:\n",k);
        for(int i=1;i<=n;i++)
            printf("%d %d\n",l[i],r[i]);
    }
}

 

转载于:https://www.cnblogs.com/8023spz/p/7220922.html

相关文章:

  • SSM搭建
  • 格式化angularjs日期'/Date(-62135596800000)/'
  • window.location
  • ASP.NET Core API 版本控制
  • 2017.7.25 jqGrid在编辑态无法获取数据,得到的是html代码
  • 人机猜拳
  • 【网络开发】详谈socket请求Web服务器过程
  • java④
  • rhcs clustat
  • js学习总结----DOM2兼容处理顺序问题
  • 爬虫实践---排行榜小说批量下载
  • 浅谈Android高通(Qualcomm)和联发科(MTK)平台
  • SecureCRT中文显示乱码
  • 使用selenium自动登录126/163邮箱并发送邮件
  • GreenDAO 注解
  • [Vue CLI 3] 配置解析之 css.extract
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • java2019面试题北京
  • JavaScript实现分页效果
  • React组件设计模式(一)
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 翻译:Hystrix - How To Use
  • 时间复杂度与空间复杂度分析
  • 网络应用优化——时延与带宽
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 新手搭建网站的主要流程
  • 栈实现走出迷宫(C++)
  • - 转 Ext2.0 form使用实例
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​如何在iOS手机上查看应用日志
  • "无招胜有招"nbsp;史上最全的互…
  • (八十八)VFL语言初步 - 实现布局
  • (十五)使用Nexus创建Maven私服
  • .gitignore文件_Git:.gitignore
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .net连接MySQL的方法
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .net生成的类,跨工程调用显示注释
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [Asp.net MVC]Bundle合并,压缩js、css文件
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [CodeForces-759D]Bacterial Melee
  • [GN] 后端接口已经写好 初次布局前端需要的操作(例)
  • [HackMyVM]靶场 Wild
  • [NLP] 使用Llama.cpp和LangChain在CPU上使用大模型
  • [NYOJ 536] 开心的mdd
  • [Perl] Find Shell on your Wordpress site
  • [POJ - 2386]
  • [PyTorch][chapter 60][强化学习-2-有模型学习2]
  • [shell] while read line 与for循环的区别
  • [Tcpdump] 网络抓包工具使用教程