sequence(线段树+单调栈) (2019牛客暑期多校训练营(第四场))
示例:
输入:
3
1 -1 1
1 2 3
输出:
3
题意:求最大的(a区间最小值*b区间和)
线段树做法:用单调栈求出每个数两边比b数组大的左右边界,然后用线段树求出每段区间的和sum、最小前缀lsum、最小后缀rsum,枚举每个数a[i],设以a[i]为最小值的区间为[l,r]
若a[i]>0,则最优解就是a[i]*(b数组[l,r]的区间和),因为a数组[l,r]上的数都比a[i]大。
若a[i]<0,则最优解是a[i]*(b数组[l,i-1]上的最小后缀+b[i]+b数组[i+1,r]上的最小前缀),在线段树上查询即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e6+,inf=0x3f3f3f3f;
ll n,a[N],b[N],ls[N],rs[N],sta[N],tp;
ll sum[N],lsum[N],rsum[N];
void ttbuild() {
a[n+]=~inf,sta[tp=]=n+;
for(ll i=; i<=n; ++i) {
for(; a[i]<a[sta[tp]]; --tp);
ls[i]=rs[sta[tp]],rs[sta[tp]]=i,sta[++tp]=i;
}
}
void dfs(ll u) {
if(!u)return;
dfs(ls[u]),dfs(rs[u]);
sum[u]=sum[ls[u]]+b[u]+sum[rs[u]];
lsum[u]=min(lsum[ls[u]],sum[ls[u]]+b[u]+lsum[rs[u]]);
rsum[u]=min(rsum[rs[u]],sum[rs[u]]+b[u]+rsum[ls[u]]);
}
int main() {
scanf("%lld",&n);
for(ll i=; i<=n; ++i)scanf("%lld",&a[i]);
for(ll i=; i<=n; ++i)scanf("%lld",&b[i]);
ttbuild(),dfs(rs[n+]);
ll ans=;
for(ll i=; i<=n; ++i) {
if(a[i]>)ans=max(ans,a[i]*sum[i]);
else if(a[i]<)ans=max(ans,a[i]*(rsum[ls[i]]+b[i]+lsum[rs[i]]));
}
printf("%lld\n",ans);
return ;
}
sequence(线段树+单调栈) (2019牛客暑期多校训练营(第四场))的更多相关文章
- Points Division(线段树+DP)2019牛客暑期多校训练营(第一场)
题意:https://ac.nowcoder.com/acm/contest/881/I 给你n个平面上的点,每个点有a.b两个权值,现在让你划分成两个区域(要求所有A集合里的点不能在任何B集合里的点 ...
- 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...
- 2019牛客暑期多校训练营(第一场)A - Equivalent Prefixes(单调栈)
题意 给定两个$n$个元素的数组$a,b$,它们的前$p$个元素构成的数组是"等价"的,求$p$的最大值."等价"的意思是在其任意一个子区间内的最小值相同. $ ...
- 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...
- 2019牛客暑期多校训练营(第一场)-A (单调栈)
题目链接:https://ac.nowcoder.com/acm/contest/881/A 题意:给定两个长度均为n的数组a和b,求最大的p使得(a1,ap)和(b1,bp)等价,等价的定义为其任意 ...
- DP+线段树维护矩阵(2019牛客暑期多校训练营(第二场))--MAZE
题意:https://ac.nowcoder.com/acm/contest/882/E 给你01矩阵,有两种操作:1是把一个位置0变1.1变0,2是问你从第一行i开始,到最后一行j有几种走法.你只能 ...
- 2019牛客暑期多校训练营(第一场)I dp+线段树
题意 给出n个点,每个点有a,b两个属性,让你从左下角到右上角划一条线,线的左边每个点的贡献是\(a_i\),线的右边每个点的贡献是\(b_i\),使得两部分的总和最大. 分析 找一条折线将点分割开, ...
- 2019牛客暑期多校训练营(第二场)E 线段树维护dp转移矩阵
题意 给一个\(n\times m\)的01矩阵,1代表有墙,否则没有,每一步可以从\(b[i][j]\)走到\(b[i+1][j]\),\(b[i][j-1]\),\(b[i][j+1]\),有两种 ...
- 2019牛客暑期多校训练营(第二场)-H Second Large Rectangle(次大子矩阵,降维,直方图+单调栈)
题目链接:https://ac.nowcoder.com/acm/contest/882/H 题目:给n×m的由01组成的矩阵,求次大全1子矩阵的大小. 思路:第一步还是降维操作,用a[i][j]记录 ...
- 2019牛客暑期多校训练营(第一场) - A - Equivalent Prefixes - 单调栈
A - Equivalent Prefixes - 单调栈 题意:给定两个n个元素的数组a,b,它们的前p个元素构成的数组是"等价"的,求p的最大值."等价"的 ...
随机推荐
- mac 修改mysql root密码
01-在系统偏好设置中停止mysql服务 或者使用指令 sudo /usr/local/mysql/support-files/mysql.server stop 02-输入指令: cd /usr/l ...
- PostgreSQL学习笔记(九) 用户、角色、权限管理
PostgreSQL是一个多用户数据库,可以为不同用户指定允许的权限. 角色PostgreSQL使用角色的概念管理数据库访问权限. 根据角色自身的设置不同,一个角色可以看做是一个数据库用户,或者一组数 ...
- P2P模式
P2P模式 P2P模式包含三个角色:消息队列(Queue),发送者(Sender),接收者(Receiver).每个消息都被发送到一个特定的队列,接收者从队列中获取消息.队列保留着消息,直到他们被消费 ...
- 动化安装SQL Server+SP就那么简单
随着业务.企业规模的日益壮大,DB的数量也在不断增多,配置一台新增DB,从服务器的参数配置,磁盘阵列规划,DB安装部署,DB参数调优等等一列步骤下来,手工操作的效率变得越来越低,因为我负责的数据库近些 ...
- 【Java.Regex】使用正则表达式查找一个Java类中的成员函数
代码: import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; imp ...
- DNS 预读取功能 链接预取
https://developer.mozilla.org/zh-CN/docs/Controlling_DNS_prefetching DNS 请求需要的带宽非常小,但是延迟却有点高,这一点在手机网 ...
- List和Array相互转换
List<String> list = new ArrayList<String>(); list.add("1"); list.add("2&q ...
- hyper-v启动虚拟机时提示“The application encountered an error while attempting to change the state of the machine ‘虚拟机名称'”如何处理?
1. 找出发生这一问题的事件代号 1.1 在开始菜单中搜索程序Event Viewer并点击进入 1.2 点击路径如下: “Applications and Services Logs > Mi ...
- Xamarin图表开发基础教程(2)OxyPlot框架
Xamarin图表开发基础教程(2)OxyPlot框架 OxyPlot图表设计 OxyPlot是一个基于.Net的跨平台图表库.该图表库也支持Xamarin应用开发.该组件支持多种类型的图表.本章将主 ...
- ABAP语法篇1 DATA新用法
@DATA 按取数指定的字段定义内表结 定义工作区: SELECT SINGLE * FROM lfbk INTO @DATA(is_lfbk) ...