题意

一个小孩可以看到左边比他矮,但是最高的孩子,同样可以看到右边比他矮,但是最高的小孩

分析

求左边比他矮,但是最高的孩子:维护一个单调栈,从栈顶到栈底单调递增;

  • 从左边第一个孩子开始,如果栈为空或者当前元素小于栈顶元素,说明他没法看到比他矮的孩子,直接入栈,左值为0;
  • 当前元素大于栈顶元素,从栈顶元素出栈,(因为后边的小孩被当前孩子挡住了,不可能看到前面比当前孩子矮的孩子),同时更新最大值,即当前元素能看到的最远的左边界,直到栈为空或者当前元素小于栈顶元素,最后将当前元素入栈

求右边比他矮,但是最高的孩子:维护一个单调栈,从栈顶到栈底单调递增;从右边第一个小孩开始遍历即可

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
const int maxn=1e5+10;
int n;
LL a[maxn];
LL l[maxn],r[maxn];//维护一个单调栈,从栈顶到栈底单调递增
stack<LL>s;
//左边
void left(){while(!s.empty())   s.pop();for(int i=1;i<=n;i++){LL M=-1;//保存最大值int k=0;//保存最大值的下标while(!s.empty()&&a[i]>a[s.top()]){//当前元素大于栈顶元素if(M<a[s.top()]){//更新M=a[s.top()];//后面的元素只会看最高的k=s.top();}s.pop();//全部出栈,没有存在的必要}if(M==-1)   l[i]=0;//没有找到小于当前元素else    l[i]=k;//记录小于当前元素的下标s.push(i);}
}
void right(){while(!s.empty())   s.pop();for(int i=n;i>=1;i--){LL M=-1;int k=0;while(!s.empty()&&a[i]>a[s.top()]){if(M<a[s.top()]){M=a[s.top()];k=s.top();}s.pop();}if(M==-1)   r[i]=0;else    r[i]=k;s.push(i);}
}
int main(){int T;int ca=1;scanf("%d",&T);while(T--){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%lld",&a[i]);}left();right();printf("Case %d:\n",ca++);for(int i=1;i<=n;i++){printf("%lld %lld\n",l[i],r[i]);}}
}

HDU3410 Passing the Message 【单调栈】相关推荐

  1. Passing the Message(单调栈)

    What a sunny day! Let's go picnic and have barbecue! Today, all kids in "Sun Flower" kinde ...

  2. HDU - 3410 Passing the Message 单调递减栈

    Passing the Message What a sunny day! Let's go picnic and have barbecue! Today, all kids in "Su ...

  3. 【HDU - 3410 】 Passing the Message(单调栈)

    题干: What a sunny day! Let's go picnic and have barbecue! Today, all kids in "Sun Flower" k ...

  4. 线性结构 —— 单调栈与单调队列

    [单调栈] 1.原理 单调栈,就是栈内元素保持一定单调性(单调递增或单调递减)的栈,即从栈底到栈顶单调递增或递减. 对于单调递增的栈,如果栈为空或入栈元素值大于等于栈顶元素值,则入栈:否则,若入栈会破 ...

  5. 解题报告 (十) 单调栈

    文章目录 单调栈 解题报告 PKU 2082 Terrible Sets HDU 2430 Beans HDU 4252 A Famous City PKU 2796 Feel Good HDU 34 ...

  6. 单调栈 左右传消息 HDU 3410

    Passing the Message What a sunny day! Let's go picnic and have barbecue! Today, all kids in "Su ...

  7. POJ2796 Feel Good(单调栈)

    题意: 给出一列数据,要求一个区间内最小值与区间内数据总和乘积最大值 要点: 还是单调栈,这次我自己写的,先做了几题比较简单的果然还是有效果的,这题也是一样,按点遍历,网上大神做的是直接遍历一次即可, ...

  8. 【单调栈 前缀和 异或】7.21序列求和

    还要再细细思考的奇妙思路 题目描述 小A最近喜欢上了关于区间max的问题.她定义一个区间的价值是max(ai)(l<=i<=r)∗(alxoral+1xor...xorar)max(ai) ...

  9. 栈与队列7——单调栈结构(进阶问题)

    题目 一个含有重复值的数组arr,找到每一个i位置左边和右边离i位置最近且值比arr[i]小的位置,返回所有相应的信息. 举例:arr={3,4,1,5,6,2,7},返回如下的二维数组作为结果:{{ ...

最新文章

  1. Git 高频命令、版本回退、分支操作、文件修改删除、撤销、标签、远程仓库推送、拉取
  2. [转载]一站式WPF--Window
  3. 【C语言】20-static和extern关键字2-对变量的作用
  4. python3 正则表达式点星问号(.*?)能不能匹配换行符?不能的话应该怎么写
  5. tensorflow测试gpu_如何检验 tensorflow-gpu 安装成功 ?
  6. Eclipse异常关闭启动不了的问题
  7. MySQL 主从同步故障处理-小记
  8. cmd窗口pip显示不是内部或外部命令,也不是可运行的程序或批处理文件
  9. 1月第4周安全回顾 移动安全受关注 ***威胁公共设施
  10. python将输出结果写入csv_Python怎么把输出整体写入CSV文件
  11. html5移动端webscoket实现在线聊天
  12. Wooboo第四批(暨6月7日)上传程序送百元现金活动获奖公告
  13. Java自学教程百度云盘,疯狂加持!腾讯大佬的
  14. 无悔入华夏怎么一直显示服务器,无悔入华夏快速通关攻略
  15. 大鹏背景,大鹏为什么能邀请那么多明星?揭秘董成鹏的成名路
  16. Pandas 对DataFrame的缺失值NA值处理4种方法总结
  17. 2020年中国数字经济区域发展竞争格局报告
  18. 5个优质开玩笑代码脚本
  19. Java获取一年有多少周、某周的第一天和最后一天,当前时间所在当年的实际周数
  20. 基于RSA的t-out-of-n OT协议

热门文章

  1. WPF converter(包含传递复杂参数)
  2. 用eclispe远程调试tomcat war包形式
  3. Kafka 基本原理
  4. Spring mvc注解方式使用事务回滚
  5. iOS --- DIY文件名批量修改
  6. POJ 2301 Beat the Spread!
  7. 有关WriteableBitmap和BitmapImage之间的相互转换
  8. 男人必看,男性排毒同样重要 - 生活至上,美容至尚!
  9. ASP.NET MVC中使用AJAX(XMLHttpRequest、Microsoft AJAX Library......)
  10. 屏幕坏点检测图片_电视屏幕出现坏点怎么办?