本题思路

对于a[i]a[i]a[i]里的每个数,
求出此点在哪个区间是最大值和是最小值。
怎么求?
我们以当前点为中心,分左右用whilewhilewhile扩展,
如果此点最小就单调递增
如果此点最大就单调递减
直到不能求为止,求完后得到[l....i....r][l....i....r][l....i....r],
最后统计答案(乘法原理)
最大:ans+=a[i]×(i−L[i])×(R[i]−i).最大:ans += a[i] ×(i - L[i])×(R[i] - i ). 最大:ans+=a[i]×(i−L[i])×(R[i]−i).
最小:ans−=a[i]×(i−L[i])×(R[i]−i).最小:ans -= a[i] ×(i - L[i])×(R[i] - i ). 最小:ans−=a[i]×(i−L[i])×(R[i]−i).

注意

  • 左右区间可能会有重复数字,所以扩展时的判断条件有不同(为了判重)
while(a[z[tail]]<=a[i])  //允许相同数进来
while(a[z[tail]]<a[i])   //不允许相同数进来(判重)
  • 每次处理前要初始化(注意要放墙,不同情况的墙有所不同)

  • 统计ansansans要统计两次,一次最大一次最小


代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
long long maxl[100010],maxr[100010];
long long minl[100010],minr[100010];
long long a[100010],z[100010];
long long n,tail,ans;
int main()
{cin>>n;for(long long i=1; i<=n; i++)scanf("%lld",&a[i]);a[0]=2147483647;tail=1;z[1]=0;for(long long i=1; i<=n; i++)     //以此数为最大向左扩展{while(a[z[tail]]<=a[i])tail--;maxl[i]=z[tail];z[++tail]=i;}a[n+1]=2147483647;tail=1;z[1]=n+1;for(long long i=n; i>=1; i--)     //以此数为最大向右扩展{while(a[z[tail]]<a[i])tail--;maxr[i]=z[tail];z[++tail]=i;}a[0]=-2147483647;tail=1;z[1]=0;for(long long i=1; i<=n; i++)ans+=a[i]*(i-maxl[i])*(maxr[i]-i);for(long long i=1; i<=n; i++)     //以此数为最小向左扩展{while(a[z[tail]]>=a[i])tail--;minl[i]=z[tail];z[++tail]=i;}a[n+1]=-2147483647;tail=1;z[1]=n+1;for(long long i=n; i>=1; i--)     //以此数为最小向右扩展{while(a[z[tail]]>a[i])tail--;minr[i]=z[tail];z[++tail]=i;}for(long long i=1; i<=n; i++)ans-=a[i]*(i-minl[i])*(minr[i]-i);printf("%lld",ans);return 0;
}

luogu CF817D Imbalanced Array【单调栈】相关推荐

  1. CF817D Imbalanced Array(单调栈+区间交集的处理)

    原题链接 题意: 对于给定由 n 个元素构成的数组.一个子数组的不平衡值是这个区间的最大值与最小值的差值.数组的不平衡值是它所有子数组的不平衡值的总和.求数组的不平衡值. 思路: 跟上题类似,由于子区 ...

  2. CodeForces - 817D Imbalanced Array(单调栈)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,求出所有子区间的最大值与最小值之差的和 题目分析:不难看出最大值和最小值之差的和可以拆开,拆成最大值之和与最小值之和之差,现在问题转换为如 ...

  3. [cf] Codeforces 817D Imbalanced Array 单调栈

    前言 传送门 : 优质题解传送门 : wls题目传送门 : 思路 使用单调栈维护当前节点 是最大值的时候的区间 以及当前节点是最小值时候的区间 然后统计计数即可 而求区间最大最小值可以使用单调栈处理 ...

  4. CF817D Imbalanced Array(单调栈)

    CF817D Imbalanced Array 题目传送门 解题思路 根据一位巨佬的题解 枚举当前点在什么区间内是最小值和最大值 可以用四个单调栈 一个找当前点为区间最小值时,区间的最左端(minl) ...

  5. CF-817D Imbalanced Array

    CF-817D Imbalanced Array 题意 对于给定由 n 个元素构成的数组.一个子数组的不平衡值是这个区间的最大值与最小值的差值.数组的不平衡值是它所有子数组的不平衡值的总和. 以下是数 ...

  6. CF817D Imbalanced Array

    题目 题目 思路 先4个单调栈求出每个位置能够贡献的区间然后一波统计直接AC. code: #include<iostream> #include<cstdio> #inclu ...

  7. CF817D【Imbalanced Array】

    Imbalanced Array 题目 CF817D 解析 学单调栈时偶然看到了这一题,就写掉了 想一下暴力,O(n3),n<=106,神威太湖之光都跑不过去 加个ST表,O(n2),天河二号跑 ...

  8. 洛谷【CF817D】 Imbalanced Array

    Imbalanced Array 题目描述 对于给定由 n 个元素构成的数组.一个子数组的不平衡值是这个区间的最大值与最小值的差值.数组的不平衡值是它所有子数组的不平衡值的总和. 以下是数组[1,4, ...

  9. 【单调栈】【数据结构】向右看齐 Look Up(luogu P2947)

    思路: 我们可以用单调栈来做这一道题,我们可以用倒序循环,然后用ans来装答案,因为ans[n]=0,所以i=n-1,然后里面用一个sum来记录第一个数右边的,再开个while循环来比较左右的数,然后 ...

最新文章

  1. UA MATH567 高维统计I 概率不等式10 Bernstein不等式
  2. JS使png背景图片透明
  3. python居中填充_Python代码中 如何将字符串填充为指定长度并保持原字符串居中呢?...
  4. Java面向对象编程(基础部分)
  5. 第十七期:2019人工智能统计数字和一些重要事实
  6. XShell 将Linux文件上传、下载到Windows下(rz上传、sz下载)
  7. C 温故知新 之 指针:函数指针变量、指针型函数
  8. git比较两个分支的文件的差异
  9. 全攻略:大病医疗专项附加扣除,一文集全了
  10. 工作所思--IT新人
  11. CISCO交换机上实现MAC和端口、IP和端口、IP和MAC的绑定
  12. day02数据类型方法整理
  13. 几种常用的网络传输协议
  14. linux ora -03113,ORA-03113解决方法
  15. 遗传算法bp神经网络原理,bp神经网络 遗传算法
  16. 实战一:给定一段音频,请提取12维MFCC特征,阅读代码预加重、分帧、加窗部分,完善作业代码中fbank和mfcc部分,并给出最终的Fbank和MFCC特征,用默认的配置参数,无需进行修改
  17. Oracle9i的1467错误
  18. 高阶篇:4.1.2.2)产品部件级别的QFDII
  19. 试图加载不正确的程序。(异常来自HRESULT:0x8007000B)的处理方式
  20. An中的共轭类的个数

热门文章

  1. 土木工程 “提桶跑路“,零基础转行Python,成功实现月入过万的学习之路!
  2. maven-assembly-plugin的使用
  3. 快品牌,大品牌,快手新市井电商2022的重点发展对象
  4. python汉诺塔_python 汉诺塔
  5. Java中的锁-浅析
  6. TSP问题(dp实现)
  7. MVP in Android
  8. 数据库同步软件-多种数据库主从复制
  9. 在一个图片上写字并保存
  10. WSL: Could not resolve hostname Temporary failure(无法解析域名)