原题链接

题意:

对于给定由 n 个元素构成的数组。一个子数组的不平衡值是这个区间的最大值与最小值的差值。数组的不平衡值是它所有子数组的不平衡值的总和。求数组的不平衡值。

思路:

跟上题类似,由于子区间的数量太多,考虑每个数的贡献。
分别维护每个数作为区间最大值可以向左、向右扩展的最大区间,作为区间最小值可以向左向右扩展的最大区间。用四次单调栈维护就可以。
对于一个数,他做的贡献是区间最大值的贡献−-−区间最小值的贡献。
对于前者,假设扩展的区间为[l,r][l,r][l,r],那么贡献为(r−i+1)∗(i−l+1)(r-i+1)*(i-l+1)(r−i+1)∗(i−l+1).因为前面有(i-l)个元素,可以选择的子区间的左端点范围为[l,i][l,i][l,i],一共有(i-l+1)中方案,后面也同理,根据乘法原理就可以得到答案。
这里要注意的就是重复数字的处理,比如样例的1,4,11,4,11,4,1,当区间为[1,4,1][1,4,1][1,4,1],区间最小值的贡献是算第一个111还是第二个111呢。
在用单调栈维护的时候,我们将计算向左扩展区间的地方加上===,这样重复的数只在左区间算贡献了,算是一个小思维吧。

代码:


const int maxn=1e6+7;ll n,a[maxn],maxl[maxn],maxr[maxn],minl[maxn],minr[maxn];
stack<ll>stk;int main(){n=read;rep(i,1,n) a[i]=read;rep(i,1,n){while(!stk.empty()&&a[stk.top()]<=a[i]) stk.pop();if(!stk.empty()) maxl[i]=stk.top()+1;else maxl[i]=1;stk.push(i);}while(!stk.empty()) stk.pop();per(i,n,1){while(!stk.empty()&&a[stk.top()]<a[i]) stk.pop();if(!stk.empty()) maxr[i]=stk.top()-1;else maxr[i]=n;stk.push(i);}while(!stk.empty()) stk.pop();rep(i,1,n){while(!stk.empty()&&a[stk.top()]>=a[i]) stk.pop();if(!stk.empty()) minl[i]=stk.top()+1;else minl[i]=1;stk.push(i);}while(!stk.empty()) stk.pop();per(i,n,1){while(!stk.empty()&&a[stk.top()]>a[i]) stk.pop();if(!stk.empty()) minr[i]=stk.top()-1;else minr[i]=n;stk.push(i);}ll ans=0;//rep(i,1,n){//   cout<<maxl[i]<<"***"<<maxr[i]<<"*****"<<minl[i]<<"***"<<minr[i]<<"\n";//}rep(i,1,n){ll t1=a[i]*(maxr[i]-i+1)*(i-maxl[i]+1);ll t2=a[i]*(minr[i]-i+1)*(i-minl[i]+1);ans=ans+t1-t2;//cout<<t1<<"+++++"<<t2<<endl;}write(ans);
/**/return 0;
}

CF817D Imbalanced Array(单调栈+区间交集的处理)相关推荐

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

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

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

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

  3. CF817D Imbalanced Array(单调栈)

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

  4. CF-817D Imbalanced Array

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

  5. CF817D Imbalanced Array

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

  6. luogu CF817D Imbalanced Array【单调栈】

    本题思路 对于a[i]a[i]a[i]里的每个数, 求出此点在哪个区间是最大值和是最小值. 怎么求? 我们以当前点为中心,分左右用whilewhilewhile扩展, 如果此点最小就单调递增, 如果此 ...

  7. CF817D【Imbalanced Array】

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

  8. 洛谷【CF817D】 Imbalanced Array

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

  9. LeetCode 1130. 叶值的最小代价生成树(区间DP/单调栈贪心)

    文章目录 1. 题目 2. 解题 2.1 DP 2.2 单调栈贪心 1. 题目 给你一个正整数数组 arr,考虑所有满足以下条件的二叉树: 每个节点都有 0 个或是 2 个子节点. 数组 arr 中的 ...

最新文章

  1. 网站优化上首页不算成功稳定排名才算
  2. mysql proxy 读写分离 1
  3. 深度学习核心技术精讲100篇(三十五)-美团餐饮娱乐知识图谱——美团大脑揭秘
  4. 中的多行卡片如何居中_编程中如何让图片垂直居中?两种方案分享给大家
  5. [数据结构] - ArrayList探究
  6. android 判断webview加载成功,Android:如何检查使用webview.loadUrl时url的成功加载
  7. 3D渲染集群,听说过吗?
  8. python实现爬虫下载美女图片
  9. LNMP Keepalived Haproxy 笔记
  10. 用java的socket来发送一个类
  11. 自定义可拖拽GridView控件
  12. WordPress Exploit Scanner插件安全绕过漏洞
  13. 设计开发前的产品原型图
  14. 工业软件的特点和设计方法
  15. Python爬虫整站爬取安居客新房房源数据
  16. android 静默暗转_Android PackageInstaller 静默安装的实现
  17. matlab如何求状态方程,matlab状态方程解
  18. Linux--DNS域名解析
  19. GateWayWorker 部署
  20. EMC设计经典15问

热门文章

  1. UVA514 Rails
  2. C2AE: Class Conditioned Auto-Encoder for Open-Set RecognitionCVPR2019开放集识别论文解读
  3. 直通车优化:操作细节之转败为胜
  4. python添加图片输出框_python图像处理:怎么给图片加框?
  5. Android APP性能分析工具
  6. 商用计算机的选购配置单,装机选购指南 教你如何制作合理配置单
  7. jmeter-1-apache ant-集成测试
  8. golang的logrus取消标准输出
  9. 电力系统中-输电、配电、变电、送电各代表什么意思
  10. php倒计时跳转网页,三种实现网页定时跳转(倒计时跳转)代码