链接:https://ac.nowcoder.com/acm/problem/20806
来源:牛客网

题目描述

给出长度为n的序列a,其中第i个元素为a[i]
区间[l,r]的价值为:

要求计算:

输入描述:

第一行输入数据组数T
对于每组数据,第一行为一个整数n,表示序列长度
接下来一行有n个数,表示序列内的元素

输出描述:

对于每组数据,输出一个整数表示答案

示例1

输入

3
3
4 2 3
5
1 8 4 3 9
20
2 8 15 1 10 5 19 19 3 5 6 6 2 8 2 12 16 3 8 17

输出

5
57
2712

说明

对于一组测试数据的解释:
区间[1, 2]的贡献为:4 - 2 = 2
区间[1, 3]的贡献为:4 - 2 = 2
区间[2, 3]的贡献为:3 - 2 = 1
2 + 1 + 2 = 5.

备注:

T<=20,n<=1e5,a[i]<=1e5

思路:

问题转化为:

首先要发现题目式子里面的区间长度至少为2利用单调栈求出每个数:
1. 作为最大值的左右拓展范围 l[i],r[i]
a[i]有贡献的区间有三种情况:1. 左端点为l[i]到i-1 任意一点,右端点为i2. 左端点为i,右端点为i+1 到r[i]任意一点3. 左端点为l[i]到 i-1 任意一点, 右端点为i+1 到r[i]任意一点总区间数 num=(r[i]-i+1-1)+(i-l[i]+1-1)+(r[i]-i+1-1)*(i-l[i]+1-1);答案累加a[i]*num;2. 作为最小值的左右拓展范围
最小值同上,减去就行了还有一个坑点就是如果数组中相邻元素重复的情况会导致某些数值重复计算,为了防止重复,
求左右拓展范围的时候第一遍扫不能带等号,第二遍扫带等号(或者第一遍带等号,第二遍不带)

code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
using namespace std;
#define int long long
const int inf=1e9;
const int maxm=1e5+5;
int a[maxm];
int l[maxm],r[maxm];
stack<int>stk;
int ans;
int n;
void getma(){//求a[i]为最大值的拓展范围a[0]=a[n+1]=inf;//保证全部元素出栈while(!stk.empty())stk.pop();for(int i=1;i<=n+1;i++){//右while(!stk.empty()&&a[stk.top()]<a[i]){r[stk.top()]=i-1;stk.pop();}stk.push(i);}while(!stk.empty())stk.pop();for(int i=n;i>=0;i--){//左while(!stk.empty()&&a[stk.top()]<=a[i]){l[stk.top()]=i+1;stk.pop();}stk.push(i);}for(int i=1;i<=n;i++){int temp=(r[i]-i+1-1)+(i-l[i]+1-1)+(r[i]-i+1-1)*(i-l[i]+1-1);ans+=temp*a[i];}
}
void getmi(){//求a[i]为最小值的拓展范围a[0]=a[n+1]=-1;//保证全部元素出栈while(!stk.empty())stk.pop();for(int i=1;i<=n+1;i++){//右while(!stk.empty()&&a[stk.top()]>a[i]){r[stk.top()]=i-1;stk.pop();}stk.push(i);}while(!stk.empty())stk.pop();for(int i=n;i>=0;i--){//左while(!stk.empty()&&a[stk.top()]>=a[i]){l[stk.top()]=i+1;stk.pop();}stk.push(i);}for(int i=1;i<=n;i++){int temp=(r[i]-i+1-1)+(i-l[i]+1-1)+(r[i]-i+1-1)*(i-l[i]+1-1);ans-=temp*a[i];}
}
signed main(){int T;cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}ans=0;getma();getmi();cout<<ans<<endl;}return 0;
}
//https://ac.nowcoder.com/acm/problem/20806

nowcoder 区区区间间间 (单调栈)相关推荐

  1. 联想杯 - Gentle Jena(单调栈)

    Problem G. Gentle Jena Input file: Standard Input Time limit: 2 seconds Output file: Standard Output ...

  2. [BZOJ 2957]楼房重建(THU2013集训)(线段树维护单调栈)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2957 分析: 根据题意,就是比较斜率大小 只看一段区间的话,那么这段区间能看见的楼房数量就是这 ...

  3. 线段树动态开点区间加区间求和

    线段树动态开点区间加区间求和 题目来源: 陕西师范大学第七届程序设计竞赛网络同步赛 H. 万恶的柯怡 思想: 保证叶子节点被完整的覆盖,需要开节点,就把左右儿子都开出来,其余和普通线段树一样. tip ...

  4. LeetCode 1130. 叶值的最小代价生成树(区间DP/单调栈贪心)

    文章目录 1. 题目 2. 解题 2.1 DP 2.2 单调栈贪心 1. 题目 给你一个正整数数组 arr,考虑所有满足以下条件的二叉树: 每个节点都有 0 个或是 2 个子节点. 数组 arr 中的 ...

  5. 【BZOJ3956】Count,单调栈+ST表维护区间最大值

    Time:2016.08.11 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: TA爷眼中的水题 首先有个特别的结论 总共的点对数不会超过2n 因为对于元素i来说,如果只考虑与比它高 ...

  6. 扶桑号战列舰 (单调栈+线段树区间更新懒惰标记 or 栈)

    传送门 •题目描述 题目描述 众所周知,一战过后,在世界列强建造超无畏级战列舰的竞争之中,旧日本海军根据"个舰优越主义",建造了扶桑级战列舰,完工时为当时世界上武装最为强大的舰只. ...

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

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

  8. leetcode 435. Non-overlapping Intervals | 435. 无重叠区间(单调栈)

    题目 https://leetcode.com/problems/non-overlapping-intervals/ 题解 我一开始是没有 get 到这道题的精髓的.只是在想,用贪心法,当两个 (a ...

  9. 【思维题 单调栈】loj#2430. 「POI2014」沙拉餐厅 Salad Bar

    t老师的做法好神-- 题目描述 桌面上有 n 个水果,分别是苹果和橘子.Bytea需要从水果中选择连续的一个区间,并从左到右或从右到左拿水果,且过程中橘子的数量必须始终不小于苹果的数量.求最长的区间大 ...

最新文章

  1. [19/04/02-星期二] IO技术_字符流分类总结(含字符转换流InputStreamReader/ OutputStreamWriter,实现字节转字符)...
  2. mysql 存储过程月单拆天单_为部门整理的mysql_db使用军规
  3. jQuery使用总结 - Core jQuery Selectors 选择器一2/4
  4. S5PC100基于I2C子系统的lm75驱动流程图
  5. 我的2020(年终总结)
  6. android listview 异步加载图片并防止错位
  7. java 对象初始化过程_Java——对象初始化顺序使用详解
  8. CentOS 7下载安装MySQL 5.7以及连接虚拟机CentOS 7数据库教程
  9. eclipse git拉取失败_收藏!工作中Git使用实践和常用命令流程合集
  10. 学创客机器人编程材料费贵吗_创客机器人课程容易学习吗
  11. 如何高效的利用谷歌学术搜索文献
  12. 电商项目需求分析---七月实习总结
  13. linux 检测u盘 好坏,u盘质量检测最佳方法,u盘质量好坏检测方法
  14. 基于Pytorch的上市公司财务预警分析
  15. 是否真的输在起跑线上?
  16. 207最新android书籍,《最强Android书 架构大剖析》PDF(高清版)
  17. VIA 威盛VL162新款switch数据切换芯片。方案设计
  18. 前10节的理解和总结
  19. 秃头大牛一文竟然就把SpringCloudStream(SCS)给讲明白了?
  20. android获取视频头一帧,music信息

热门文章

  1. sql-labs 闯关 21~25
  2. SD/MMC/SDIO 驱动分析
  3. 可视化智能停车系统解决方案
  4. 九州云入选“2022私有云企业30强”
  5. 1+X 云计算运维与开发(中级)案例实战——使用 Mycat 构建读写分离的数据库集群
  6. 如何在 XAMPP 中使用 不同的 PHP 版本
  7. Java为枚举类创建成员变量_Java学习——枚举类
  8. matlab1信号的单边z变换:,信号与系统 第4版 [徐亚宁] 2016年版
  9. XIAOFOU药房管理系统需求分析文档
  10. 【商城应用】菜单权限设计