【题解】

  我想到了两种解法。

  一种是扫描线+线段树+单调栈。

  另一种方法是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题 区区区间间间的更多相关文章

  1. 牛客网 牛可乐发红包脱单ACM赛 B题 小a的旅行计划

    [题解] 题意其实就是把n个物品分成4个集合,其中三个集合不可以为空(只属于A.只属于B.AB的交),一个集合空或者非空都可以(不属于A也不属于B),问有多少种方案. 考虑容斥,4个集合都不为空的方案 ...

  2. 牛客网 牛可乐发红包脱单ACM赛 A题 生成树

    [题解] 其实就是求两棵树不同的边有多少条.那么我们用一个set来去重即可. #include<cstdio> #include<cstring> #include<se ...

  3. NowCoder--牛可乐发红包脱单ACM赛C_区区区间间间

    题目链接:C_区区区间间间 思路:算贡献,求出每个数为当前最大值时所在的区间个数,和每个数为最小值的区间个数 和这个题有点类似 搭配食用效果更佳 点击这里 #include<bits/stdc+ ...

  4. 牛可乐发红包脱单OI赛 C 小可爱表白

    打个暴力查一下OEIS,5min做完 出题人一开始把式子打错了,一开始的式子的结果为$n * (n + 3) * 2^{n - 3}$ 我们考虑化式子 首先考虑 $\sum\limits_{j = 1 ...

  5. 牛客网 江西财经大学第二届程序设计竞赛同步赛 D.绕圈游戏-(跳青蛙游戏)找数的所有因子就可以了

    链接:https://ac.nowcoder.com/acm/contest/635/D来源:牛客网 D.绕圈游戏 433为了帮ddd提升智商,决定陪他van特殊的游戏.433给定一个带有n个点的环, ...

  6. 牛客网 牛客练习赛43 F.Tachibana Kanade Loves Game-容斥(二进制枚举)+读入挂

    链接:https://ac.nowcoder.com/acm/contest/548/F来源:牛客网 Tachibana Kanade Loves Game 时间限制:C/C++ 1秒,其他语言2秒 ...

  7. 牛客网 牛客练习赛43 C.Tachibana Kanade Loves Review-最小生成树(并查集+Kruskal)+建虚点+读入挂

    链接:https://ac.nowcoder.com/acm/contest/548/C来源:牛客网 Tachibana Kanade Loves Review 时间限制:C/C++ 2秒,其他语言4 ...

  8. 牛客网 牛客练习赛43 B.Tachibana Kanade Loves Probability-快速幂加速

    链接:https://ac.nowcoder.com/acm/contest/548/B来源:牛客网 Tachibana Kanade Loves Probability 时间限制:C/C++ 1秒, ...

  9. 牛客网 牛客小白月赛12 B.华华教月月做数学-A^B mod P-快速幂+快速乘

    链接:https://ac.nowcoder.com/acm/contest/392/B来源:牛客网 华华教月月做数学 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其 ...

随机推荐

  1. (四)python自带解释器(IDLE)的使用

    什么是IDE? Integrated Development Environment(集成开发环境) 打个不恰当的比方,如果说写代码是制作一件工艺品,那IDE就是机床.再打个不恰当的比方,PS就是图片 ...

  2. AtCoder Regular Contest 081 F - Flip and Rectangles

    题目传送门:https://arc081.contest.atcoder.jp/tasks/arc081_d 题目大意: 给定一个\(n×m\)的棋盘,棋盘上有一些黑点和白点,每次你可以选择一行或一列 ...

  3. 洛谷 P1199 三国游戏

    参考:Solution_ID:17 题解 更新时间: 2016-11-13 21:01 这道题要求最后得到的两方的默契值最大的武将,小涵的默契值大于计算机,首先,我们这个解法获胜的思路是,每个武将对应 ...

  4. eclipse 当安装jad仍然不能反编译,提示attach source的时候

    当安装jad仍然不能反编译,提示attach source的时候,其实是当前workspace有问题了: 所使用的workspace目录下.metadata\.mylyn会出现一个.tasks.xml ...

  5. E. Xenia and Tree 分块 + LCA

    http://codeforces.com/contest/342/problem/E 如果把询问1存起来,每到sqrt(m)的时候再处理一次. 那么总复杂度就是msqrt(m)的. 把要变颜色的节点 ...

  6. PowerShell~文件操作和对象遍历

    ps提供了丰富的文件操作,如建立,删除,改名,移动,复制,文件夹建立,显示文件列表,同时对数组对象的遍历也很方便,如果在使用PS脚本时,希望现时传入参数,可以把参数声明为param,当然需要把它写在文 ...

  7. spring mvc URL忽略大小写

    @Configuration public class SpringWebConfig extends WebMvcConfigurationSupport { @Override public vo ...

  8. Spring-bean(二)

    命名空间 自动装配 bean之间的关系:继承:依赖 使用外部属性文件 SpEL bean的生命周期 bean的后置处理器 (一)util命名空间 当用list,set等集合时,不能将集合作为独立的be ...

  9. linux的top下buffer与cache的区别

    buffer:    缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据 的区域.通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据 时,速度快的设备的操作进程不发 ...

  10. JS内置对象练习(慕课网题目)

    效果图: XXXX年XX月X日 星期X--班级总分为:81 格式要求: 1.显示打印的日期. 格式为类似“XXXX年XX月XX日 星期X” 的当前的时间. 2.计算出该班级的平均分(保留整数). 同学 ...