考虑枚举右端点,用线段树维护[i,nowr]的答案。

当右端点向右延伸时,需要知道它前面第一个比它大/小的数的位置,这里面的最值将发生改变,这个使用单调队列求出,然后将所有的l都加1。

注意常数优化。

#include<cstdio>
#define PB int mid=(a+b)>>1,l=x<<1,r=l|1;if(T[x].tx)cmax1(l,T[x].tx),cmax1(r,T[x].tx),T[x].tx=0;if(T[x].tn)cmin1(l,T[x].tn),cmin1(r,T[x].tn),T[x].tn=0;if(T[x].tl)clen1(l,T[x].tl),clen1(r,T[x].tl),T[x].tl=0;
#define UP T[x].sx=(T[l].sx+T[r].sx)%P;T[x].sn=(T[l].sn+T[r].sn)%P;T[x].sl=(T[l].sl+T[r].sl)%P;T[x].sxn=(T[l].sxn+T[r].sxn)%P;T[x].sxl=(T[l].sxl+T[r].sxl)%P;T[x].snl=(T[l].snl+T[r].snl)%P;T[x].sxnl=(T[l].sxnl+T[r].sxnl)%P;
typedef long long ll;
const int N=500010,P=1000000000;
int n,i,v[N],q1[N],q2[N],t1,t2,ans;
struct node{int sx,sn,sl,sxn,sxl,snl,sxnl,tx,tn,tl,l;}T[1050000];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
void build(int x,int a,int b){
T[x].l=b-a+1;
if(a==b)return;
int mid=(a+b)>>1;
build(x<<1,a,mid),build(x<<1|1,mid+1,b);
}
inline void cmax1(int x,ll p){
T[x].sx=p*T[x].l%P;
T[x].sxn=p*T[x].sn%P;
T[x].sxl=p*T[x].sl%P;
T[x].sxnl=p*T[x].snl%P;
T[x].tx=p;
}
inline void cmin1(int x,ll p){
T[x].sn=p*T[x].l%P;
T[x].sxn=p*T[x].sx%P;
T[x].snl=p*T[x].sl%P;
T[x].sxnl=p*T[x].sxl%P;
T[x].tn=p;
}
inline void clen1(int x,ll p){
T[x].sl=(p*T[x].l+T[x].sl)%P;
T[x].sxl=(p*T[x].sx+T[x].sxl)%P;
T[x].snl=(p*T[x].sn+T[x].snl)%P;
T[x].sxnl=(p*T[x].sxn+T[x].sxnl)%P;
T[x].tl=(T[x].tl+p)%P;
}
void cmax(int x,int a,int b,int c){
if(c<=a&&b<=i){cmax1(x,v[i]);return;}
PB
if(c<=mid)cmax(l,a,mid,c);
if(i>mid)cmax(r,mid+1,b,c);
UP
}
void cmin(int x,int a,int b,int c){
if(c<=a&&b<=i){cmin1(x,v[i]);return;}
PB
if(c<=mid)cmin(l,a,mid,c);
if(i>mid)cmin(r,mid+1,b,c);
UP
}
void clen(int x,int a,int b){
if(b<=i){clen1(x,1);return;}
PB
clen(l,a,mid);
if(i>mid)clen(r,mid+1,b);
UP
}
int main(){
read(n);
for(i=1;i<=n;i++)read(v[i]);
build(1,1,n);
for(i=1;i<=n;q1[++t1]=q2[++t2]=i++){
while(t1&&v[q1[t1]]<v[i])t1--;
while(t2&&v[q2[t2]]>v[i])t2--;
cmax(1,1,n,q1[t1]+1),cmin(1,1,n,q2[t2]+1),clen(1,1,n);
ans=(ans+T[1].sxnl)%P;
}
return printf("%d",ans),0;
}

  

BZOJ3745 : [Coci2014]Norma的更多相关文章

  1. 【BZOJ3745】Norma(CDQ分治)

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

  2. 【BZOJ3745】Norma [分治]

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

  3. bzoj3745: [Coci2015]Norma

    Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. 预处理每个位置的数作为最小/大值向左延伸的最大距离, ...

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

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

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

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

  6. PKUSC2018训练日程(4.18~5.30)

    (总计:共66题) 4.18~4.25:19题 4.26~5.2:17题 5.3~5.9: 6题 5.10~5.16: 6题 5.17~5.23: 9题 5.24~5.30: 9题 4.18 [BZO ...

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

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

  8. 【题解】Norma [COCI2014] [SP22343]

    [题解]Norma [COCI2014] [SP22343] 传送门:\(\text{Norma [COCI2014]}\) \(\text{[SP22343]}\) [题目描述] 给定一个整数 \( ...

  9. BZOJ3745:[COCI2015]Norma

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

随机推荐

  1. 腾讯sdk学到了

    1. 获取文本的高度和宽度 + (CGFloat)heightForContent:(MyMsgTextModel *)content withWidth:(CGFloat)width { CGSiz ...

  2. 如何高效利用GitHub

    是Github,让社会化编程成为现实.本文尝试谈谈GitHub的文化.技巧与影响. Q1:GitHub是什么 Q2:GitHub风格 Q3: 在GitHub,如何跟牛人学习 Q4: 享受纯粹的写作与演 ...

  3. lambda 表达式

    C++0x 的语法还是比较简单.下面通过几个例子来介绍下. 先是通过 std::for_each 演示一个简单的例子: ? std::for_each 和 lambda 1 2 3 4 5 6 7 8 ...

  4. static总结

    [本文链接] http://www.cnblogs.com/hellogiser/p/static.html [分析] [内存分配方式] 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局 ...

  5. 为eclipse设置好看的代码主题

    eclipse的默认代码背景是白色,上个文章简单说了字体设置,这边主要介绍代码高亮的主题设置,打造更酷的编程界面.网上有文章说可以在设置里面逐一设置,但是比较麻烦,可以去网上下载现成的主题包,网址为: ...

  6. Stanford大学机器学习公开课(五):生成学习算法、高斯判别、朴素贝叶斯

    (一)生成学习算法 在线性回归和Logistic回归这种类型的学习算法中我们探讨的模型都是p(y|x;θ),即给定x的情况探讨y的条件概率分布.如二分类问题,不管是感知器算法还是逻辑回归算法,都是在解 ...

  7. MySQL主备库切换(MHA)演练与总结

      演练包括被动切换和主动切换两部分.被动切换是主库宕机,主动切换是人工手动触发.   演练步骤大致如下:       1 先停掉主库,模拟主库宕机     2 mha将vip切到备库,备库变成主库, ...

  8. 【读书笔记】读《JavaScript DOM 编程艺术-第2版》

    1.DHTML DHTML曾被认为是HTML/XHTML.CSS和JavaScript相结合的产物,就像今天的HTML5那样,但把这些东西真正凝聚在一起的是DOM.如果真的需要来描述这一过程的话,“D ...

  9. POSIX线程--同时执行

    //#define _REENTRANT//#define _POSIX_C_SOURCE#include <iostream>#include <string>#includ ...

  10. ajax 中文乱码问题 主要是IE浏览器

    解决方案: 提交前采用encodeURI两次编码,注:一定是两次 举例: var taText = $("#txtName").val(); taText = encodeURI( ...