南昌网络赛 Max answer(单调栈 + 线段树维护前缀和最大最小值)

【WRF-CMAQ实战指南】从环境配置到测试案例运行全解析 本文详细解析了WRF-CMAQ从环境配置到测试案例运行的全过程,包括系统环境检查、依赖库安装、源码获取与项目初始化、关键配置技巧、编译实战与排错、测试案例运行验证等关键步骤。通过实战指南,帮助用户快速掌握WRF-CMAQ的安装和运行技巧,提升空气质量模拟的效率。 阅读详情

题目链接

题意:

给一串序列,要求选任意连续的一段区间,使得这一段区间中最小值乘以区间总和尽量大。

题解:

首先先单调栈求出每个数字作为最小值所在的区间。

如果数据范围只有正数那么只用单调栈就可以解决,但是数据有负数,那么怎么高效查询使得总乘积最大的区间呢?

那么这时候我们可以用线段树维护前缀和的最大最小值,要使得负数乘以一个数尽量大,那么这个数就得尽量小。

前缀和能够 O(1) 的查询出区间的和,要使得区间和尽量小,那么对于第 i 个数字,通过线段树从 i 到 R[i] 中找到前缀和最小的,再从 L[i] 到 i - 1 中找到前缀和最大的(到 i 也行,不影响结果,还能防止 i == 0 时溢出),相减即为包含第 i 个数的最小连续区间和。

代码:

#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <bitset>
using namespace std;

typedef long long ll;
#define int ll
#define INF 0x3f3f3f3f3f3f3f3f
#define MAXM 100000 + 10
#define MAXN 500000 + 10
const ll mod = 1e9 + 7;
#define P pair<int, int>
#define fir first
#define sec second

int n;
int a[MAXN], sum[MAXN];
int L[MAXN], R[MAXN];
int mintree[MAXN<<2], maxtree[MAXN<<2];

void minbuild(int l, int r, int rt)
{
    if(l == r) {
        mintree[rt] = sum[l];
        return ;
    }

    int mid = (l + r) / 2;
    minbuild(l, mid, rt << 1);
    minbuild(mid + 1, r, rt << 1 | 1);
    mintree[rt] = min(mintree[rt<<1], mintree[rt<<1|1]);
}

void maxbuild(int l, int r, int rt)
{
    if(l == r) {
        maxtree[rt] = sum[l];
        return ;
    }

    int mid = (l + r) / 2;
    maxbuild(l, mid, rt << 1);
    maxbuild(mid + 1, r, rt << 1 | 1);
    maxtree[rt] = max(maxtree[rt<<1], maxtree[rt<<1|1]);
}

int minquery(int l, int r, int rt, int L, int R)
{
    if(L <= l && r <= R) return mintree[rt];

    int ans = INF, mid = (l + r) / 2;
    if(L <= mid) ans = min(ans, minquery(l, mid, rt << 1, L, R));
    if(mid < R) ans = min(ans, minquery(mid + 1, r, rt << 1 | 1, L, R));
    return ans;
}

int maxquery(int l, int r, int rt, int L, int R)
{
    if(L <= l && r <= R) return maxtree[rt];

    int ans = -INF, mid = (l + r) / 2;
    if(L <= mid) ans = max(ans, maxquery(l, mid, rt << 1, L, R));
    if(mid < R) ans = max(ans, maxquery(mid + 1, r, rt << 1 | 1, L, R));
    return ans;
}

signed main()
{
//    ios::sync_with_stdio(false);
//    cin.tie(0); cout.tie(0);
    cin >> n;
    for(int i = 1; i <= n; i ++) cin >> a[i], sum[i] = sum[i-1] +  a[i];

    minbuild(1, n, 1);
    maxbuild(1, n, 1);
    stack<int> S;
    a[0] = a[n+1] = -INF;
    for(int i = 1; i <= n + 1; i ++) {
        while(!S.empty() && a[S.top()] > a[i]) {
            R[S.top()] = i;
            S.pop();
        }
        S.push(i);
    }
    while(!S.empty()) S.pop();
    for(int i = n; i >= 0; i --) {
        while(!S.empty() && a[S.top()] > a[i]) {
            L[S.top()] = i;
            S.pop();
        }
        S.push(i);
    }

    int ans = -INF;
    for(int i = 1; i <= n; i ++) {
        if(a[i] >= 0) {
            ans = max(ans, a[i] * (sum[R[i]-1] - sum[L[i]]));
        }
        else {

            int mq = minquery(1, n, 1, i, R[i] - 1);
            int lq = maxquery(1, n, 1, L[i] + 1, i);
            ans = max(ans, a[i] * (mq - lq));
        }
    }

    cout << ans << endl;
}

/*

老实说,
要到几岁才开始不相信圣诞老人的存在……
这类无聊的话题对我而言,
根本不痛不痒的。
不过,
讲到我从几岁起开始不相信圣诞老人就是那个穿着红衣服的老公公时,
我能确定地说,
我根本打从一开始就不相信。
我知道幼稚园圣诞节庆祝会时出现的圣诞老人是假的,
回溯记忆,
还能记起周围的幼稚园小朋友都一脸不信任地望着假扮圣诞老人的园长老师。
即使没有撞见老妈正在亲吻圣诞老公公,
机灵的我也老早就怀疑只在圣诞节工作的老爷爷是否真的存在了。
不过,
我却是过了很久以后,
才发现外星人、幽灵、妖怪、超能力者以及特摄、动画里头,
那些与邪恶组织战斗的英雄们并不存在这世上。
不,
说不定我早就发现了,
只不过一直不想承认而已。
因为,
在我的内心深处,
是十分渴望那些外星人、幽灵、妖怪、超能力者以及邪恶组织突然出现在眼前的。
和我生活的这个普通世界相比,
特摄、动画里头所描绘的世界,
反而更有魅力。
我也想活在那种世界里!
我真的好想拯救被外星人绑架并关在透明的大型豌豆夹里头的少女…
也想拿着雷射枪运用智慧与勇气击退企图改写历史的未来人…
或者光用一句咒语就收拾了恶灵跟妖怪,
再不然就是和秘密组织的超能力者进行超能力的战斗!
等等,
冷静一下,
假设我被外星人等等(以下略)那类的生物袭击,
没有任何特殊能力的我怎么可能和他们对抗?
于是,
我便如是幻想 ——
某天,
班上突然转来一个谜样的转学生,
他其实是个外星人或未来人那类的生物,
并拥有未知的能力,
后来他跟坏人战斗,
而我只要设法让自己被卷进那场战争就好了。
主要战斗的人是他,
而我则是追随他的小跟班。
啊啊,
实在太棒了,
我真是聪明啊!
要不然就是这样。
某天,
我那不可思议的力量突然觉醒,
就像隔空取物或精神念力之类的。
而且地球上其实还有很多拥有超能力的人类存在,
自然也会有一个组织专门收容这些人。
不久之后,
善良的组织便派人来迎接我。
而我也成为组织的一员共同对抗企图征服世界的邪恶超能力者。
不过,
现实却是意外地残酷。
现实的生活中,
并没有半个转学生转来我班上,
我也没看过UFO…
就算去了地方上常出现幽灵或妖怪的灵异地点也连个鬼影都没有…
花了两小时盯着桌上的铅笔,
它却连一微米都没移动…
上课时死盯着前座同学的头,
却怎么样也无法读出他在想什么。
我就这样边惊叹世界物理法则经常出现的现象,
边不停自嘲,
不知从何时起,
我就开始不看电视上的UFO特别节目或灵异节目了。
因为不可能会有那种东西……
不过后来我也成长到仅对那方面的事情存有一丝留恋的程度。
国中毕业之后,
我便从那孩提时代的梦想毕业,
逐渐习惯这个世界的平凡。
而让我还有一缕期待的一九九九年也没有发生什么事。
进入二十一世纪后,
人类依旧无法迈出月球到其他星球去。
看这情况,
在我还活着的时候,
想从地球当天往返阿尔法人马座(Alpha Cenauri)似乎是不太可能的。
我脑海中时而幻想着这些事,
终于也没啥感慨地成为高中生 —— 直到遇到了凉宫春日。
之后,
我就这么糊里糊涂地进入学区内的县立高中就读。
起初我还很后悔,
因为这座学校位于很高的山上,
就算是春天也要挥汗如雨地爬上直窜山顶的坡道,
想轻松健行的那份悠闲早已消失无踪。
一想到今后三年每天一大早都得这样爬山,
我的心情就阴郁无比。
或许是早上差点睡过头的关系,
走路的速度自然加快许多,
虽然也曾想过以后干脆早十分钟起床,
慢慢走去上学就不会这么累,
不过一想到临起床前的那十分钟睡眠是多么的宝贵,
我随即放弃了这个念头。
所以,
我相信未来的三年还是得持续这个晨间的运动。
一想到这里,
心情就更沉重了。

*/

 

别再只盯着报点率了:聊聊电容触摸屏算法里那些不为人知的‘软实力’ 本文深入探讨了电容触摸屏算法中常被忽视的‘软实力’,包括环境噪声干扰、信号衰减补偿和多物理场耦合等核心挑战。通过对比消费电子与工业场景的算法需求,揭示了触摸算法在不同应用中的技术分野。文章还提供了实用的算法评估方法和前沿发展趋势,帮助开发者全面了解电容触摸屏技术的隐秘战场。 阅读详情

相关推荐

鱼眼相机矫正实战:除了棋盘格,试试横向展开和经纬度法(OpenCV4/C++实现对比)

本文对比了鱼眼相机矫正的三种主流方法:棋盘格标定法、横向展开法和经纬度法,通过OpenCV4/C++实战代码解析,帮助开发者在自动驾驶、VR全景拼接和安防监控等场景中选择最适合的技术方案。重点分析了各方法的精度、处理速度和适用场景,为工程实践提供实用指导。

weixin_29032489的博客 283

【P4198】楼房重建(线段树维护前缀最值)

线段树维护前缀最值相关的模板题。 关键思想在于合并,[l,mid][l,mid][l,mid] 的前缀最值仍然是 [l,r][l,r][l,r] 的前缀最值,而 (mid,r](mid,r](mid,r] 中只有 ≥mxl\geq mx_l≥mxl​ 的前缀最值才是 [l,r][l,r][l,r] 的前缀最值。 而前缀最值是单调的,于是可以对于 (mid,r](mid,r](mid,r] 在线段树上二分,统计 ≥mxl\geq mx_l≥mxl​ 的前缀最值的信息和。 当信息具有可减性时,直接按原来的方法记

ez_lcw的博客 298

倍福TC3 PLC高速采集实战:如何用PLC-Recorder实现0.24ms级时间戳同步

本文详细介绍了倍福TC3 PLC与PLC-Recorder实现0.24ms级时间戳同步的工程实践方案。通过硬件拓扑设计、时间源选择优化、报文结构封装及同步验证方法,为工业自动化领域的高精度数据采集提供了可靠解决方案,特别适用于精密装配、激光切割等微秒级同步要求的场景。

weixin_29193359的博客 372

单调栈

一、单调栈的一些特点 1、一般作为单调栈的数据结构 vector<>、stack<>、string 2、单调栈特点 (1)特点1 当前元素左侧想要找的东西,需要在该元素进栈时找到; 当前元素右侧想要找的东西,需要在之后元素进栈时获得。 当一个元素进栈时,更新它左侧想要的东西,更新栈内元素右侧想要的东西。 (2)...

weixin_41565755的博客 284

VS Code + Codex 在 WSL 中使用的正确姿势

Codex 登录只能在本地完成。文件仍可通过 UNC 路径访问 WSL → 本地 Codex 就能照常工作。避免在 WSL 内重复安装/登录 Codex 扩展。

yangguangwuyue的博客 9822

使用 Python+PaddleOCR 实现图文识别:从入门到精通

在当今数字化时代,图文识别技术的应用越来越广泛,如文档数字化、信息提取等。PaddleOCR 是百度开源的一款强大的 OCR 工具包,它集成了多种先进的算法和模型,能够高效准确地进行图文识别。本文将详细介绍如何使用 PaddleOCR 和 Python 实现图文识别,并给出具体的代码和步骤。

爱搬砖的程序猿 5474

【HDU6609 Find the answer】线段树||树状数组维护前缀和

传送门 官方题解是这么说的:   对于第i个位置,怎样选择数字才会使满足条件情况下选择数字数目最少呢?很容易想到,需要选择前i1个数中较大的数字,使其变为0。   基于这个思想,如果我们对于每个位置i都暴力去找最大的前几个数,显然会TLE!   可以注意到,题目可以转化为前i-1个数中最多选出多少个数字和W[i]相加使得其和小于等于m(很容易想到,选择较小的数才会使选的数最多)。转化之后就很容...

菜的一批的SNOW的博客 398

最新Anaconda3的安装配置及使用教程(详细过程)

最新Anaconda3安装使用Anaconda下载方式一:官网下载方式二:清华镜像下载(推荐)Anaconda安装 Anaconda是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项 Anaconda + Jupyter 基本上已经是大部分机器学习/数据分析等开发者标配的开发环境, 不多介绍,直接进去正题: Anaconda下载 方式一:官网下载 下载地址传送门: 官网首页:https://www.anaconda.com/ 官网下载页:https://www

HowieXue 薛永浩的博客 34万+

线段树维护单调栈

单点修改,维护元素个数。 #include&amp;lt;bits/stdc++.h&amp;gt; #define ll long long using namespace std; double Max[400010]; int sum[400010]; inline int read() { char c=getchar();int x=0,flag=1; while(!isdigit(c)...

Hellsegamosken 894

cesium加载geotiff的 四种方法

本文介绍了在Cesium中加载GeoTIFF数据的两种主要方法。首先解析了核心前置知识,包括坐标系匹配、数据类型区分和性能优化。方法1详细演示了如何将RGB影像GeoTIFF转换为Cesium影像图层,包含从数据解析到Canvas转换的完整代码流程。方法2则针对高程数据(DEM)处理,展示了前端直接解析构建地形网格的方案。文章提供了完整的代码示例和关键实现要点,适用于卫星影像、专题图和数字高程模型等多种GeoTIFF数据类型在三维场景中的可视化需求。

大剑师兰特的GIS世界 392

自动驾驶感知新方案:YOLOv13多模态(RGB+LiDAR+热成像)融合实战

YOLOv13的RGB+LiDAR+热成像多模态融合方案,解决了自动驾驶感知的鲁棒性问题,通过跨模态特征互补和注意力融合,实现了复杂场景下的高精度检测。本文从架构设计、数据预处理、核心模块实现到车载部署,完成了全流程实战。动态模态权重:根据场景自动调整各模态的权重(如黑夜场景提升热成像权重);端到端3D检测:直接从原始点云与图像进行3D检测,减少预处理步骤;轻量化优化:针对车载设备进一步剪枝量化,提升推理速度。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 533

【技巧】线段树维护区间单调栈

例题给出一个序列,这个序列的每个位置有两个值ai,fia_i,f_i,每次询问一个区间,把这个区间的所有数以a为关键字,从左到右做一个单调递减的栈,求这个单调栈中的元素的f值的最小值。【JZOJ 5402】【NOIP2017提高A组模拟10.8】God Knows讲解在遇到此类的问题可以用线段树来搞,先来考虑一个比较原始的方法: 设函数find(l,r,P) 表示线段树l,r这个区间,所有aia_

1930

黑猫带你学eMMC协议第17篇:超详细的eMMC HS200 & HS400讲解

1 前言 1.1 声明 本文依据eMMC JEDEC5.1及个人工作经验整理而成,如有错误请留言。 本文结合eMMC JEDEC5.1协议手册查看效果更佳。 1.2 内容提要 本文大约6000字,主要内容有: 1.什么是emmc hs200/hs400? 2.什么是tuning?tuning的过程又是什么? 3.如何设置才能让emmc进入hs200 mode? 4.如何设置才能让emmc进入hs400 mode? 5.emmc关于HS200/HS400内部结构框图对比。 6.部分个人相关经验总结。

黑猫奥利奥的博客 1万+

南昌网络赛 Max answe 单调栈+线段树维护区间最大最小值

题目链接:https://nanti.jisuanke.com/t/38228 题意:求区间和*区间最小值 的最大值 题解:先单调栈求一下以每个位置为最小值的左右到哪,线段树维护下前缀的最大最小值,然后当前值为正值时,就让可选区间范围内区间的值最大,右边取个最大,左边取个最小,当前值为负数时,让可选区间的值最小,左边取个最小,右边取个最大 #include<bits/stdc++.h...

还我笑颜 611

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

南昌网络赛I.Max answer(单调栈+线段树)

I. Max answer Alice has a magic array. She suggests that the value of a interval is equal to the sum of the values in the interval, multiplied by the smallest value in the interval. Now she is plannin...

Sclong0218的博客 253

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

2019南昌网络邀请赛 Max answer (单调栈)

Max answer 问答问题反馈 只看题面 11.63% 3000ms 262144K Alice has a magic array. She suggests that the value of a interval is equal to the sum of the values in the interval, multiplied by the smallest va...

1999 285

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

南昌网络赛 I 题,max answer(单调栈 + 线段树)

max answer Alice has a magic array. She suggests that the value of a interval is equal to the sum of the values in the interval, multiplied by the smallest value in the interval. Now she is planning...

Error Man 的博客 409

2019南昌网络邀请赛-I-Max Answer-线段树(RMQ)+ 单调栈

思路: 先用单调栈算出每个a[i]可以作为区间最小值的区间的最左边和最右边。 如果a[i] > 0的话,直接整个区间的值都要,因为最小值为正数的区间的数全>0; 如果a[i] < 0 的话,可以从点前位置,可以向左向右暴力搜索最小值。(数据有点水,所以可以过)。 更好的做法是用线段树求维护每个点左边和,右边和的最大值。 但是线段树是用来求解 解可以进行区间合并的,最常见的就是区...

我们花时间收集,却忘了最重要的其实是花时间去消化 491

南昌邀请赛 - I Max answer(单调栈 + 线段树)

题面: 这题如果a[i] > 0,则是一道经典的单调栈,如果针对a[i]大于0的情况不太清楚的话,可以参考我写的单调栈其他的题目,现在我们重点来讨论a[i] < 0的情况。 如果a[i]小于零,则应该使得包含a[i]的区间和最小,即找到1~i区间上最大的前缀和lmax,和i-n区间上最小的前缀和rmin,然后两者相减得到最小的区间前缀和,很容易联想到用线段树来维护区间前缀的最值,这是...

weixin_43533544的博客 252

南昌网络赛 Max answer(单调栈)

题意:给你n个数,让你找到数组中区间的最大价值,区间价值定义为区间的最小值*区间的数字加和 思路:用单调栈处理出左右l,r.然后用线段树或者st维护区间的最值,如果a[i]<0就左侧min,右侧max,大于0就反一下,(为什么比赛的时候一直不过啊) 代码: #include <bits/stdc++.h> using namespace std; typedef l...

weixin_30342827的博客 79

[JZOJ6223] 互膜 【线段树】【单调栈】【DP】

Description Solution 我们可以设一个朴素的DP 记f[i][0/1]f[i][0/1]f[i][0/1]表示第i−1i-1i−1轮上一个人是否操作了i这个位置,当前先手-当前后手的权值的最大值。 显然Ans=Sum+f[1][0]Ans=Sum+f[1][0]Ans=Sum+f[1][0] 容易得到转移f[i][0]=−f[i+1][1]+s[i]f[i][0]=-f[i+1...

Never give in. 325

[HNOIAHOI2018] 转盘(线段树维护单调栈)

我丢~

523

线段树——通过维护区间前缀和后缀的到最终结果类的题目

第一次看这道题的时候,我根本就没有想到该如何用线段树去解决这道问题,想用动态规划,但是一直在修改如果每次都进行一次动态规划,那么时间必然会超限的,然后我这个蒟蒻就在题解区里看到了大犇的写法,只能用巧妙来形容。思路:我们在线段树里,用sum去统计这个区间内01序列的最长长度,lsum去表示前缀01序列的最长长度,rsum表示后缀01序列的最长长度。,即a[mid]==a[mid+1],那么sum必然就是左区间的最长前缀或者右区间的最长后缀。然后我们需要分析,对于sum来说。

2301_80475191的博客 580

【Nowcoder】登顶 | 线段树 、单调栈

题目链接:https://ac.nowcoder.com/acm/problem/208150 题目大意: 求出所有区间的最大值*最小值的和 题目思路: 有一个比较经典的思路 有一个相似的思路:(待补) 枚举所有的结束节点 1~n 用线段树维护 从i到当前枚举的结束节点的 最大值*最小值 假设当前枚举位置是 pos: 那么节点1 维护的 即为 1~pos的区间最大值*最小值 节点2维护2~pos的最大值*最小值 也就是说 整个过程 我们每次会多一个起点,之前的区间会向右扩充一个数 可.

一只酷酷光儿的博客 473

小白逛公园 线段树维护 最大前缀和,后缀和

luogu -区间求最大和 线段树维护 最大前缀和,后缀和 P4513 小白逛公园 提交 2.71k 通过 874 时间限制 1.00s 内存限制 128.00MB 题目提供者 huhao 难度 省选/NOI- 历史分数 100 提交记录 查看题解 标签 相关讨论 进入讨论版 推荐题目 展开 题目背景 小新经常陪小白去公园玩,也就是所谓的遛狗啦… 题目描述 在小新家附近有一条“公园路”,路的一...

Up Panda 691

洛谷1714线段树加前缀和

题目传送门:https://www.luogu.org/problemnew/show/P1714 题意很简单,在一段长度为n的序列里找出长度小于k的一段连续序列的最大值,是线段树无疑了。但是假如写一个求区间和的线段树你的复杂度大概为o(n^2logn),你要研究(1,k),(1,k-1)……(1,1,)中的最大值然后将以上操作重复n遍(严格来说没有n遍因为从n出发后只有(n,n),但无伤大雅,...

qq_40892508的博客 893
上一篇: Codeforces Gym - 101808K(倍增LCA最近公共祖先)
下一篇: 洛谷 P2765 魔术球问题 (网络流 + 思维)
ttoobne
博客等级 码龄9年 13粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值