牛客网 223C 区区区间间间(单调栈)
题目链接:区区区间间间
题意:给出长度为n的数字序列ai,定义区间(l,r)的价值为,
请你计算出。
题解:单调栈求ai左边和右边第一个比它小的位置,需要减去ai的个数为$(R_i-i+1)*(i-L_i+1)-1$。同理再用单调栈求ai左边和右边第一个比它大的位置,加上需要加上的ai个数即可。
解释1:需要减去的ai个数为$(R_i-i+1)*(i-L_i+1)-1$。
举个例子:1 2 3 4 5,求必须包含3的区间个数,左边有3种选择:1 2;2;不选;,右边也有三种选择:4 5;4;不选;但是题目中要求区间长度至少为2,所以两边都不选的情况不能计算在内。
解释2:为什么单调栈中一个a[i]<=a[st.top()],另一个是a[i]<a[st.top()](>=和>也同理)。
举个例子:5 6 5。这种情况很明显只有三个区间[5 6],[5 6 5],[6 5],即减去15。
但是如果直接用<=,那么每个位置对应的区间(li,ri)分别为[1,3],[2,2],[1,3]。减去20。可以发现[1,3]区间被减了两次,所以需要保证相等的时候一端扩展,避免重复计算。
stack:
#include <stack>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int N=1e5+;
typedef long long ll;
stack <int> st;
ll l[N],r[N],a[N]; int main(){
int t;
scanf("%d",&t); while(t--){
int n;
ll sum=;
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%lld",&a[i]);
for(int i=;i<=n;i++){
while(st.size()&&a[i]<=a[st.top()]) st.pop();
l[i]=st.size()==?:st.top()+;
st.push(i);
}
while(st.size()) st.pop();
for(int i=n;i>=;i--){
while(st.size()&&a[i]<a[st.top()]) st.pop();
r[i]=st.size()==?n:st.top()-;
st.push(i);
}
while(st.size()) st.pop();
for(int i=;i<=n;i++) sum-=((r[i]-i+)*(i-l[i]+)-)*a[i];
for(int i=;i<=n;i++){
while(st.size()&&a[i]>=a[st.top()]) st.pop();
l[i]=st.size()==?:st.top()+;
st.push(i);
}
while(st.size()) st.pop();
for(int i=n;i>=;i--){
while(st.size()&&a[i]>a[st.top()]) st.pop();
r[i]=st.size()==?n:st.top()-;
st.push(i);
}
while(st.size()) st.pop();
for(int i=;i<=n;i++) sum+=((r[i]-i+)*(i-l[i]+)-)*a[i];
printf("%lld\n",sum);
} return ;
}
牛客网 223C 区区区间间间(单调栈)的更多相关文章
- 2019牛客多校第四场C-sequence(单调栈+线段树)
sequence 题目传送门 解题思路 用单调栈求出每个a[i]作为最小值的最大范围.对于每个a[i],我们都要乘以一个以a[i]为区间内最小值的对应的b的区间和s,如果a[i] > 0,则s要 ...
- 牛客网小白月赛5I区间(差分数组)
链接:https://www.nowcoder.com/acm/contest/135/I来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他语言65536 ...
- 牛客网NOIP赛前集训营-提高组(第四场)B区间
牛客网NOIP赛前集训营-提高组(第四场)B区间 题目描述 给出一个序列$ a_1 \dots a_n$. 定义一个区间 \([l,r]\) 是好的,当且仅当这个区间中存在一个 \(i\),使得 ...
- 牛客网NOIP赛前集训营-提高组(第四场)B题 区间
牛客网NOIP赛前集训营-提高组(第四场) 题目描述 给出一个序列 a1, ..., an. 定义一个区间 [l,r] 是好的,当且仅当这个区间中存在一个 i,使得 ai 恰好等于 al, al+1, ...
- [牛客网NOIP赛前集训营-提高组(第一场)]C.保护
链接:https://www.nowcoder.com/acm/contest/172/C来源:牛客网 题目描述 C国有n个城市,城市间通过一个树形结构形成一个连通图.城市编号为1到n,其中1号城市为 ...
- 牛客网CSP-S提高组赛前集训营Round4
牛客网CSP-S提高组赛前集训营 标签(空格分隔): 题解 算法 模拟赛 题目 描述 做法 \(BSOJ6377\) 求由\(n\)长度的数组复制\(k\)次的数组里每个连续子序列出现数字种类的和 对 ...
- 牛客网《BAT面试算法精品课》学习笔记
目录 牛客网<BAT面试算法精品课>学习笔记 牛客网<BAT面试算法精品课>笔记一:排序 牛客网<BAT面试算法精品课>笔记二:字符串 牛客网<BAT面试算法 ...
- 【转自牛客网】C++类职位校招
作者:./a.out链接:https://www.nowcoder.com/discuss/14022来源:牛客网 话说在牛客网上混迹了半年,也没啥拿的出手的贡献.现在基本上自己的校招生涯要告一段落, ...
- 牛客网刷题(纯java题型 1~30题)
牛客网刷题(纯java题型 1~30题) 应该是先extend,然后implement class test extends A implements B { public static void m ...
随机推荐
- pthread_once()函数详解
转自:pthread_once()函数详解 pthread_once()函数详解 在多线程环境中,有些事仅需要执行一次.通常当初始化应用程序时,可以比较容易地将其放在main函数中.但当你写一个库 ...
- Headless Android开发板的调试及远程显示和控制
最近在调试msm8996的开发板,由于主板和LCD子板还没回来,所以先回的核心板算是个Headless的Android Device.核心板有独立供电,另外还有USB Type-C.FAN.HDMI. ...
- Mysql学习路线
本文内容: mysql学习路线 首发日期:2018-04-19 由于现在很多都是有api了,很多问题都转接到编程语言上来处理了,所以这篇mysql之路仅仅是作为“了解”之用.不深究mysql. 很多东 ...
- postgreSQL备份数据
1.pg_dump 备份单一数据库 pg_dump仅导出数据库结构: pg_dump -U TestRole1 -s -f TestDb1.sql TestDb1 2.全部备份采用pg_dumpall ...
- SM4加密算法实现Java和C#相互加密解密
SM4加密算法实现Java和C#相互加密解密 近期由于项目需要使用SM4对数据进行加密,然后传给Java后台,Java后台使用的也是SM4的加密算法但是就是解密不正确,经过一步步调试发现Java中好多 ...
- go语言学习-常用命令(四)
go常用命令 go get:获取远程包(得装git) go run:直接运行程序(写代码时调试用) go build:测试编译,检查是否有编译错误 go fmt:格式化代码(一般不咋用,IDE都自带了 ...
- Ubuntu17.04 sudo apt-get update升级错误
最近在折腾Ubuntu,安装的是17.04版本的.想安装PHP7.X最新版本,但是要先升级.利用sudo apt-get update命名后,出现了以下报错: 忽略:1 http://cn.archi ...
- LeetCode算法题-Number Complement(Java实现-五种解法)
这是悦乐书的第240次更新,第253篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第107题(顺位题号是476).给定正整数,输出其补码数.补充策略是翻转其二进制表示的位 ...
- 超哥笔记 -- 用户管理、权限设置、进程管理、中文配置、计划任务和yum源配置(5)
一 网卡配置 ifconfig 查询.设置网卡和ip等参数 ifup,ifdown 脚本命令,更简单的方式启动关闭网络 ip 符合指令,直接修改上述功能 网络配置文件: /etc/sysconf ...
- he
弄好这个网站---to thi tha think 好这个---, 很温馨 那时候我还在看. 前一段时候看yibenhaoshu,走出来的才是理性,所以现在才是理性的看待的. 回头再看看两年前的事情, ...