题意

给你个a序列, 求a序列的任意连续子序列中最大值-最小值的值的和.

分析

我们考虑每一个数对答案的贡献, 在一段连续的区间中, 这个数要么作为最大值, 要么作为最小值, 这样我们就设l[i]l[i]l[i]是第 iii 个数它往左最大可以到的位置, r[i]r[i]r[i]是 iii 往右最大可以到的位置, 这样答案就加上 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)

答案就是每个数作为最大值的和减去每个数作为最小值。

上代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<stack>
using namespace std;stack<int> st;long long n,a[1000001],ans,l[1000001],r[1000001];int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}a[0]=1000000000;st.push(0);for(int i=1;i<=n;i++){while(a[i]>=a[st.top()]){st.pop();}l[i]=st.top();st.push(i);}while(!st.empty()) st.pop();a[n+1]=1000000000;st.push(n+1);for(int i=n;i>=1;i--){while(a[i]>a[st.top()]){st.pop();}r[i]=st.top();st.push(i);}for(int i=1;i<=n;i++){ans+=a[i]*(r[i]-i)*(i-l[i]);}while(!st.empty()) st.pop();a[0]=0;st.push(0);for(int i=1;i<=n;i++){while(a[i]<=a[st.top()]){st.pop();}l[i]=st.top();st.push(i);}while(!st.empty()) st.pop();a[n+1]=0;st.push(n+1);for(int i=n;i>=1;i--){while(a[i]<a[st.top()]){st.pop();}r[i]=st.top();st.push(i);}for(int i=1;i<=n;i++){ans-=a[i]*(r[i]-i)*(i-l[i]);}cout<<ans;return 0;}

【CF-817D】Imbalanced Array【单调栈】相关推荐

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

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

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

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

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

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

  4. CF817D Imbalanced Array(单调栈)

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

  5. [CF 526 F] Pudding Monsters(单调栈 + 线段树)

    CF526F Pudding Monsters problem solution code problem luogu翻译 solution observation :每行每列恰好有一个棋子,所以如果 ...

  6. [线段树][单调栈] BZOJ 4527 CF 407E: K-D-Sequence

    SolutionSolution 可以把同余的串一起考虑,然后把所有数除以dd.变成公差为11的情况. 满足这样的条件 MAXL≤i≤RAi−MINL≤i≤RAi−R≤k−L MAX_{L\le i\ ...

  7. 洛谷【CF817D】 Imbalanced Array

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

  8. CF817D【Imbalanced Array】

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

  9. 【数据结构】单调栈和单调队列 详解+例题剖析

    算法:单调栈和单调队列 一.单调栈和单调队列 二.单调栈例题 1.模板题入门 2.不懂不要急,看这道题 三.单调队列例题 1.入门 2.进阶 一.单调栈和单调队列 单调栈和单调队列与普通的栈,队列不同 ...

  10. leetcode 739. 每日温度 单调栈解法和暴力法及其优化 c代码

    如题: 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高, 请在该位置用 0 来代替.例如,给定一个列表 temperature ...

最新文章

  1. pytorch shape[1]的解释
  2. 《卫报》长文解读机器的崛起:人类越来越无法掌控它们
  3. 社区运营破冰也有三大原则八项注意“了,你造吗?
  4. 排序算法-- 大总结
  5. Python学习之路:内置函数
  6. LiveVideoStackCon深圳-AI无孔不入
  7. BP神经网络相关知识
  8. 数据结构 线性链表栈
  9. java学习(16):巩固练习
  10. mysql 事务日志备份_SQL Server恢复模式与事务日志备份
  11. java计算点在圆内外_java – 在O((n s)log n中计算圆交叉点)
  12. Zend Studio 4.0.2试用手迹
  13. GeoTiff及GDAL切图(java)
  14. Linux acpi off报告ACPI bug处理方法
  15. Go基础编程:Socket编程
  16. 【转】ASP.NET Core 2.0 支付宝当面付之扫码支付
  17. 【思想总结】关于最近思想滑坡的反省
  18. 病毒之Worm.Win32.AutoRun
  19. 解决时间输出格式带 T 带 000+00:00 输出时间多了个T 返回时间格式带T
  20. 十二个“一”的文艺创作拓展:关于星座

热门文章

  1. 视频中的硬字幕、软字幕和外挂字幕,怎么分别?
  2. 问题 I: 田忌赛马
  3. usb信号滑环的工作原理及技术前景
  4. android中radiogroup作用,Android View系列---RadioGroup与RadioButton
  5. PL/SQL,经常会遇见“Could not load ……\bin\oci.dll”这个错误
  6. thinkphp5 获取sql语句
  7. 拒绝“齐刘海”,三星S9+或许才是最美全面屏
  8. 卡萨米卡Casamica:负氧离子,给您一个健康的室内环境
  9. 当你完全认清程序员这个行业,你才有走下去的勇气
  10. word不支持汉字输入--解决方案