【CF-817D】Imbalanced Array【单调栈】
题意
给你个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【单调栈】相关推荐
- [cf] Codeforces 817D Imbalanced Array 单调栈
前言 传送门 : 优质题解传送门 : wls题目传送门 : 思路 使用单调栈维护当前节点 是最大值的时候的区间 以及当前节点是最小值时候的区间 然后统计计数即可 而求区间最大最小值可以使用单调栈处理 ...
- CodeForces - 817D Imbalanced Array(单调栈)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,求出所有子区间的最大值与最小值之差的和 题目分析:不难看出最大值和最小值之差的和可以拆开,拆成最大值之和与最小值之和之差,现在问题转换为如 ...
- CF817D Imbalanced Array(单调栈+区间交集的处理)
原题链接 题意: 对于给定由 n 个元素构成的数组.一个子数组的不平衡值是这个区间的最大值与最小值的差值.数组的不平衡值是它所有子数组的不平衡值的总和.求数组的不平衡值. 思路: 跟上题类似,由于子区 ...
- CF817D Imbalanced Array(单调栈)
CF817D Imbalanced Array 题目传送门 解题思路 根据一位巨佬的题解 枚举当前点在什么区间内是最小值和最大值 可以用四个单调栈 一个找当前点为区间最小值时,区间的最左端(minl) ...
- [CF 526 F] Pudding Monsters(单调栈 + 线段树)
CF526F Pudding Monsters problem solution code problem luogu翻译 solution observation :每行每列恰好有一个棋子,所以如果 ...
- [线段树][单调栈] BZOJ 4527 CF 407E: K-D-Sequence
SolutionSolution 可以把同余的串一起考虑,然后把所有数除以dd.变成公差为11的情况. 满足这样的条件 MAXL≤i≤RAi−MINL≤i≤RAi−R≤k−L MAX_{L\le i\ ...
- 洛谷【CF817D】 Imbalanced Array
Imbalanced Array 题目描述 对于给定由 n 个元素构成的数组.一个子数组的不平衡值是这个区间的最大值与最小值的差值.数组的不平衡值是它所有子数组的不平衡值的总和. 以下是数组[1,4, ...
- CF817D【Imbalanced Array】
Imbalanced Array 题目 CF817D 解析 学单调栈时偶然看到了这一题,就写掉了 想一下暴力,O(n3),n<=106,神威太湖之光都跑不过去 加个ST表,O(n2),天河二号跑 ...
- 【数据结构】单调栈和单调队列 详解+例题剖析
算法:单调栈和单调队列 一.单调栈和单调队列 二.单调栈例题 1.模板题入门 2.不懂不要急,看这道题 三.单调队列例题 1.入门 2.进阶 一.单调栈和单调队列 单调栈和单调队列与普通的栈,队列不同 ...
- leetcode 739. 每日温度 单调栈解法和暴力法及其优化 c代码
如题: 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高, 请在该位置用 0 来代替.例如,给定一个列表 temperature ...
最新文章
- pytorch shape[1]的解释
- 《卫报》长文解读机器的崛起:人类越来越无法掌控它们
- 社区运营破冰也有三大原则八项注意“了,你造吗?
- 排序算法-- 大总结
- Python学习之路:内置函数
- LiveVideoStackCon深圳-AI无孔不入
- BP神经网络相关知识
- 数据结构 线性链表栈
- java学习(16):巩固练习
- mysql 事务日志备份_SQL Server恢复模式与事务日志备份
- java计算点在圆内外_java – 在O((n s)log n中计算圆交叉点)
- Zend Studio 4.0.2试用手迹
- GeoTiff及GDAL切图(java)
- Linux acpi off报告ACPI bug处理方法
- Go基础编程:Socket编程
- 【转】ASP.NET Core 2.0 支付宝当面付之扫码支付
- 【思想总结】关于最近思想滑坡的反省
- 病毒之Worm.Win32.AutoRun
- 解决时间输出格式带 T 带 000+00:00 输出时间多了个T 返回时间格式带T
- 十二个“一”的文艺创作拓展:关于星座
热门文章
- 视频中的硬字幕、软字幕和外挂字幕,怎么分别?
- 问题 I: 田忌赛马
- usb信号滑环的工作原理及技术前景
- android中radiogroup作用,Android View系列---RadioGroup与RadioButton
- PL/SQL,经常会遇见“Could not load ……\bin\oci.dll”这个错误
- thinkphp5 获取sql语句
- 拒绝“齐刘海”,三星S9+或许才是最美全面屏
- 卡萨米卡Casamica:负氧离子,给您一个健康的室内环境
- 当你完全认清程序员这个行业,你才有走下去的勇气
- word不支持汉字输入--解决方案