CF817D Imbalanced Array

题目传送门

解题思路

根据一位巨佬的题解
枚举当前点在什么区间内是最小值和最大值
可以用四个单调栈
一个找当前点为区间最小值时,区间的最左端(minl)
一个找当前点为区间最小值时,区间的最右端(minr)
一个找当前点为区间最大值时,区间的最左端(maxl)
一个找当前点为区间最大值时,区间的最右端(maxr)
最后用一个乘法

a[i]*1ll*(1ll*(i-maxl[i])*(maxr[i]-i)-1ll*(i-minl[i])*(minr[i]-i));

再累加就AC了

注意:要特判

AC代码

#include<cstdio>
#include<iostream>
using namespace std;
long long n,s,tail,a[1000005],f[1000005],minl[1000005],minr[1000005],maxl[1000005],maxr[1000005];
int main()
{scanf("%lld",&n);for(int i=1;i<=n;i++)scanf("%lld",&a[i]);f[1]=0;//初值tail=1;for(int i=1;i<=n;i++)//找最小值时区间最左端if(a[i]>a[f[tail]])//特判{minl[i]=i-1;//值不一样f[++tail]=i;//进栈}else {while(a[i]<a[f[tail]]&&tail>=1)tail--;//出栈minl[i]=f[tail];f[++tail]=i;//进栈}f[1]=n+1; //初值tail=1;for(int i=n;i>=1;i--)//找最小值时区间最右端if(a[i]>a[f[tail]])//特判{minr[i]=i+1;//值不一样f[++tail]=i;//进栈}else {while(a[i]<=a[f[tail]]&&tail>=1)tail--;//出栈minr[i]=f[tail];f[++tail]=i;//进栈}a[0]=a[n+1]=2147483647;//初值f[1]=0;tail=1;for(int i=1;i<=n;i++)找最大值时区间最左端if(a[i]<a[f[tail]])//特判{maxl[i]=i-1;//值不一样f[++tail]=i;//进栈}else{while(a[i]>a[f[tail]]&&tail>=1)tail--;//出栈maxl[i]=f[tail];f[++tail]=i;//进栈}f[1]=n+1;//初值tail=1;for(int i=n;i>=1;i--)找最大值时区间最右端if(a[i]<a[f[tail]])//特判{maxr[i]=i+1;//值不一样f[++tail]=i;//进栈}else {while(a[i]>=a[f[tail]]&&tail>=1)tail--;//出栈maxr[i]=f[tail];f[++tail]=i;//进栈}for(int i=1;i<=n;i++)//1 to ns+=a[i]*1ll*(1ll*(i-maxl[i])*(maxr[i]-i)-1ll*(i-minl[i])*(minr[i]-i));//乘法和加法cout<<s;
}

谢谢

CF817D Imbalanced Array(单调栈)相关推荐

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

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

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

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

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

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

  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. 【数据结构】单调栈和单调队列 详解+例题剖析

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

最新文章

  1. mysql二进制还原表_MYSQL 二进制还原
  2. iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载
  3. linux access函数_构建一个即时消息应用(九):Conversation 页面 | Linux 中国
  4. 墨菲定律:都是温度惹的祸
  5. 洛谷P2502:[HAOI2006]旅行
  6. 2008年5月系统分析师考试上午试卷参考答案与考点解析2
  7. 音视频技术开发周刊 | 195
  8. android 如何修改百度导航诱导界面,Android 百度导航SDK
  9. HDU——1272小希的迷宫(并查集+拓扑排序)
  10. .NET:OrderBy和ThenBy
  11. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_5_BufferedWriter_字符缓冲输出流...
  12. FreeRTOS(教程非常详细)
  13. [4G5G专题-106]:部署 - LTE无线网络规划与设计概览
  14. Excel数据导入___你hold住么(二)
  15. 年轻时欠下风流情债的十大男女明星(组图)
  16. 解决:Unknown column ‘id‘ in ‘where clause‘ 问题
  17. 【YOLACT】测试自己数据集
  18. 暗组免杀php,那些强悍的PHP一句话后门
  19. 北斗校时系统(GPS授时设备)几种时间同步方法
  20. Android开发调试神器——Stetho介绍

热门文章

  1. c语言关于循环结构的心得体会,C语言学习:循环结构语句for
  2. 看我用LabVIEW写一个情人节的小礼物!!!(源码见最后链接)
  3. 871. 最低加油次数
  4. workbench如何截图_ANSYS workbench 工具箱不小心被我关掉了,打开之后下面什么都没有了,截图如下,求解释!...
  5. 机器学习入门及基本算法图解
  6. 密码加密与微服务鉴权JWT
  7. 视频怎么录制鼠标?有什么需要注意的事项?
  8. 关于数学计算机手抄报简单的,非常简单的数学手抄报
  9. PVE挂载nfs虚拟磁盘(亲测可用)
  10. at定时任务:Can't open /var/run/atd.pid to signal atd. No atd running?