P2947 [USACO09MAR] Look Up S

【题解-洛谷】P2947 [USACO09MAR] Look Up S 【输出说明】奶牛 #1,#2 仰望奶牛 #3,奶牛 #4,#5 仰望奶牛 #6,奶牛 #3 和 #6 没有仰望对象。行,按顺序每行输出一只奶牛的最近仰望对象,如果没有仰望对象,输出。头奶牛的身高分别为 3,2,6,1,1,2。现在,每只奶牛都在向右看齐。求出每只奶牛离她最近的仰望对象。头奶牛站成一排,奶牛。,之后每行输入一个身高。 阅读详情

记录125

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;// 定义常量 N,用于初始化数组大小,防止越界(题目数据规模 N ≤ 10^5)
int h[N],ans[N];// h用来存储每头奶牛身高的数组(下标从1开始),ans用来存储每头奶牛的“最近仰望对象”的编号 
stack<int> st;// 单调栈,栈中存放的是奶牛的编号(下标)
int main(){ 
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>h[i];
	// 核心逻辑:从右向左逆序遍历每一头奶牛
	for(int i=n;i>=1;i--){
		// 维护单调栈:如果栈不为空,且当前奶牛 i 的身高 >= 栈顶奶牛的身高
		// 说明栈顶那头奶牛被挡住了(比当前矮或一样高),不可能成为 i 左边奶牛的仰望对象
		// 因此将栈顶元素弹出,直到栈为空或者找到比当前奶牛更高的牛
		while(!st.empty()&&h[st.top()]<=h[i]) st.pop();
		if(st.empty()) ans[i]=0;// 如果栈空了,说明右边没有比当前奶牛更高的,仰望对象为 0
		else ans[i]=st.top();// 如果栈不为空,此时的栈顶元素就是右边第一个比当前奶牛高的牛的编号
		st.push(i);// 将当前奶牛的编号压入栈中,作为它左边奶牛潜在的“仰望对象”
	}
	for(int i=1;i<=n;i++) cout<<ans[i]<<"\n";
	return 0;// 结束程序
}

题目传送门https://www.luogu.com.cn/problem/P2947


前言

我是一名专注信奥赛(CSP-J/S、NOIP)的教练。

  • 如果你觉得这篇题解对你有帮助,欢迎点击关注我的优快云账号,我会持续更新高质量算法解析。
  • 我深知算法思维的构建远比单纯通过题目更重要,本系列题解不局限于AC代码的堆砌,而是致力于拆解题目背后的逻辑链条与核心知识点
  • 备赛路上若遇瓶颈,欢迎随时评论或私信,我将甄选典型疑难问题,通过视频讲解或撰写专项文章的形式,为你提供深度答疑。

核心解题思路

这道题是经典的“下一个更大元素”(Next Greater Element)问题。如果采用双重循环暴力求解,时间复杂度会达到 O(N2) ,在 N≤10^5 的数据规模下必然超时。因此,我们需要使用单调栈这一数据结构,将时间复杂度优化到 O(N)。

  1. 逆序遍历:因为奶牛是“向右看齐”,寻找右侧第一个比自己高的奶牛,所以从右向左逆序遍历数组最为直观。
  2. 单调递减栈:我们在遍历过程中维护一个栈,栈中存放奶牛的编号,且这些奶牛的身高从栈底到栈顶是严格单调递减的。
  3. 状态转移与剔除:当遍历到奶牛 i 时,如果栈顶奶牛的身高 ≤ 奶牛 i 的身高,说明栈顶奶牛被奶牛 i “挡住”了,它永远不可能成为奶牛 i 左侧任何奶牛的仰望对象,因此直接将其弹出栈。
  4. 确定答案:弹出所有“不够高”的奶牛后,如果栈不为空,此时的栈顶元素就是奶牛 i 右侧第一个比它高的奶牛;如果栈为空,说明右侧没有更高的奶牛,答案为 0。最后将奶牛 i 入栈,作为更左侧奶牛的候选仰望对象。

 代码分块详细解释

1. 头文件、常量定义与全局变量

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10; // 定义常量 N,用于初始化数组大小,防止越界(题目数据规模 N ≤ 10^5)
int h[N],ans[N];    // h 存储每头奶牛身高(下标从1开始),ans 存储每头奶牛的“最近仰望对象”编号 
stack<int> st;      // 单调栈,栈中存放的是奶牛的编号(下标)
  • 作用:完成基础数据结构的定义。使用全局数组和 STL stack,避免在 main 函数中开辟过大的局部数组导致栈溢出。

2. 输入与初始化

int main(){ 
    ios::sync_with_stdio(false);
    cin.tie(0); // 关闭输入输出同步,提升读取速度
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>h[i]; // 读入每头奶牛的身高
  • 作用:快速读入数据规模 N 及每头奶牛的具体身高。

3. 核心逻辑:单调栈维护与逆序遍历

    // 核心逻辑:从右向左逆序遍历每一头奶牛
    for(int i=n;i>=1;i--){
        // 维护单调性:如果栈不为空,且栈顶奶牛身高 <= 当前奶牛身高
        // 说明栈顶奶牛被当前奶牛“挡住”,不可能成为左边奶牛的仰望对象,将其弹出
        while(!st.empty()&&h[st.top()]<=h[i]) st.pop();
        
        // 确定当前奶牛的仰望对象
        if(st.empty()) ans[i]=0; // 栈空,说明右边没有比当前奶牛更高的牛
        else ans[i]=st.top();    // 栈非空,栈顶元素即为右侧第一个比它高的牛的编号
        
        // 将当前奶牛入栈,作为它左边奶牛潜在的“仰望对象”
        st.push(i);
    }
  • 作用:这是整个算法的核心。通过 while 循环剔除无用元素,保证栈内元素的单调递减性;通过判断栈是否为空得出当前奶牛的答案;最后将当前奶牛压入栈中。每个元素最多入栈和出栈一次,保证了 O(N) 的时间复杂度。

4. 输出结果

    for(int i=1;i<=n;i++) cout<<ans[i]<<"\n"; // 按顺序输出每头奶牛的仰望对象
    return 0; // 结束程序
}
  • 作用:将预处理好的答案数组按题目要求的顺序逐行输出。使用 \n 代替 endl 可以避免频繁刷新缓冲区,进一步提升输出效率。

核心逻辑总结表

代码模块核心变量/操作精炼作用解决的痛点
逆序遍历for(int i=n;i>=1;i--)从右向左扫描数组契合“向右看齐”的题意,方便寻找右侧第一个更大元素
单调栈剔除while(... h[st.top()]<=h[i]) st.pop()弹出所有比当前矮或等高的元素剔除被“挡住”的无效元素,维持栈的单调递减性
状态查询st.empty() ? 0 : st.top()获取栈顶元素或返回0以 O(1)的时间复杂度直接获取右侧第一个更大元素的编号
候选入栈st.push(i)将当前元素下标压入栈中将当前元素转化为左侧元素的潜在仰望对象
IO优化ios::sync_with_stdio(false)关闭C/C++标准流同步解决 10^5 级别数据量下 cin/cout 可能导致的超时问题
ESP32实战指南:SPI驱动ADXL345三轴加速度传感器的精准数据采集与姿态解算 本文详细介绍了如何使用ESP32通过SPI接口驱动ADXL345三轴加速度传感器,实现精准数据采集与姿态解算。从硬件连接到SPI通信优化,再到数据处理和低功耗策略,提供了全面的实战指南。特别适合物联网开发者和硬件工程师参考,帮助快速掌握传感器数据采集技术。 阅读详情

相关推荐

(53页PPT)新型智慧病房整体解决方案(附下载方式)

当前医疗场景存在三大核心矛盾:院内感染风险(如输液异常发现滞后)、信息孤岛现象(11类业务系统数据割裂)、管理效能不足(30%护理时间耗费在机械性工作)。实际案例显示,整体运营效率提升40%,患者满意度提高28个百分点,真正实现了"让技术有温度,让数据会说话"的价值理念。本文将从需求分析、技术架构、应用场景三个维度,深度剖析这份53页解决方案的创新价值与实践路径。床旁智能终端整合12项功能:包括体征自动采集(误差率<1%)、医嘱执行核对(100%条码校验)、智能床垫离床报警(响应时间3秒)等。

AI_data_cloud的博客 717

打卡信奥刷题(1297)用C++实现信奥 P2947 [USACO09MAR] Look Up S

约翰的N1≤N≤105头奶牛站成一排,奶牛i的身高是Hi​1≤Hi​≤106。现在,每只奶牛都在向右看齐。对于奶牛i,如果奶牛j满足ij且Hi​Hj​,我们可以说奶牛i可以仰望奶牛j。求出每只奶牛离她最近的仰望对象。Input。

Loge谈信奥--一个专注于信奥人的博客 4861

论文阅读——Bayesian Knowledge Fusion(贝叶斯知识融合)

该篇论文解决了不确定环境中的信息融合问题。想象一下,有多位专家针对同一情况构建概率模型,我们希望汇总他们提供的信息。直接合并每个信息可能会遇到几个问题。例如,专家们可能不同意某个事件发生的概率,或者他们可能不同意两个事件之间因果关系的方向(例如,一个人认为 A 导致 B,而另一个人认为 B 导致 A)。他们甚至可能不同意概率网络中一组变量之间的整个依赖结构。

qq_64164071的博客 1498

洛谷 P2947 [USACO09MAR] Look Up S (Java)

如果当前奶牛的身高大于等于栈顶奶牛的身高,说明栈顶奶牛不再是当前奶牛的仰望对象,需要出栈,直到栈顶奶牛的身高大于当前奶牛的身高或者栈为空。因为使用了单调栈,使得在一次遍历中就能够得到每头奶牛仰望的下标,而不需要额外的操作。【输出说明】奶牛 #1,#2 仰望奶牛 #3,奶牛 #4,#5 仰望奶牛 #6,奶牛 #3 和 #6 没有仰望对象。从后往前遍历奶牛,保证单调栈中的元素单调递减,这样可以确保栈顶奶牛身高大于当前奶牛。行,按顺序每行输出一只奶牛的最近仰望对象,如果没有仰望对象,输出。头奶牛站成一排,奶牛。

Keven_6的博客 2584

全志 mipi屏幕和触摸驱动调试记录

mipi屏幕与触摸调试记录

u011996684的博客 3221

IPV6基本配置

IPV6配置,DHCPV6,华为模拟器,IPV6的M/O标志位

路漫漫其修远兮 4668

P2947 [USACO09MAR] Look Up S(向右看齐)

【输出说明】奶牛 #1,#2 仰望奶牛 #3,奶牛 #4,#5 仰望奶牛 #6,奶牛 #3 和 #6 没有仰望对象。行,按顺序每行输出一只奶牛的最近仰望对象,如果没有仰望对象,输出。头奶牛的身高分别为 3,2,6,1,1,2。现在,每只奶牛都在向右看齐。求出每只奶牛离她最近的仰望对象。注意没有仰望对象的元素如何处理。头奶牛站成一排,奶牛。,之后每行输入一个身高。

weixin_46191137的博客 864

MST-GAT: Enhancing Anomaly Detection in Multimodal Time Series with Intra- and Inter-Modal Attention

本文深入解析了MST-GAT模型,这是一种通过模态内与模态间注意力机制增强多模态时间序列异常检测的新方法。它通过构建图结构显式建模传感器间的复杂时空依赖,并结合时间卷积网络与联合优化策略,有效降低了传统方法中常见的误报与漏报问题,在工业监控等场景中展现出卓越性能。

weixin_29079671的博客 151

洛谷 P2947:[USACO09MAR] Look Up S ← 数组模拟+单调栈

单调栈不是一种新的栈结构,它只是栈的一种使用方式。也就是说,单调栈实际上就是普通的栈,只是在使用时始终保持栈内的元素是单调的。单调栈通过维护栈内元素单调性来高效解决特定范围查询问题,尤其擅长处理“下一个更大/更小元素”类问题。

hnjzsyjyj的专栏 921

从自然语言到PCB设计:DeepSeek与Altium协同自动化实战指南

摘要:在电子设计领域,将自然语言需求转化为PCB设计图是实现自动化设计的重要目标。受限于当前NLP和EDA技术,通过DeepSeek直接生成完整PCB设计图尚无法实现,但在设计辅助环节已展现实用价值。本文深入分析技术可行性,提出"自然语言→设计约束→脚本生成→人工验证"的人机协同工作流。通过28个完整代码示例、12张技术图表及5个工程案例,详细展示DeepSeek解析需求、生成设计约束,并结合Altium Designer API实现元件放置、规则设置、DRC校验的全流程。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1773

【图像去噪】论文复现:灵感源自MAE!进一步解决BSN的局限性,破坏真实噪声的空间相关性!AMSNet的Pytorch源码复现,跑通源码,原理详解!

论文题目:Asymmetric Mask Scheme for Self-Supervised Real Image Denoising —— 自监督真实图像去噪的非对称掩码方案【图像去噪】论文精读:Asymmetric Mask Scheme for Self-Supervised Real Image Denoising(AMSNet)AMSNet是基于PyTorch Lightning CLI深度学习框架编写的,比较适合复杂的大型任务,复用很方便,但是安装和环境配置问题太多。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 549

P2947 [USACO09MAR]Look Up S(单调栈)

P2947[USACO09MAR]Look Up S #include <iostream> #include <cstdio> #include <string> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <cstring> #include <set> #include .

Ghostttttttiii的博客 387

YOLOv8 眼底病变检测(眼底照片)详细说明

本文介绍了基于YOLOv8的眼底病变自动检测系统。该系统可识别糖尿病视网膜病变、青光眼等5类常见眼底病变,包括微动脉瘤、出血点等特征。核心技术包含图像预处理、模型训练、病变检测与量化分析三个模块,采用1024×1024高分辨率输入,针对医学图像特点优化数据增强策略。系统支持批量处理、可视化标注和临床报告生成,提供病变数量、面积密度和严重程度评分等量化指标。特别强调医学合规性要求,需专业医生参与数据标注和模型验证,符合医疗器械认证标准。该系统可作为眼科医生的辅助诊断工具,提高眼底病变筛查效率。

u010117029的博客 134

【P2947】 [USACO09MAR]Look Up S单调栈

链接 code #include <cstdio> #include <algorithm> #include <cstring> #include <cctype> #include <vector> #include <iostream> #include <map> using namespace std; inline int read(){ int x = 0, op = 1; char ch = ge.

weixin_50070650的博客 324

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

打卡信奥刷题(98)用Scratch图形化工具信奥P2947 [USACO09MAR] Look Up S

约翰的N1≤N≤105头奶牛站成一排,奶牛i的身高是Hi​1≤Hi​≤106。现在,每只奶牛都在向右看齐。对于奶牛i,如果奶牛j满足ij且Hi​Hj​,我们可以说奶牛i可以仰望奶牛j。求出每只奶牛离她最近的仰望对象。Input。

Loge谈信奥--一个专注于信奥人的博客 2176

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【洛谷】P2947 [USACO09MAR] Look Up S(单调栈)

看懂了就是板子了

m0_74969835的博客 576

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

洛谷 P2947:[USACO09MAR] Look Up S ← STL stack+单调栈

单调栈不是一种新的栈结构,它只是栈的一种使用方式。也就是说,单调栈实际上就是普通的栈,只是在使用时始终保持栈内的元素是单调的。单调栈通过维护栈内元素单调性来高效解决特定范围查询问题,尤其擅长处理“下一个更大/更小元素”类问题。

hnjzsyjyj的专栏 365

【单调栈】-----【Look Up S】

本题的关键在于右边第一个比它大的元素类型维护方向栈内单调性典型问题找右边第一个更大元素右→左单调递减本题 Look Up、柱状图最大矩形找右边第一个更小元素右→左单调递增维护下一个最小值找左边第一个更大元素左→右单调递减左边比它大的最近值找左边第一个更小元素左→右单调递增下一个更小值。

2401_82676816的博客 645

练练练练练

求数列所有后缀最大值。

2302_79954861的博客 175

P2947 [USACO09MAR]仰望Look Up

题目描述 Farmer John's N (1 Each cow is looking to her left toward those with higher index numbers. We say that cow i 'looks up' to cow j if i Note: about 50% of the test data will have N

沐灵_hh的博客 536

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

Link 从右往左处理一个递减的单调栈,然后对比当前位置和栈顶,处理,处理后的栈顶即是此位置可以眺望到的第一个cow? #include<cstdio> int n,h[100001],bianhao[100001],st[100001],ans[100001],t; int main(){ scanf("%d",&n); for(int i=1;i<=n;++i)...

鲤の游 310

洛谷 P2947 [USACO09MAR]向右看齐Look Up (队列)

题目描述 Farmer John’s N (1 <= N <= 100,000) cows, conveniently numbered 1..N, are once again standing in a row. Cow i has height H_i (1 <= H_i <= 1,000,000). Each cow ...

angw337679452的博客 84

P2947 [USACO09MAR]向右看齐Look Up

[USACO09MAR]向右看齐Look Up 题目描述 Farmer John’s N (1 &lt;= N &lt;= 100,000) cows, conveniently numbered 1..N, are once again standing in a row. Cow i has height H_i (1 &lt;= H_i &lt;= 1,000,000). Each...

程序难民窟(公墓)(๑ŐдŐ)b 464

洛谷P2947 [USACO09MAR]向右看齐Look Up

链接:P2947 题目描述 Farmer John’s N (1 <= N <= 100,000) cows, conveniently numbered 1…N, are once again standing in a row. Cow i has height H_i (1 <= H_i <= 1,000,000). Each cow is looking to he...

秃头交易站. 321

[USACO09MAR]向右看齐Look Up【洛谷P2947】

题目描述 Farmer John’s N (1 <= N <= 100,000) cows, conveniently numbered 1…N, are once again standing in a row. Cow i has height H_i (1 <= H_i <= 1,000,000). Each cow is looking to her left to...

ESTHERWXY的博客 323
上一篇: P11376 [GESP202412 六级] 运送物资
下一篇: P11962 [GESP202503 六级] 树上漫步
谢天谢地AC了 | 信奥教练
博客等级 码龄1年 53粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值