2019南昌网络赛-I(单调栈+线段树)
题目链接: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(单调栈+线段树)的更多相关文章
- 2019南昌网络赛I:Yukino With Subinterval(CDQ) (树状数组套主席树)
题意:询问区间有多少个连续的段,而且这段的颜色在[L,R]才算贡献,每段贡献是1. 有单点修改和区间查询. 思路:46min交了第一发树套树,T了. 稍加优化多交几次就过了. 不难想到,除了L这个点, ...
- ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval
ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ...
- 洛谷P4198 楼房重建 单调栈+线段树
正解:单调栈+线段树 解题报告: 传送门! 首先考虑不修改的话就是个单调栈板子题昂,这个就是 然后这题的话,,,我怎么记得之前考试好像有次考到了类似的题目昂,,,?反正我总觉着这方法似曾相识的样子,, ...
- 2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树)
2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树) 传送门:https://nanti.jisuanke.com/t/41296 题意: 给一个数列A 问在数列A中有多 ...
- ACM-ICPC 2019南昌网络赛F题 Megumi With String
ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...
- 南昌网络赛 I. Max answer (单调栈 + 线段树)
https://nanti.jisuanke.com/t/38228 题意给你一个序列,对于每个连续子区间,有一个价值,等与这个区间和×区间最小值,求所有子区间的最大价值是多少. 分析:我们先用单调栈 ...
- 2019ICPC南昌邀请赛网络赛 I. Max answer (单调栈+线段树/笛卡尔树)
题目链接 题意:求一个序列的最大的(区间最小值*区间和) 线段树做法:用单调栈求出每个数两边比它大的左右边界,然后用线段树求出每段区间的和sum.最小前缀lsum.最小后缀rsum,枚举每个数a[i] ...
- 网络赛 I题 Max answer 单调栈+线段树
题目链接:https://nanti.jisuanke.com/t/38228 题意:在给出的序列里面找一个区间,使区间最小值乘以区间和得到的值最大,输出这个最大值. 思路:我们枚举每一个数字,假设是 ...
- 2019南昌网络赛 I. Yukino With Subinterval 树状数组套线段树
I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...
随机推荐
- reshape的两个函数melt和dcast
reshape Reshape包主要是用来做数据变形的.其中主要的有两个函数melt和dcast1.其中melt主要用于宽变长,而dcast1主要用于长变宽.melt和dcast1是reshape2包 ...
- Mysql在sql中截取时间类型字段的年月日
//显示年月日 select date_format(date ,'%Y-%m-%d' ) from talbe_a //根据年月日分组 select date_format(date ,'%Y-%m ...
- glide 长方形图片显示圆角问题
目前业务是RecyclerView嵌套RecyclerView,子RecyclerView里面显示图片,图片显示方式又分为 多图和单图显示方式(这个是已经调试好的效果) 测试显示结果只有单张图片不显示 ...
- altera DDR2 ip使用笔记之IP核生成
IP核生成 Quartus生成DDR2 ip流程如下: 点击菜单栏的Tools->MegaWizard Plug-In Manager,弹出 选择IP类型,保持路径即文件名等,如下图 点击n ...
- asp微信支付代码证书文件post_url.aspx和post_url.aspx.cs源码下载
很多朋友在网上找的asp支付代码中都没有这两个证书文件,只能是用别人的,但是如果别人把他的网站这个文件删了,你的支付也就不能用了,今天我就把大家需要的这两个asp微信支付代码证书文件post_url. ...
- Docker安装ElasticSearch及kibana
什么是Kibana? Kibana 是一个设计出来用于和 Elasticsearch 一起使用的开源的分析与可视化平台,可以用 kibana 搜索.查看.交互存放在Elasticsearch 索引里的 ...
- js关闭浏览器
不存在的 告诉策划:不好意思,这个需求实现不了. 旧版本浏览器有些支持window.close()方法,目前主流浏览器都不支持,就算让你 ...
- mac环境破解navicat premium 12.1
1. 下载破解工具 https://github.com/DoubleLabyrinth/navicat-keygen/tree/mac 其中,navicat-keygen为破解器:navicat-p ...
- java异常——Exception、RuntimException
一.Exception和RuntimeException的区别 Exception是RuntimeException的父类,使用了 Exception 的类都必须对异常进行处理(try / throw ...
- vmvare使用桥接和NAT方式连接网络
一.背景:本着学以致用的心态,试着最小化安装Centos7.4.安装centos主要目的有两个:共享文件(samba).安装postgresql数据库 本打算使用内网(不联网)的方式安装samba和p ...