题目链接:https://nanti.jisuanke.com/t/38228

题意:定义一段区间的值为该区间的和×该区间的最小值,求给定数组的最大的区间值。

思路:比赛时还不会线段树,和队友在这题上弄了3小时,思路大体都是对的,但就是没法实现。这几天恶补线段树。

   首先可以利用单调栈来查找满足a[i]为最小值的最大区间L[i]~R[i]。然后利用线段树求一个段的和sum、最小前缀lsum和最小后缀rsum。然后遍历a[i]:

    a[i]>0:最优为sum(L[i],R[i])*a[i]

    a[i]<0:最优为(sumr(L[i],i)+suml(i,R[i]-i)*a[i]

   这里用线段树查询可以用传递引用来求lsum和rsum,因为我们查询一段区间是从左向右查询的,或者可以用三个全局变量Sum、Lsum、Rsum记录当前已找到的区间的对应属性也行。

AC代码:

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=;
typedef long long LL; struct node{
int l,r;
LL sum,lsum,rsum; //sum为区间和,lsum最小前缀,rsum最小后缀
}tr[maxn<<];
//L[i]~R[i]为满足a[i]为最小的最大区间
int n,p,a[maxn],L[maxn],R[maxn],stk[maxn];
LL ans; node gets(node a,node b){
node t;
t.l=a.l,t.r=b.r;
t.sum=a.sum+b.sum;
t.lsum=min(a.lsum,a.sum+b.lsum);
t.rsum=min(b.rsum,b.sum+a.rsum);
return t;
} void build(int v,int l,int r){
tr[v].l=l,tr[v].r=r;
if(l==r){
tr[v].sum=a[r];
tr[v].lsum=min(a[r]*1LL,0LL);
tr[v].rsum=min(a[r]*1LL,0LL);
return;
}
int mid=(l+r)>>;
build(v<<,l,mid);
build(v<<|,mid+,r);
tr[v]=gets(tr[v<<],tr[v<<|]);
} void query(node &x,int v,int l,int r){
if(l<=tr[v].l&&r>=tr[v].r){
x=gets(x,tr[v]);
return;
}
int mid=(tr[v].l+tr[v].r)>>;
if(l<=mid) query(x,v<<,l,r);
if(r>mid) query(x,v<<|,l,r);
} int main(){
scanf("%d",&n);
for(int i=;i<=n;++i)
scanf("%d",&a[i]);
a[]=a[n+]=0xcfcfcfcf;
stk[p=]=; //利用单调栈求L[i],R[i]
for(int i=;i<=n;++i){
while(a[stk[p]]>=a[i]) --p;
L[i]=stk[p]+;
stk[++p]=i;
}
stk[p=]=n+;
for(int i=n;i>=;--i){
while(a[stk[p]]>=a[i]) --p;
R[i]=stk[p]-;
stk[++p]=i;
}
build(,,n);
for(int i=;i<=n;++i){
if(a[i]>){
node t;
t.sum=t.lsum=t.rsum=;
query(t,,L[i],R[i]);
if(a[i]*t.sum>ans) ans=a[i]*t.sum;
}
else if(a[i]<){
LL tmp=;
node t;
t.sum=t.lsum=t.rsum=;
query(t,,L[i],i);
tmp+=t.rsum;
t.sum=t.lsum=t.rsum=;
query(t,,i,R[i]);
tmp+=t.lsum;
tmp-=a[i];
if(tmp*a[i]>ans) ans=tmp*a[i];
}
}
printf("%lld\n",ans);
return ;
}

2019南昌网络赛-I(单调栈+线段树)的更多相关文章

  1. 2019南昌网络赛I:Yukino With Subinterval(CDQ) (树状数组套主席树)

    题意:询问区间有多少个连续的段,而且这段的颜色在[L,R]才算贡献,每段贡献是1. 有单点修改和区间查询. 思路:46min交了第一发树套树,T了. 稍加优化多交几次就过了. 不难想到,除了L这个点, ...

  2. ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval

    ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ...

  3. 洛谷P4198 楼房重建 单调栈+线段树

    正解:单调栈+线段树 解题报告: 传送门! 首先考虑不修改的话就是个单调栈板子题昂,这个就是 然后这题的话,,,我怎么记得之前考试好像有次考到了类似的题目昂,,,?反正我总觉着这方法似曾相识的样子,, ...

  4. 2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树)

    2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树) 传送门:https://nanti.jisuanke.com/t/41296 题意: 给一个数列A 问在数列A中有多 ...

  5. ACM-ICPC 2019南昌网络赛F题 Megumi With String

    ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...

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

    https://nanti.jisuanke.com/t/38228 题意给你一个序列,对于每个连续子区间,有一个价值,等与这个区间和×区间最小值,求所有子区间的最大价值是多少. 分析:我们先用单调栈 ...

  7. 2019ICPC南昌邀请赛网络赛 I. Max answer (单调栈+线段树/笛卡尔树)

    题目链接 题意:求一个序列的最大的(区间最小值*区间和) 线段树做法:用单调栈求出每个数两边比它大的左右边界,然后用线段树求出每段区间的和sum.最小前缀lsum.最小后缀rsum,枚举每个数a[i] ...

  8. 网络赛 I题 Max answer 单调栈+线段树

    题目链接:https://nanti.jisuanke.com/t/38228 题意:在给出的序列里面找一个区间,使区间最小值乘以区间和得到的值最大,输出这个最大值. 思路:我们枚举每一个数字,假设是 ...

  9. 2019南昌网络赛  I. Yukino With Subinterval 树状数组套线段树

    I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...

随机推荐

  1. mybatis与数据库访问相关的配置以及设计

    mybatis与数据库访问相关的配置以及设计 mybatis不管如何NB,总是要与数据库进行打交道.通过提问的方式,逐步深入 我们常用的MyBatis配置中哪些是与数据库相关? 数据源配置: < ...

  2. java构建工具——ant使用

    Ant是跨平台的构建工具,它可以实现项目的自动构建和部署等功能.在本文中,主要让读者熟悉怎样将Ant应用到Java项目中,让它简化构建和部署操作. 一.安装与部署 1.1 下载 下载地址:https: ...

  3. 随手用JQ写个选项卡

    <div class="box"> <ul> <li class="one">选项卡1</li> <li& ...

  4. 【HDFS API编程】查看文件块信息

    现在我们把文件都存在HDFS文件系统之上,现在有一个jdk.zip文件存储在上面,我们想知道这个文件在哪些节点之上?切成了几个块?每个块的大小是怎么样?先上测试类代码: /** * 查看文件块信息 * ...

  5. python-day8socket、粘包、并发、多用户ftp

    @以字符串名称形式引入外部模块:同级文件lib里面有个函数a打印66 1.解释器内部使用 m=__import__('lib')print(m.a()) 结果: 66 None 官方推荐用户使用 im ...

  6. orcal -学习准备

    格式化命令: 设置每行长度 SET LINESIZE 300; 设置每页长度 SET PAGESIZE 30; 使用文本编辑 文本编辑sql:ed aa 使用@aa 切换用户: CONN 用户名/密码 ...

  7. tornado框架设置

    路由 import tornado.ioloop #开启循环 让服务器一直等待请求的到来 import tornado.web #框架基本功能封装在此模块 #例子 class MainHendler( ...

  8. 接口性能测试(Jmeter)操作总结

    以前常用SoapUI来做接口的性能测试,这次用的Jmeter,对需由客户端根据时间戳等登录参数生成随机token值和印签值来发请求的系统,非它莫属了.下面就这次测试的难点和操作注意问题展开总结. ** ...

  9. mac电脑复制键失灵

    mac键按command+c偶尔失灵打电话给客服. 客服的解决方案: 1.关机状态同时按: shiflt+option+control+关机键  (重置键盘快捷键不会丢失数据)  20秒 2.松开后重 ...

  10. python学习笔记----random

    import random import string # 随机整数: print random.randint(1,50) >>> print(random.randint(1,5 ...