牛客网 牛可乐发红包脱单ACM赛 C题 区区区间间间

【题解】
我想到了两种解法。
一种是扫描线+线段树+单调栈。
另一种方法是O(n)的,比较巧妙。
考虑每个数在哪些区间可以作为最小数。最长的区间就是它向左右走,直到有数字比它小,这个可以用单调栈维护。
那么区间数就是它左边可以走的距离*右边可以走的距离,答案减去这个数字*区间数。
再考虑每个数在哪些区间可以作为最大数。方法是一样的。
那么4次单调栈即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL unsigned long long
#define rg register
#define N 200010
using namespace std;
int T,n,m,top,v[N],l[N],r[N];
struct stack{int num,pos;}st[N];
LL ans,sum[N];
inline LL read(){
LL k=,f=; char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
return k*f;
}
int main(){
T=read();
while(T--){
ans=;
n=read();
for(rg int i=;i<=n;i++) v[i]=read();
for(rg int i=;i<=n;i++) sum[i]=sum[i-]+v[i];
top=;
st[].pos=;
for(rg int i=;i<=n;i++){
while(st[top].num>v[i]&&top>) top--;
st[++top].num=v[i]; st[top].pos=i;
l[i]=st[top-].pos+;
// printf("top=%d\n",top);
}
top=;
st[].pos=n+;
for(rg int i=n;i;i--){
while(st[top].num>=v[i]&&top>) top--;
st[++top].num=v[i]; st[top].pos=i;
r[i]=st[top-].pos-;
}
for(rg int i=;i<=n;i++) ans-=1ll*(i-l[i]+)*(r[i]-i+)*v[i];
// for(rg int i=1;i<=n;i++) printf("%d %d\n",l[i],r[i]);
top=;
st[].pos=;
for(rg int i=;i<=n;i++){
while(st[top].num<v[i]&&top>) top--;
st[++top].num=v[i]; st[top].pos=i;
l[i]=st[top-].pos+;
}
top=;
st[].pos=n+;
for(rg int i=n;i;i--){
while(st[top].num<=v[i]&&top>) top--;
st[++top].num=v[i]; st[top].pos=i;
r[i]=st[top-].pos-;
}
// for(rg int i=1;i<=n;i++) printf("%d %d\n",l[i],r[i]);
for(rg int i=;i<=n;i++) ans+=1ll*(i-l[i]+)*(r[i]-i+)*v[i];
printf("%lld\n",ans);
}
return ;
}
牛可乐发红包脱单ACM赛
牛客网 牛可乐发红包脱单ACM赛 C题 区区区间间间的更多相关文章
- 牛客网 牛可乐发红包脱单ACM赛 B题 小a的旅行计划
[题解] 题意其实就是把n个物品分成4个集合,其中三个集合不可以为空(只属于A.只属于B.AB的交),一个集合空或者非空都可以(不属于A也不属于B),问有多少种方案. 考虑容斥,4个集合都不为空的方案 ...
- 牛客网 牛可乐发红包脱单ACM赛 A题 生成树
[题解] 其实就是求两棵树不同的边有多少条.那么我们用一个set来去重即可. #include<cstdio> #include<cstring> #include<se ...
- NowCoder--牛可乐发红包脱单ACM赛C_区区区间间间
题目链接:C_区区区间间间 思路:算贡献,求出每个数为当前最大值时所在的区间个数,和每个数为最小值的区间个数 和这个题有点类似 搭配食用效果更佳 点击这里 #include<bits/stdc+ ...
- 牛可乐发红包脱单OI赛 C 小可爱表白
打个暴力查一下OEIS,5min做完 出题人一开始把式子打错了,一开始的式子的结果为$n * (n + 3) * 2^{n - 3}$ 我们考虑化式子 首先考虑 $\sum\limits_{j = 1 ...
- 牛客网 江西财经大学第二届程序设计竞赛同步赛 D.绕圈游戏-(跳青蛙游戏)找数的所有因子就可以了
链接:https://ac.nowcoder.com/acm/contest/635/D来源:牛客网 D.绕圈游戏 433为了帮ddd提升智商,决定陪他van特殊的游戏.433给定一个带有n个点的环, ...
- 牛客网 牛客练习赛43 F.Tachibana Kanade Loves Game-容斥(二进制枚举)+读入挂
链接:https://ac.nowcoder.com/acm/contest/548/F来源:牛客网 Tachibana Kanade Loves Game 时间限制:C/C++ 1秒,其他语言2秒 ...
- 牛客网 牛客练习赛43 C.Tachibana Kanade Loves Review-最小生成树(并查集+Kruskal)+建虚点+读入挂
链接:https://ac.nowcoder.com/acm/contest/548/C来源:牛客网 Tachibana Kanade Loves Review 时间限制:C/C++ 2秒,其他语言4 ...
- 牛客网 牛客练习赛43 B.Tachibana Kanade Loves Probability-快速幂加速
链接:https://ac.nowcoder.com/acm/contest/548/B来源:牛客网 Tachibana Kanade Loves Probability 时间限制:C/C++ 1秒, ...
- 牛客网 牛客小白月赛12 B.华华教月月做数学-A^B mod P-快速幂+快速乘
链接:https://ac.nowcoder.com/acm/contest/392/B来源:牛客网 华华教月月做数学 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其 ...
随机推荐
- Codeforces Round #408 (Div. 2) D
Description Inzane finally found Zane with a lot of money to spare, so they together decided to esta ...
- queue+模拟 Codeforces Round #304 (Div. 2) C. Soldier and Cards
题目传送门 /* 题意:两堆牌,每次拿出上面的牌做比较,大的一方收走两张牌,直到一方没有牌 queue容器:模拟上述过程,当次数达到最大值时判断为-1 */ #include <cstdio&g ...
- Sublime3注册码和安装中文包
1.Sublime3注册码 在工具栏Help中点击Enter license,粘贴下面一大串 —– BEGIN LICENSE —– Michael Barnes Single User Licens ...
- (转)Unity优化之减少Drawcall
转载:http://www.jianshu.com/p/061e67308e5f Unity GUI(uGUI)使用心得与性能总结 背景和目的 小哈接触Unity3D也有一段时间了,项目组在UI解决方 ...
- wamp无法进入phpMyAdmin或localhost的解决方法
我用的是最新版的wampsever5,在win7(64位)下安装正常使用,没有无法进入phpMyAdmin的问题,但是我在虚拟机安装了win8(64位专业版),测试在win8下面的使用情况时,就有问题 ...
- 拦截@RequestBody的请求数据
要拦截首先想到的是拦截器,@RequestBody只能以流的方式读取,流被读过一次后,就不在存在了,会导致会续无法处理,因此不能直接读流 为了解决这个问题,思路如下: 1.读取流前先把流保存一下 2. ...
- AJPFX关于hashmap和hashtable 的区别
Hashtable和HashMap类有三个重要的不同之处.第一个不同主要是历史原因.Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现. ...
- Thymeleaf 在项目中的应用及前后端交互的一些知识(1)
经过一段时间的工作,我的第一个项目已经快要上线了.本篇文章介绍些thymeleaf在工作中的实际应用,但是更多的还是一些前端处理后台数据的一些思路,如果有什么不正确的地方,希望大家指点. 1.th:e ...
- tar.bz2
tar -xvjf gcc-4.1.0.tar.bz2 bzip2 -d gcc-4.1.0.tar.bz2
- java比较日期大小及日期与字符串的转换【SimpleDateFormat操作实例】
java比较日期大小及日期与字符串的转换[SimpleDateFormat操作实例] package com.ywx.test; import java.text.ParseException; im ...