luogu CF817D Imbalanced Array【单调栈】
本题思路
对于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【单调栈】相关推荐
- CF817D Imbalanced Array(单调栈+区间交集的处理)
原题链接 题意: 对于给定由 n 个元素构成的数组.一个子数组的不平衡值是这个区间的最大值与最小值的差值.数组的不平衡值是它所有子数组的不平衡值的总和.求数组的不平衡值. 思路: 跟上题类似,由于子区 ...
- CodeForces - 817D Imbalanced Array(单调栈)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,求出所有子区间的最大值与最小值之差的和 题目分析:不难看出最大值和最小值之差的和可以拆开,拆成最大值之和与最小值之和之差,现在问题转换为如 ...
- [cf] Codeforces 817D Imbalanced Array 单调栈
前言 传送门 : 优质题解传送门 : wls题目传送门 : 思路 使用单调栈维护当前节点 是最大值的时候的区间 以及当前节点是最小值时候的区间 然后统计计数即可 而求区间最大最小值可以使用单调栈处理 ...
- CF817D Imbalanced Array(单调栈)
CF817D Imbalanced Array 题目传送门 解题思路 根据一位巨佬的题解 枚举当前点在什么区间内是最小值和最大值 可以用四个单调栈 一个找当前点为区间最小值时,区间的最左端(minl) ...
- CF-817D Imbalanced Array
CF-817D Imbalanced Array 题意 对于给定由 n 个元素构成的数组.一个子数组的不平衡值是这个区间的最大值与最小值的差值.数组的不平衡值是它所有子数组的不平衡值的总和. 以下是数 ...
- CF817D Imbalanced Array
题目 题目 思路 先4个单调栈求出每个位置能够贡献的区间然后一波统计直接AC. code: #include<iostream> #include<cstdio> #inclu ...
- CF817D【Imbalanced Array】
Imbalanced Array 题目 CF817D 解析 学单调栈时偶然看到了这一题,就写掉了 想一下暴力,O(n3),n<=106,神威太湖之光都跑不过去 加个ST表,O(n2),天河二号跑 ...
- 洛谷【CF817D】 Imbalanced Array
Imbalanced Array 题目描述 对于给定由 n 个元素构成的数组.一个子数组的不平衡值是这个区间的最大值与最小值的差值.数组的不平衡值是它所有子数组的不平衡值的总和. 以下是数组[1,4, ...
- 【单调栈】【数据结构】向右看齐 Look Up(luogu P2947)
思路: 我们可以用单调栈来做这一道题,我们可以用倒序循环,然后用ans来装答案,因为ans[n]=0,所以i=n-1,然后里面用一个sum来记录第一个数右边的,再开个while循环来比较左右的数,然后 ...
最新文章
- UA MATH567 高维统计I 概率不等式10 Bernstein不等式
- JS使png背景图片透明
- python居中填充_Python代码中 如何将字符串填充为指定长度并保持原字符串居中呢?...
- Java面向对象编程(基础部分)
- 第十七期:2019人工智能统计数字和一些重要事实
- XShell 将Linux文件上传、下载到Windows下(rz上传、sz下载)
- C 温故知新 之 指针:函数指针变量、指针型函数
- git比较两个分支的文件的差异
- 全攻略:大病医疗专项附加扣除,一文集全了
- 工作所思--IT新人
- CISCO交换机上实现MAC和端口、IP和端口、IP和MAC的绑定
- day02数据类型方法整理
- 几种常用的网络传输协议
- linux ora -03113,ORA-03113解决方法
- 遗传算法bp神经网络原理,bp神经网络 遗传算法
- 实战一:给定一段音频,请提取12维MFCC特征,阅读代码预加重、分帧、加窗部分,完善作业代码中fbank和mfcc部分,并给出最终的Fbank和MFCC特征,用默认的配置参数,无需进行修改
- Oracle9i的1467错误
- 高阶篇:4.1.2.2)产品部件级别的QFDII
- 试图加载不正确的程序。(异常来自HRESULT:0x8007000B)的处理方式
- An中的共轭类的个数