POJ2796 Feel Good——单调栈

单调栈(poj -- 2559)   单调栈,顾名思义就是说栈内的元素,按照某种方式排序下,必须是单调的。如果新入栈的元素破坏了单调性,就弹出栈内元素,知道满足单调性。 它可以很方便地求出某个数的左边或者右边第一个比它大或者小的元素,而且总时间复杂度O(N)。       1. 题目大意:链接 给出一个柱形统计图(histogram), 它的每个项目的宽度是1, 高度和具体问题有关。 现在编程求出在这个柱形图中的最大... 阅读详情

题目链接

题目大意

给你 n n n 个数,求一个区间和区间的值,定义区间的值为区间内所有数之和乘以区间最小值,输出区间的值以及区间的左右端点

解题思路

我们考虑每个数作为所在区间的最小值时,这个区间的左右端点是什么。
这时,我们可以正反跑两次单调栈,分别得到这个数作为区间最小值时,这个区间的左右端点。
考虑正向跑单调栈求区间左端点。维护一个上升的单调栈
如果当前元素比栈顶大,直接push进去,这个数的区间左端点就是栈顶元素的下标+1
如果当前元素小于等于栈顶元素,一直pop栈直到满足当前元素比栈顶大,然后取栈顶元素下标+1
反向跑单调栈得到区间右端点,有一个小细节,我们可以先push一个元素进去,使得我们的操作统一化,见代码

Code

#include <iostream>
#define ll long long
#define qc ios::sync_with_stdio(false); cin.tie(0);cout.tie(0)
#define fi first
#define se second
#define PII pair<int, int>
#define PLL pair<ll, ll>
#define pb push_back
using namespace std;
const int MAXN = 2e5 + 7;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1e9 + 7;
int n;
PLL st[MAXN];
int cnt;
ll a[MAXN], pre[MAXN];
int l[MAXN], r[MAXN];
void solve(){
 	cin >> n;
 	for(int i = 1; i <= n; i++){
 		cin >> a[i];
 		pre[i] = pre[i-1] + a[i];
 	}
 	cnt = 0;
 	for(int i = 1; i <= n; i++){
 		while(cnt && st[cnt].se >= a[i]){
 			cnt--;
 		}
 		l[i] = st[cnt].fi + 1;
 		st[++cnt] = {i, a[i]};
 	}
 	cnt = 0;
 	st[++cnt] = {n+1, -1};
 	for(int i = n; i >= 1; i--){
 		while(cnt && st[cnt].se >= a[i]) cnt--;
 		r[i] = st[cnt].fi - 1;
 		st[++cnt] = {i, a[i]};
 	}
 	// for(int i = 1; i <= n; i++) cout << l[i] << " "; cout << endl;
 	// 	for(int i = 1; i <= n; i++) cout << r[i] << " "; cout << endl;
 	ll ansl = 1, ansr = 1, ans = 0;
 	for(int i = 1; i <= n; i++){
 		if(a[i] * (pre[r[i]] - pre[l[i] - 1]) > ans){
 			ans = a[i] * (pre[r[i]] - pre[l[i] - 1]);
 			ansl = l[i];
 			ansr = r[i];
 		}
 	}
 	cout << ans << endl << ansl << " " << ansr << endl;
}

int main()
{
	#ifdef ONLINE_JUDGE
    #else
       freopen("in.txt", "r", stdin);
       freopen("out.txt", "w", stdout);
    #endif

	qc;
    int T;
    // cin >> T;
    T = 1;
    while(T--){

        solve();
    }
	return 0;
}

More

感谢npy的分享,好题

深度解析跨境支付之业务架构 详解跨境支付之业务架构 阅读详情

相关推荐

DeerFlow 在 Windows 上的安装与启动详细步骤

DeerFlow Windows安装与启动指南 DeerFlow是基于LangGraph的AI Agent系统,包含后端服务和前端界面。后端安装需Python 3.12+,创建虚拟环境后安装依赖,需注意解决langgraph版本冲突问题(推荐1.0.8版本)。配置文件中需设置模型参数(如本地Qwen3-32B-AWQ模型)和sandbox配置。启动分为两步:LangGraph Server(端口2024)和Backend Gateway(端口8001)。前端要求Node.js 22+和pnpm,配置.env

笨小孩 581

POJ 2796(单调栈)

题意 给定一个数组a[1..n],求一个连续序列[l,r],要求a[l..r]的最小值乘以sigma(a[l..r])最大。输出最大值和区间。 解题 枚举区间最小值h=a[i]。 从i开始向左开始遍历求出第一个值比a[i]小的值的下标L[i]。 从i开始向右开始遍历求出第一个值比a[i]小的值的下标R[i]。 那么,最小值为a[i]的区间就是[L[i]+1,R[i]-1]。 用一个前...

EnjoyingAC的博客 409

使用 arxiv-sanity 实时跟进自己研究领域的Paper

介绍 arxiv.org是一个非常大的预印本资源库,里面有大量的最新的论文,但缺点是浏览、搜索和排序不是很方便。这个资源库每天会更新大量的论文,如果通过手动搜索和浏览则效率很低,高引用的好文章难以及时的找到并阅读,造成时间的浪费。因此 使用 ...

John's Blogs 8278

poj2796 (单调栈)

题意:给出一个数组,然后求出区间和与区间最小值 的乘积最大的区间。 思路:可以用线段树之内的来做,不过这里用单调栈来做更加巧妙。有点类似与poj2559,用栈处理出大于它的数的区间最左端和最右端,那么的话这个点就是这个左端和右端的最小值了。区间和的话就用前缀和就行了,很巧妙。 #include #include #include #include #include using

Everything can be done! 550

DC/DC开关电源EMC仿真红宝书

本红宝书系统性介绍开关电源EMC仿真方法,包括仿真原理、仿真思路、仿真工具以及仿真效率提升与仿测一致性的实战经验。从理论到仿真,从仿真到应用,真正帮你实现一文掌握开关电源EMC仿真!全文约14000字,适读人群:开关电源设计、电磁兼容EMC相关从业者,电磁相关专业研究生及CST仿真爱好者等。

电磁学社 2498

Pythia: A Customizable Hardware Prefetching Framework Using Online Reinforcement Learning——“预取”论文解读

参考传送门: 1. Hardware Prefetching笔记 2. 全球百科——缓存预取 3. 百度百科——缓存数据预期技术 目录0. 什么是Hardware Prefetching(本节内容不包括在论文中)1. 简介1.1 关于Hardware Prefetching的一些关键信息1.2 现阶段方法的缺陷1.3 论文团队的目标1.4 核心思想2. 必要的背景知识介绍2.1 强化学习(Reinforcement learning)2.2 为什么说强化学习是一个好的解决思路3. 解决方法与思路3.1 Py

Pinkgranite86的博客 2165

POJ 2796 (前缀数组或者单调栈)

POJ 2796 题意: 给出一个数组,求出某一个数字和其所在的区间和的乘积最大值,输出最大值和左右区间的边界。其区间的定义是比这个数字大的区间。 思路: 正常的思路是枚举求出每一个数字的区间,然后算出乘积。问题是如何减少复杂度。 这里可以用数组的前缀和。左右区间的话也可以加速比较。 比如左区间:a[i] <= a[l[i]-1],那么l[i] = l[l[i]-1];#in

Since_natural_ran 624

【逐函数讲解ORB_SLAM3源码】获取普通帧率、关键帧、IMU数据

获得imu的旋转 mRwc * mImuCalib.mTcb.rotationMatrix(); Sophus::SE3 mTwc 创建ORB_SLAM3系统 Create SLAM system. It initializes all system threads and gets ready to process frames. ORB_SLAM3::System SLAM(argv[1],argv[2],ORB_SLAM3::System::IMU_RGBD, true, 0, file_nam

小秋 AI SLAM 入门实战教程 1244

poj 2796 单调栈(秒懂)

poj- 2796 单调栈维护高度, 前缀和也要维护高度,这题可以看作求max(a[i] * (sum[r[i]] - sum[l[i]])), 其中l[i]和r[i],分别表示第i个数的左边、右边比他小的第一个数的下标: 我知道你们只看这个 #pragma G++ optimize(2) #pragma GCC optimize(2) #define DEBUG #include<io...

weixin_43533544的博客 445

微信小程序 - 获取用户头像昵称等信息(带授权检测)

前言 接口调整官方文档:https://developers.weixin.qq.com/community/develop/doc/0000a26e1aca6012e896a517556c01 在以前,是否授权可以直接弹出询问用户,但现在微信更改了策略,必须由用户点击按钮触发。下面将用代码来实现用户授权及获取用户信息。 功能介绍 无论确认授权还是拒绝授权,都会跳转对应页面,不让用户卡在界面。 点击授权后,下次不在出现授权页面了,如果拒绝,下次依然出现。 以下代码可直接复制粘贴,具体功能如下:

🏆 前端领域优质创作者 1万+

Agentic AI商业化落地指南:提示工程架构师的7步优化法

Agentic AI(具备自主感知、决策与行动能力的智能体系统)是未来AI商业化的核心方向,其价值在于将大模型的“认知能力”转化为“实际行动”,解决复杂商业场景中的自动化与个性化需求。而提示工程(Prompt Engineering)作为连接人类意图与智能体行为的“翻译器”,直接决定了智能体的可控性、效率与用户体验,是Agentic AI商业化落地的关键支撑。本文结合第一性原理与工程实践,提出提示工程架构师的“7步优化法”,覆盖从“商业目标定义”到“规模化推广”的全流程。通过理论框架推导架构设计拆解。

AI架构全栈开发实战笔记 1万+

poj 2796 Feel Good 单调栈题解

单调栈模板题#include <bits/stdc++.h> using namespace::std;typedef long long ll; const ll MAXN = 100000+50; ll ms[MAXN], r; ll L[MAXN], R[MAXN]; ll n, pos, maxNum, x[MAXN]; ll sum[MAXN];int main() { ios_b

小楼吹彻玉笙寒 846

Apache Kylin 命令注入漏洞复现(CVE-2020-1956)

Apache Kylin 中的静态 API 存在安全漏洞,可以将os命令与用户输入字符串连接起来,攻击者可以在Kylin没有任何保护或验证的情况下执行任何os命令。

0xSec 1558

poj2796Feel Good(单调栈)

Feel Good Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 13572   Accepted: 3796 Case Time Limit: 1000MS   Special Judge Description Bill is developin

fouzhe的博客 606

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

[poj 2796 Feel Good] 单调栈

[poj 2796 Feel Good] 单调栈题目链接:[poj 2796 Feel Good] 单调栈 题意描述:给定N个数a1,a2,…,an(1≤N≤105,0≤ai≤106)a_1,a_2,\ldots,a_n(1\le N\le 10^5, 0\le a_i\le 10^6),求区间最小的数*区间和。 解题思路: 单调栈: 顾名思义就是在入栈时遵循单调原则,可以求出一个元素向左(

Fighting! 1462

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

POJ 2796 Feel Good 【单调栈】

题目链接:http://poj.org/problem?id=2796—————————————————————————————————-. Feel Good Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 13624 Accepted: 3807 Case Time Limit: 1000MS

Tabris的博客 629

POJ2796 Feel Good 单调栈

http://poj.org/problem?id=2796 题意:要求找一个区间的价值最大,区间价值定义为,区间和乘上区间最小值。 做法:直接找到以每一个值为最小值的区间,然后遍历一遍就完了。 此题还有一些坑,比如最大值为0,以及long long等 #include<bits/stdc++.h> using namespace std; typedef long long...

KXL5180的博客 228

poj2796Feel Good 单调栈

//一个长度为n的序列,对于一个区间中的value为这个区间的最小值乘上这个区间的所有数的和 //这就是找每一个点,找以其为最小值的区间 //显然直接暴力法找必然超时 //可以开一个单调递增栈,对于每一个新元素a[i] //当前值小于等于栈顶元素,表示以栈顶元素为最小值的区间的右端是i //栈顶元素a[j]出栈 , 由于是单调递增栈,新的栈顶元素a[k]必然小于a[j],故需要更新新的栈

ijbuhv的专栏 4942

POJ2796 Feel Good 题解 单调栈

题目链接:http://poj.org/problem?id=2796【题目描述】《人类情感研究》 special judge比尔正在为人类情感研究发展一种新的数学理论。他最近的研究重点在于好的日子和坏的日子是如何在一段时期内影响人的记忆力的。比尔提出了一个想法,他为人们生活的每一天都赋予了一个非负整数值。比尔将这个值称为一天中的情感价值。一天的情感价值越大,人们在这一天就会过得越好。比尔认为,人...

weixin_30706507的博客 209

POJ 2796 Feel Good(单调栈)

题目地址:POJ 2796 单调栈的第一题就是这道。。把我弄的晕头转向。现在终于明白了,对单调栈又加深了理解。原来单调栈不只是可以维护数。 代码如下: #include #include #include #include #include #include #include #include #include #include #include #include u

scf0920 1031

POJ 2796 Feel Good 单调栈

最近做这方面的题很多,感觉单调栈很是神奇,通过维护一个单调不减的栈,遇到小于栈顶的栈顶元素便出栈,此时跟新结果。 这个比RMQ的ST算法要快很多,ST算法要枚举每一个区间(没想到其他做法,可能要dp,反正不会)。这个题关键在于给每一个点找一个最长子序列,使其最小值为其本身,这样扫一遍得到结果。而单调栈正好可以解决这个问题。 (这个题大家注意要用long long我被int卡死,干脆全换long

1292765944的专栏 1827

【POJ-2796】Feel Good【单调栈】

题意: 给出一个序列,长度为 nnn。定义区间价值为区间和*区间最小值,求出这个序列中的最大区间价值。(n≤105,0≤ai≤106)(n\leq 10^5,0\leq ai\leq 10^6)(n≤105,0≤ai≤106) 思路: 此题题意十分简洁,求区间价值,并且区间价值定义就是区间和*区间最小值。因此此题最直接的思路就是枚举区间,然后发现 n2n^2n2 算法不可行,然后考虑枚举最小值,...

lucius-liu.cn 718

Feel Good POJ 2796 单调栈

题意:求所有区间的最小值思路:维护一个单调递增栈 , 利用单调栈求出以当前数a[i] 为最小值 的区间的长度,每次更新最小值。点击打开链接#include&lt;iostream&gt; #include&lt;cstdio&gt; #include&lt;stack&gt; #include&lt;cstring&gt; #define read(x) scanf("%lld",&amp;x) ...

qq_41231363的博客 201

POJ-2796 Feel Good(单调栈)

题目链接:\quadPOJ-2796题目大意:\quad给nn个数,令sum[L,R]sum[L, R]为区间[L,R][L, R]的和,min[L,R]min[L, R]为区间[L,R][L, R]中的最小值,让求最大的sum[L,R]∗min[L,R]sum[L, R] * min[L, R],并输出这个区间[L,R][L, R]。数据范围:1≤n≤1e50≤ai≤106\quad 1 \leq

XzzF1024的博客 596
上一篇: 2021牛客多校第一场 K——Knowledge Test about Match
下一篇: 2021牛客多校第二场 A——Arithmetic Progression
Linda_yezi_coder
博客等级 码龄7年 20粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值