bzoj3745: [Coci2015]Norma
Description
Input
Output
预处理每个位置的数作为最小/大值向左延伸的最大距离,线段树维护序列的前缀的后缀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的更多相关文章
- [BZOJ3745][COCI2015]Norma[分治]
题意 题目链接 分析 考虑分治,记当前分治区间为 \(l,r\) . 枚举左端点,然后发现右端点无非三种情况: 极大极小值都在左边; 有一个在左边; 极大极小值都在右边; 考虑递推 \(l\) 的同时 ...
- bzoj3745: [Coci2015]Norma 分治,单调队列
链接 bzoj 思路 首先\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\sum\limits_{k=i}^{j}max(a_k)\)可以用单调队列求解.参见 ...
- 【BZOJ3745】[Coci2015]Norma cdq分治
[BZOJ3745][Coci2015]Norma Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. ...
- 【BZOJ3745】Norma(CDQ分治)
[BZOJ3745]Norma(CDQ分治) 题面 BZOJ 洛谷 题解 这种问题直接做不好做,显然需要一定的优化.考虑\(CDQ\)分治. 现在唯一需要考虑的就是跨越当前中间节点的所有区间如何计算答 ...
- BZOJ3745:[COCI2015]Norma
浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.p ...
- 【BZOJ3745】Norma [分治]
Norma Time Limit: 20 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description Input 第1行,一个整数N: ...
- BZOJ3745 : [Coci2014]Norma
考虑枚举右端点,用线段树维护[i,nowr]的答案. 当右端点向右延伸时,需要知道它前面第一个比它大/小的数的位置,这里面的最值将发生改变,这个使用单调队列求出,然后将所有的l都加1. 注意常数优化. ...
- bzoj 3745: [Coci2015]Norma
Description Solution 考虑分治: 我们要统计跨越 \(mid\) 的区间的贡献 分最大值和最小值所在位置进行讨论: 设左边枚举到了 \(i\),左边 \([i,mid]\) 的最大 ...
- 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 ...
随机推荐
- <select>的下拉样式
今天做一个专题,其中,select标签的样式要做成下图的模样,但是默认情况是下下图的模样: 如何实现呢,实现的办法竟然比我想象中的简单好多: select{ border: solid 1px #00 ...
- Java完成最简单的WebService创建及使用(REST方式,Jersey框架)
前言: 一直以来都对WebService感兴趣,但因为难以理解WebService到底是什么,所以了解甚少.周二的时候有个跟我关系比较好的同事想要自己写个WebService的小Demo,希望能够做成 ...
- html5的spellcheck属性(拼写、文法检查)
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- HttpCache ETag与Last-Modified与Expires
Last-Modified 是检查一个资源最后修改时间.如果时间过期了则返回资源内容.如果没过期,返回304.当Last-Modified更新了,但是资源本质上没有更新,比如资源是A,Last-Mod ...
- document的createDocumentFragment()方法
在<javascript高级程序设计>一书的6.3.5:创建和操作节点一节中,介绍了几种动态创建html节点的方法,其中有以下几种常见方法: · crateAttribute(name): ...
- iOS开发UI篇—字典转模型
iOS开发UI篇—字典转模型 一.能完成功能的“问题代码” 1.从plist中加载的数据 2.实现的代码 // // LFViewController.m // 03-应用管理 // // Creat ...
- webix源码阅读
最近在用webix,需要一个类似九宫格的监控界面.自带的控件里没有,于是萌生出做一个Custom Component的需求.不过webix关于自定义控件的文档比较少,官方只有一篇<Creatin ...
- ubuntu 14.04 下找不到命令,路径出错
在安装一些东西时,可能操作上不小心把路径覆盖或打错,造成一些基本命令如ls mkdir等无法使用,就会出现以下提示错误. 错误: 由于/usr/bin 不在PATH 环境变量中,故无法找到该命令 根本 ...
- 利用ftp端口设置,浅谈windows防火墙之应用+ftp直接资源管理器登陆
win服务器的版本是不错的.防火墙也比较能用.server-u 6.4则是比较稳定.兼容性好的的版本,所以很多人在用 1.服务器为了安全,一般开启windows高级防火墙,在网络连接处右键鼠标,有弹出 ...
- C# 6.0新特性(转载)
简介 VS 2015中已经包含C# 6.0. C#在发布不同版本时,C#总是会有新特性,比如C#3.0中出现LINQ,C#4.0中的动态特性,c#5.0中的异步操作等.. C# 6.0中与增加了不少新 ...