蓝桥杯 最大区间

embedded/2025/4/2 6:36:17/

原题目链接

问题描述

给定一个长度为 n 的序列 A_i,求一对 L, R 使得:

(R - L + 1) * min(A_L, A_{L+1}, ..., A_R)

的值尽可能大,其中 min 表示该区间中的最小值。

你只需要输出该表达式的最大值,无需输出具体的 LR


输入格式

  • 第一行包含一个整数 n,表示序列的长度。
  • 第二行包含 n 个整数,分别表示 A_1, A_2, ..., A_n,相邻两个整数之间使用一个空格分隔。

输出格式

输出一行,包含一个整数,表示答案。


样例输入

5
1 1 3 3 1

样例输出

6

评测用例规模与约定

  • 对于 40% 的评测用例:1 ≤ n ≤ 5000,1 ≤ A_i ≤ 5000
  • 对于所有评测用例:1 ≤ n ≤ 3×10^5,1 ≤ A_i ≤ 10^9

c++代码

#include<bits/stdc++.h>
#include<stdio.h>using namespace std;typedef long long ll;ll n, ans = 0;
vector<ll> arr, nextsmall, lastsmall;int main() {stack<ll> st, sk;scanf("%lld", &n);arr = vector<ll>(n), nextsmall = vector<ll>(n, n), lastsmall = vector<ll>(n, -1);for (ll i = 0; i < n; i++) {scanf("%d", &arr[i]);}for (ll i = 0; i < n; i++) {while(!st.empty() && arr[i] < arr[st.top()]) {nextsmall[st.top()] = i;st.pop();}st.push(i);}for (ll i = n - 1; i >= 0; i--) {while(!sk.empty() && arr[i] < arr[sk.top()]) {lastsmall[sk.top()] = i;sk.pop();}sk.push(i);}for (ll i = 0; i < n; i++) {ll left = lastsmall[i] + 1, right = nextsmall[i] - 1;ans = max(ans, (right - left + 1) * arr[i]);}printf("%lld", ans);return 0;
}//by wqs

算法讲解

用单调栈

这道题目,先选取一个值假设这个值就是最小的,然后不断向两边扩散,使得R - L最大,前提是保证这个值最小。

如何快速得到L和R,就是快速得到右边第一个比他大的,和左边第一个比他小的,这就是经典的单调栈问题。


http://www.ppmy.cn/embedded/177374.html

相关文章

flutter 获取设备的唯一标识

插件 device_info_plus | Flutter packageFlutter plugin providing detailed information about the device (make, model, etc.), and Android or iOS version the app is running on.https://pub.dev/packages/device_info_plus安卓 androidInfo.serialNumber serialNum…

Solana生态中的狙击机器人:Raydium监听策略解析

在加密货币市场中&#xff0c;Solana生态凭借其高性能和低成本特性&#xff0c;成为迷因币和新代币首发交易的热门选择。这些新代币往往伴随着剧烈的价格波动&#xff0c;为交易者提供了短期获利的机会。为了抓住这些稍纵即逝的窗口&#xff0c;交易者开发了狙击机器人&#xf…

基于Spring Boot + Vue的银行管理系统设计与实现

基于Spring Boot Vue的银行管理系统设计与实现 一、引言 随着金融数字化进程加速&#xff0c;传统银行业务向线上化转型成为必然趋势。本文设计并实现了一套基于Spring Boot Vue的银行管理系统&#xff0c;通过模块化架构满足用户、银行职员、管理员三类角色的核心业务需求…

128最长连续序列解题记录

最开始没读清楚题目觉得好难啊。。。 直接的方法是将数组排序&#xff0c;然后遍历记录连续的长度。 func longestConsecutive(nums []int) int {// 检查为空的情况if len(nums) 0{return 0} sort.Ints(nums)max, count : 1, 1for i:1; i<len(nums); i {if nums[i-1]1 n…

LVS-DR模式配置脚本

LVS-DR模式配置脚本 实验环境&#xff0c;需要4台虚拟机 IP说明172.25.254.101客户端172.25.254.102负载均衡器DS172.25.254.103真实服务器RS172.25.254.104真实服务器RSVIP&#xff1a;172.25.254.255/32 系统必须有ipvsadm和ifconfig命令 dnf install ipvsadm dnf install n…

HTML应用指南:利用POST请求获取全国小鹏汽车的充电桩位置信息

在新能源汽车快速发展的背景下&#xff0c;充电桩的分布和可用性成为影响用户体验的关键因素之一。随着全球对环境保护意识的增强以及政府对新能源政策的支持&#xff0c;越来越多的消费者倾向于选择电动汽车作为日常出行工具。然而&#xff0c;充电设施是否完备、便捷直接影响…

[特殊字符] 2025蓝桥杯备赛Day11——P11041 [蓝桥杯 2024 省 Java B] 报数游戏

&#x1f50d; 2025蓝桥杯备赛Day11——P11041 [蓝桥杯 2024 省 Java B] 报数游戏 &#x1f680; 题目速览 题目难度&#xff1a;⭐️⭐️⭐️&#xff08;需要数论与二分法结合&#xff09; 考察重点&#xff1a;容斥原理、二分搜索、最小公倍数计算 &#xff08;当然也可…

动态内存分配与内存对齐

在C语言及其他低级编程语言中,内存管理是一个至关重要的主题。动态内存分配和内存对齐是确保程序高效和稳定运行的关键因素。本文将深入探讨动态内存分配的原理,内存对齐的概念,并解释它们如何共同影响程序的性能和资源利用。 一、动态内存分配简介 1.1 动态内存分配的概念…