Description

Input

第1行,一个整数N;
第2~n+1行,每行一个整数表示序列a。

Output

输出答案对10^9取模后的结果。

预处理每个位置的数作为最小/大值向左延伸的最大距离,线段树维护序列的前缀的后缀min和后缀max以及这个前缀的后缀对答案的贡献,在前缀末尾加入一个数可以快速维护。

#include<cstdio>
typedef long long i64;
const int N=,P=;
char buf[N*],*ptr=buf-;
int _(){
int x=,c=*++ptr;
while(c<)c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x;
}
int _l,_r,_a,v1,v2,ans=;
inline int mod(int x){return x<P?x:x-P;}
struct node{
node*l,*r;
int f1,f2,sz,L,R;
int s1,s2,s3,ss1,ss2,ss3;
void fil1(int x){
f1=x;
s1=i64(x)*sz%P;
ss1=(i64(sz)*(sz+)>>)%P*x%P;
s3=i64(x)*s2%P;
ss3=i64(x)*ss2%P;
}
void fil2(int x){
f2=x;
s2=i64(x)*sz%P;
ss2=(i64(sz)*(sz+)>>)%P*x%P;
s3=i64(x)*s1%P;
ss3=i64(x)*ss1%P;
}
void dn(){
if(f1)l->fil1(f1),r->fil1(f1),f1=;
if(f2)l->fil2(f2),r->fil2(f2),f2=;
}
void up(){
s1=mod(l->s1+r->s1);
s2=mod(l->s2+r->s2);
s3=mod(l->s3+r->s3);
ss1=(l->ss1+r->ss1+i64(l->s1)*r->sz)%P;
ss2=(l->ss2+r->ss2+i64(l->s2)*r->sz)%P;
ss3=(l->ss3+r->ss3+i64(l->s3)*r->sz)%P;
}
void set1(){
if(_l<=L&&R<=_r){
fil1(_a);
return;
}
dn();
int M=L+R>>;
if(_l<=M)l->set1();
if(_r>M)r->set1();
up();
}
void set2(){
if(_l<=L&&R<=_r){
fil2(_a);
return;
}
dn();
int M=L+R>>;
if(_l<=M)l->set2();
if(_r>M)r->set2();
up();
}
void get(){
if(R<=_r){
v2=(v2+ss3+i64(v1)*sz)%P;
v1=mod(v1+s3);
return;
}
dn();
int M=L+R>>;
l->get();
if(_r>M)r->get();
}
}ns[N*],*np=ns,*rt;
node*build(int L,int R){
node*w=np++;
w->L=L;w->R=R;
w->sz=R-L+;
if(L!=R){
int M=L+R>>;
w->l=build(L,M);
w->r=build(M+,R);
}
return w;
}
int n,a[N],p1[N],p2[N],ss[N],sp=;
int main(){
fread(buf,,sizeof(buf),stdin);
n=_();
for(int i=;i<=n;++i)a[i]=_();
for(int i=n;i;--i){
while(sp&&a[ss[sp]]>a[i])p1[ss[sp--]]=i+;
ss[++sp]=i;
}
while(sp)p1[ss[sp--]]=;
for(int i=n;i;--i){
while(sp&&a[ss[sp]]<a[i])p2[ss[sp--]]=i+;
ss[++sp]=i;
}
while(sp)p2[ss[sp--]]=;
rt=build(,n);
for(int i=;i<=n;++i){
_l=p1[i];_r=i;_a=a[i];
rt->set1();
_l=p2[i];
rt->set2();
v1=v2=;
rt->get();
ans=mod(ans+v2);
}
printf("%d",ans);
return ;
}

bzoj3745: [Coci2015]Norma的更多相关文章

  1. [BZOJ3745][COCI2015]Norma[分治]

    题意 题目链接 分析 考虑分治,记当前分治区间为 \(l,r\) . 枚举左端点,然后发现右端点无非三种情况: 极大极小值都在左边; 有一个在左边; 极大极小值都在右边; 考虑递推 \(l\) 的同时 ...

  2. bzoj3745: [Coci2015]Norma 分治,单调队列

    链接 bzoj 思路 首先\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\sum\limits_{k=i}^{j}max(a_k)\)可以用单调队列求解.参见 ...

  3. 【BZOJ3745】[Coci2015]Norma cdq分治

    [BZOJ3745][Coci2015]Norma Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. ...

  4. 【BZOJ3745】Norma(CDQ分治)

    [BZOJ3745]Norma(CDQ分治) 题面 BZOJ 洛谷 题解 这种问题直接做不好做,显然需要一定的优化.考虑\(CDQ\)分治. 现在唯一需要考虑的就是跨越当前中间节点的所有区间如何计算答 ...

  5. BZOJ3745:[COCI2015]Norma

    浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.p ...

  6. 【BZOJ3745】Norma [分治]

    Norma Time Limit: 20 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description Input 第1行,一个整数N: ...

  7. BZOJ3745 : [Coci2014]Norma

    考虑枚举右端点,用线段树维护[i,nowr]的答案. 当右端点向右延伸时,需要知道它前面第一个比它大/小的数的位置,这里面的最值将发生改变,这个使用单调队列求出,然后将所有的l都加1. 注意常数优化. ...

  8. bzoj 3745: [Coci2015]Norma

    Description Solution 考虑分治: 我们要统计跨越 \(mid\) 的区间的贡献 分最大值和最小值所在位置进行讨论: 设左边枚举到了 \(i\),左边 \([i,mid]\) 的最大 ...

  9. BZOJ 3745: [Coci2015]Norma(分治)

    题意 给定一个正整数序列 \(a_1, a_2, \cdots, a_n\) ,求 \[ \sum_{i=1}^{n} \sum_{j=i}^{n} (j - i + 1) \min(a_i,a_{i ...

随机推荐

  1. Load Runner11录制脚本出现乱码的解决方法

    方法一: 1.录制的脚本出现乱码 Go to Vugen -> Tools -> Recording Options -> Advancedb)   Check the option ...

  2. JavaWeb基础: XML基础知识

    简介 XML:可扩展标记语言,W3C指定的用于描述结构化数据的语言,XML在实际开发中,经常用作软件的配置文件,以描述程序模块之间的依赖和组合关系. XML约束:XML常常用于软件配置管理,对于软件框 ...

  3. Port Hacking

    Port information21 ftp 主要看是否支持匿名,也可以跑弱口令22 ssh23 telnet79 Finger80 web 常见web漏洞以及是否为一些管理后台111 rpcinfo ...

  4. Google API在线生成二维码的方法

    1.先看一个实例,是用Google API生成西部e网的网站地址www.weste.net二维码的方法: http://chart.apis.google.com/chart?cht=qr&c ...

  5. WCF初探-11:WCF客户端异步调用服务

    前言: 在上一篇WCF初探-10:WCF客户端调用服务 中,我详细介绍了WCF客户端调用服务的方法,但是,这些操作都是同步进行的.有时我们需要长时间处理应用程序并得到返回结果,但又不想影响程序后面代码 ...

  6. MagicalRecord的使用(第三方库实现的数据库)

    MagicalRecord:http://cocoadocs.org/docsets/MagicalRecord/2.1/ 安装: 1.新建一个工程,注意不要勾选 Core Data. 2.利用Coc ...

  7. Hadoop 2.2.0学习笔记20131209

    1.下载java 7并安装 [root@server- ~]# rpm -ivh jdk-7u40-linux-x64.rpm Preparing... ####################### ...

  8. GPS模块启动模式说明

    1.启动方式 GPS开机定位分为冷启动、温启动和热启动三种:  1、冷启动:以下几种情况开机均属冷启动。初次使用时;电池耗尽导致星历信息丢失时;关机状态下将接收机移动1000公里以上距离。   2、温 ...

  9. 使用python-openCV对摄像头捕捉的镜头进行二值化并打上文字

    用CaptureFromCAM函数对图像进行提取: capture = cv.CaptureFromCAM(0) 读取直接的视频文件只需将语句改变为: capture = cv.VideoCaptur ...

  10. python模块之time

    Python中的时间模块. 1.在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素. 2.UTC(Coordinated U ...