题目链接:点击查看

题目大意:给出一个长度为 n 的数列 a 和数列 b ,求

题目分析:不算难的题目,对于每个 a[ i ] 求一下贡献然后维护最大值就好,具体思路就是,先找出每个 a[ i ] 左右两侧分别小于 a[ i ] 的位置,分别记为 l 和 r,再对数列 b 维护一下前缀和 sum,比较显然的就是 ( l , r ) 这段区间内,凡是跨过位置 i 的区间最小值一定是 a[ i ],然后分类讨论一下:

  1. 如果 a[ i ] > 0:在 [ l - 1 , i - 1 ] 中找到 sum 的最小值,在 [ i , r ] 中找到 sum 的最大值,贡献为 a[ i ] * ( mmax - mmin )
  2. 如果 a[ i ] < 0:在 [ l - 1 , i - 1 ] 中找到 sum 的最大值,在 [ i , r ] 中找到 sum 的最小值,贡献为 a[ i ] * ( mmin - mmax )

区间最大值可以用 st 表或者线段树来维护,现在的问题就是如何快速找到每个 a[ i ] 的 l 和 r,用单调栈 O( n ) 扫一遍显然是没问题的,但为了练习笛卡尔树,可以利用笛卡尔树的性质,O( n ) 无脑建树后,dfs 扫一遍每个节点计算贡献也是一样的

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const LL inf=0x3f3f3f3f3f3f3f3f;const int N=3e6+100;LL sum[N],ans;struct Node1
{int l,r;LL mmin,mmax;
}tree[N<<2];void pushup(int k)
{tree[k].mmax=max(tree[k<<1].mmax,tree[k<<1|1].mmax);tree[k].mmin=min(tree[k<<1].mmin,tree[k<<1|1].mmin);
}void build(int k,int l,int r)
{tree[k].l=l;tree[k].r=r;if(l==r){tree[k].mmax=tree[k].mmin=sum[l];return;}int mid=l+r>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);pushup(k);
}LL query_min(int k,int l,int r)
{if(tree[k].r<l||tree[k].l>r)return inf;if(tree[k].l>=l&&tree[k].r<=r)return tree[k].mmin;return min(query_min(k<<1,l,r),query_min(k<<1|1,l,r));
}LL query_max(int k,int l,int r)
{if(tree[k].r<l||tree[k].l>r)return -inf;if(tree[k].l>=l&&tree[k].r<=r)return tree[k].mmax;return max(query_max(k<<1,l,r),query_max(k<<1|1,l,r));
}struct Node2
{int l,r,val;
}t[N];stack<int>s;void insert(int x)
{while(s.size()&&t[s.top()].val>t[x].val)s.pop();t[x].l=t[s.top()].r;//x->lsont[s.top()].r=x;//fa->x(rson)s.push(x);
}void dfs(int k,int l,int r)
{if(t[k].val>0){LL mmin=query_min(1,l-1,k-1);LL mmax=query_max(1,k,r);ans=max(ans,t[k].val*(mmax-mmin));}else{LL mmin=query_min(1,k,r);LL mmax=query_max(1,l-1,k-1);ans=max(ans,t[k].val*(mmin-mmax));}if(t[k].l)dfs(t[k].l,l,k-1);if(t[k].r)dfs(t[k].r,k+1,r);
}void init()
{t[0].val=-0x3f3f3f3f;t[0].l=t[0].r=0;s.push(0);
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n;scanf("%d",&n);init();for(int i=1;i<=n;i++){scanf("%d",&t[i].val);insert(i);}for(int i=1;i<=n;i++){int num;scanf("%d",&num);sum[i]=sum[i-1]+num;}build(1,0,n);ans=-inf;dfs(0,1,n);printf("%lld\n",ans);return 0;
}

牛客 - sequence(笛卡尔树+线段树)相关推荐

  1. 牛客网wannafly挑战赛13-E(线段树)

    链接:https://www.nowcoder.com/acm/contest/80/E 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  2. 牛客练习赛 4 A-Laptop (线段树,思维/GTMD普通前缀和也能求)

    链接:https://ac.nowcoder.com/acm/contest/16/A?&headNav=www 来源:牛客网 题目描述 FST是一名可怜的小朋友,他很强,但是经常fst,所以 ...

  3. 牛客小白9 换个角度思考(离线+树状数组)

    title: 牛客小白9 换个角度思考(离线+树状数组) date: 2018-11-29 15:25:18 tags: [离线,树状数组] categories: ACM 题目链接 题目描述 给定一 ...

  4. 树套树-线段树套平衡树

    作用 线段树的作用是区间修改和查询,平衡树的作用是查询第k大,k的排名,前驱,后继.这两个结合起来,就变成了可以区间修改和查询第k大,k的排名,前驱,后继的数据结构:树套树-线段树套平衡树. 实现 先 ...

  5. YbtOJ#752-最优分组【笛卡尔树,线段树】

    正题 题目链接:http://www.ybtoj.com.cn/problem/752 题目大意 nnn个人,每个人有cic_ici​和did_idi​分别表示这个人所在的队伍的最少/最多人数. 然后 ...

  6. P4755-Beautiful Pair【笛卡尔树,线段树】

    正题 题目链接:https://www.luogu.com.cn/problem/P4755 题目大意 nnn个数字的一个序列,求有多少个点对i,ji,ji,j满足ai×aj≤max{ak}(k∈[l ...

  7. 线段树 ---- 线段树维护线段相加+滑动变长窗口 2021牛客多校第7场 F xay loves trees

    题目大意: 给你两个大小相同的树但是形状不一定一样 叫你选出最大的子集,满足下面两个条件 在第一颗树上是一条链 在第二颗树上任意两个点都不是祖先关系 解题思路: 首先我们现在第二颗树上面把每个点的df ...

  8. P5044-[IOI2018] meetings 会议【dp,笛卡尔树,线段树二分】

    正题 题目链接:https://www.luogu.com.cn/problem/P5044 题目大意 给出一个长度为nnn的序列hhh,定义dis(x,y)=max{hi}(x≤i≤y)dis(x, ...

  9. 牛客小白月赛62 幼稚园的树

    2022.11.25 今晚闲来无事,在zhoj群中看到管理员发布的牛客小白月赛的通知,就和舍友一起参加了. 题目描述 来源:牛客网 牛牛在幼稚园做义工,幼稚园中共有 n n n 颗树,第 1 天中午时 ...

最新文章

  1. cassandra命令
  2. 干货丨【看图识算法】这是你见过最简单的 “算法说明书”
  3. C语言课后习题(27)
  4. 文字 竖排居中_微信朋友圈文字如何设置居中居右?
  5. [c/c++]可变参数加法
  6. 随机森林原始论文_【论文笔记】韩家炜团队AutoPhrase:从大量文本库中 自动挖掘短语...
  7. paypal html5 支付,PayPal H5支付组件
  8. 软件工程电商系统数据库定义_电商数据库详细设计说明书V0.4
  9. h5 标签video和audio标签的下载按钮
  10. 算法学习笔记【1】——二分查找
  11. Oracle 各备份恢复环境中SCN的理解
  12. 机器学习模型 知乎_算法有没有价值观?知乎内容推荐算法解析
  13. 在ArcGIS上使用python(arcpy包)的入门教程
  14. 小程序 房租水电费记录管理_房租水电费每月收费表-房东必备
  15. 移动平均和全月平均的适用
  16. Win11最新KB5019980(22621.819)更新内容详解
  17. 计算机毕业设计、课程设计、实战项目之[含论文+源码等]SSM网上水果生鲜超市商城|电商系统[包运行成功]
  18. DELTA台达电源维修DPS-400GB-1A服务器电源维修
  19. 每次打开excel都是只读模式,怎么办?
  20. df -h 详解和centos 磁盘清理 /dev/vda1系统盘满了

热门文章

  1. Redis快照(Snapshot)特点
  2. 使用Docker-镜像命令练习
  3. 为什么要用Dubbo-远程通信背景
  4. Atomic Integer 原理分析-get方法
  5. Redis存储(实现)原理
  6. 基于XML的AOP实现事务控制
  7. Redisson分布式锁实战-2:解决wait_time之坑
  8. Dubbo + Zookeeper入门初探
  9. php将数组中元素打乱顺序,PHP公开课|学会随机打乱数组元素顺序的函数,你的PHP会学的更好...
  10. 210213阶段三回顾