CF817D Imbalanced Array(单调栈)
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(单调栈)相关推荐
- CF817D Imbalanced Array(单调栈+区间交集的处理)
原题链接 题意: 对于给定由 n 个元素构成的数组.一个子数组的不平衡值是这个区间的最大值与最小值的差值.数组的不平衡值是它所有子数组的不平衡值的总和.求数组的不平衡值. 思路: 跟上题类似,由于子区 ...
- CodeForces - 817D Imbalanced Array(单调栈)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,求出所有子区间的最大值与最小值之差的和 题目分析:不难看出最大值和最小值之差的和可以拆开,拆成最大值之和与最小值之和之差,现在问题转换为如 ...
- [cf] Codeforces 817D Imbalanced Array 单调栈
前言 传送门 : 优质题解传送门 : wls题目传送门 : 思路 使用单调栈维护当前节点 是最大值的时候的区间 以及当前节点是最小值时候的区间 然后统计计数即可 而求区间最大最小值可以使用单调栈处理 ...
- CF-817D Imbalanced Array
CF-817D Imbalanced Array 题意 对于给定由 n 个元素构成的数组.一个子数组的不平衡值是这个区间的最大值与最小值的差值.数组的不平衡值是它所有子数组的不平衡值的总和. 以下是数 ...
- CF817D Imbalanced Array
题目 题目 思路 先4个单调栈求出每个位置能够贡献的区间然后一波统计直接AC. code: #include<iostream> #include<cstdio> #inclu ...
- luogu CF817D Imbalanced Array【单调栈】
本题思路 对于a[i]a[i]a[i]里的每个数, 求出此点在哪个区间是最大值和是最小值. 怎么求? 我们以当前点为中心,分左右用whilewhilewhile扩展, 如果此点最小就单调递增, 如果此 ...
- CF817D【Imbalanced Array】
Imbalanced Array 题目 CF817D 解析 学单调栈时偶然看到了这一题,就写掉了 想一下暴力,O(n3),n<=106,神威太湖之光都跑不过去 加个ST表,O(n2),天河二号跑 ...
- 洛谷【CF817D】 Imbalanced Array
Imbalanced Array 题目描述 对于给定由 n 个元素构成的数组.一个子数组的不平衡值是这个区间的最大值与最小值的差值.数组的不平衡值是它所有子数组的不平衡值的总和. 以下是数组[1,4, ...
- 【数据结构】单调栈和单调队列 详解+例题剖析
算法:单调栈和单调队列 一.单调栈和单调队列 二.单调栈例题 1.模板题入门 2.不懂不要急,看这道题 三.单调队列例题 1.入门 2.进阶 一.单调栈和单调队列 单调栈和单调队列与普通的栈,队列不同 ...
最新文章
- mysql二进制还原表_MYSQL 二进制还原
- iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载
- linux access函数_构建一个即时消息应用(九):Conversation 页面 | Linux 中国
- 墨菲定律:都是温度惹的祸
- 洛谷P2502:[HAOI2006]旅行
- 2008年5月系统分析师考试上午试卷参考答案与考点解析2
- 音视频技术开发周刊 | 195
- android 如何修改百度导航诱导界面,Android 百度导航SDK
- HDU——1272小希的迷宫(并查集+拓扑排序)
- .NET:OrderBy和ThenBy
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_5_BufferedWriter_字符缓冲输出流...
- FreeRTOS(教程非常详细)
- [4G5G专题-106]:部署 - LTE无线网络规划与设计概览
- Excel数据导入___你hold住么(二)
- 年轻时欠下风流情债的十大男女明星(组图)
- 解决:Unknown column ‘id‘ in ‘where clause‘ 问题
- 【YOLACT】测试自己数据集
- 暗组免杀php,那些强悍的PHP一句话后门
- 北斗校时系统(GPS授时设备)几种时间同步方法
- Android开发调试神器——Stetho介绍
热门文章
- c语言关于循环结构的心得体会,C语言学习:循环结构语句for
- 看我用LabVIEW写一个情人节的小礼物!!!(源码见最后链接)
- 871. 最低加油次数
- workbench如何截图_ANSYS workbench 工具箱不小心被我关掉了,打开之后下面什么都没有了,截图如下,求解释!...
- 机器学习入门及基本算法图解
- 密码加密与微服务鉴权JWT
- 视频怎么录制鼠标?有什么需要注意的事项?
- 关于数学计算机手抄报简单的,非常简单的数学手抄报
- PVE挂载nfs虚拟磁盘(亲测可用)
- at定时任务:Can't open /var/run/atd.pid to signal atd. No atd running?