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. Linux 下安装pip

    安装pip 使用脚本安装和升级pip 要安装或升级pip,需要下载 get-pip.py. 地址:https://bootstrap.pypa.io/get-pip.py 然后运行以下命令 (需要管理 ...

  2. 初学jquery,自己写的一个jquery幻灯片,代码有些笨拙,希望有大神可以指点一二,精简一下代码

    html代码 <div class="picCon"> <div class="bigPic"> <ul> <li c ...

  3. C++ GPU && CPU

    #include <amp.h> #include <iostream> #include <winbase.h> //操作系统的底层文件 using namesp ...

  4. 转-Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案

    前言 刚开始创建MVC与Web API的混合项目时,碰到好多问题,今天拿出来跟大家一起分享下.有朋友私信我问项目的分层及文件夹结构在我的第一篇博客中没说清楚,那么接下来我就准备从这些文件怎么分文件夹说 ...

  5. guava学习--集合1

    Lists: 其内部使用了静态工厂方法代替构造器,提供了许多用于List子类构造和操作的静态方法,我们简单的依次进行说明,如下: newArrayList():构造一个可变的.空的ArrayList实 ...

  6. PHP数组去重..............过滤字段

    $test_data = M('hot'); //实例化数据表 $data = $test_data->Distinct(true)->field('descriprion')->o ...

  7. Java:多线程<三>死锁、线程间通讯

    死锁: 同步嵌套同步,而且使用的锁不是同一把锁时就可能出现死锁 class Test implements Runnable { private boolean flag; Test(boolean ...

  8. NodeJS利用mongoose模糊查询MongoDB

    在Node.js中,直接硬编码可以 Posts.where('title',/答案/); 但是 通过 字符串构造 不行 var qs = '/'+req.query.search+'/'; Posts ...

  9. Linux设备驱动中的并发控制

    1.并发是指多个执行单元同时.并行的执行.并发的执行单元对共享资源的访问很容易导致竞态. 在 Linux 内核中,主要的竞态发生于如下几种情况: ①对称多处理器(SMP)的多个 CPU ②单CPU内进 ...

  10. SQL Server存储过程Return、output参数及使用技巧

    SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000 ...