题面

100

在\(O(n^2)\)的基础上,我们可以用线段树来加速。

枚举了左端点之后,需要知道以这个左端点为起点的前缀max,前缀min。

这里只讨论前缀max,前缀min同理。

当我们倒序枚举左端点的时候,这个前缀max就可以用线段树来维护:

左端点向左移一位到i——

首先我们要预处理出a[i]向右第一个比他小的,以及第一个比他大的。

然后就相当于是区间赋值,并在线段树中维护好每一位的min和max积之和。

时间复杂度为\(O(nlogn)\)。

code

#include<bits/stdc++.h>
#define ll long long
#define fo(i,x,y) for(int i=x;i<=y;i++)
#define fd(i,x,y) for(int i=x;i>=y;i--)
using namespace std;
const char* fin="seq.in";
const char* fout="seq.out";
const int inf=0x7fffffff;
int read(){
int x=0;
char ch=getchar();
while (ch<'0' || ch>'9') ch=getchar();
while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}
const int maxn=500007,mo=1000000007;
int n,a[maxn],ans,mx[maxn],mn[maxn],st[maxn];
struct node{int x,a,b,ma,mb;node(){ma=mb=-1;}}c[maxn*4];
void mkd(int l,int r,int t){
if (c[t].ma!=-1){
c[t].x=1ll*c[t].b*c[t].ma%mo;
c[t].a=1ll*c[t].ma*(r-l+1)%mo;
if (l<r){
c[t*2].ma=c[t].ma;
c[t*2+1].ma=c[t].ma;
}
c[t].ma=-1;
}
if (c[t].mb!=-1){
c[t].x=1ll*c[t].a*c[t].mb%mo;
c[t].b=1ll*c[t].mb*(r-l+1)%mo;
if (l<r){
c[t*2].mb=c[t].mb;
c[t*2+1].mb=c[t].mb;
}
c[t].mb=-1;
}
}
void modifya(int l,int r,int t,int v1,int v2,int v){
int mid=(l+r)/2;
mkd(l,r,t);
if (l>v2 || r<v1) return;
if (l>=v1 && r<=v2){
c[t].ma=v;
mkd(l,r,t);
return;
}
modifya(l,mid,t*2,v1,v2,v);
modifya(mid+1,r,t*2+1,v1,v2,v);
c[t].x=(c[t*2].x+c[t*2+1].x)%mo;
c[t].a=(c[t*2].a+c[t*2+1].a)%mo;
c[t].b=(c[t*2].b+c[t*2+1].b)%mo;
}
void modifyb(int l,int r,int t,int v1,int v2,int v){
int mid=(l+r)/2;
mkd(l,r,t);
if (l>v2 || r<v1) return;
if (l>=v1 && r<=v2){
c[t].mb=v;
mkd(l,r,t);
return;
}
modifyb(l,mid,t*2,v1,v2,v);
modifyb(mid+1,r,t*2+1,v1,v2,v);
c[t].x=(c[t*2].x+c[t*2+1].x)%mo;
c[t].a=(c[t*2].a+c[t*2+1].a)%mo;
c[t].b=(c[t*2].b+c[t*2+1].b)%mo;
}
int main(){
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
n=read();
fo(i,1,n) a[i]=read();
st[0]=0;
fd(i,n,1){
while (st[0] && a[st[st[0]]]>=a[i]) st[0]--;
if (!st[0]) mx[i]=n+1;
else mx[i]=st[st[0]];
st[++st[0]]=i;
}
st[0]=0;
fd(i,n,1){
while (st[0] && a[st[st[0]]]<=a[i]) st[0]--;
if (!st[0]) mn[i]=n+1;
else mn[i]=st[st[0]];
st[++st[0]]=i;
}
fd(i,n,1){
modifya(1,n,1,i,mx[i]-1,a[i]);
modifyb(1,n,1,i,mn[i]-1,a[i]);
ans=(ans+c[1].x)%mo;
}
printf("%d",ans);
return 0;
}

【JZOJ5231】【NOIP2017模拟A组模拟8.5】序列问题 线段树的更多相关文章

  1. JZOJ 100029. 【NOIP2017提高A组模拟7.8】陪审团

    100029. [NOIP2017提高A组模拟7.8]陪审团 Time Limits: 1000 ms  Memory Limits: 131072 KB  Detailed Limits   Got ...

  2. JZOJ 5328. 【NOIP2017提高A组模拟8.22】世界线

    5328. [NOIP2017提高A组模拟8.22]世界线 (File IO): input:worldline.in output:worldline.out Time Limits: 1500 m ...

  3. JZOJ 5329. 【NOIP2017提高A组模拟8.22】时间机器

    5329. [NOIP2017提高A组模拟8.22]时间机器 (File IO): input:machine.in output:machine.out Time Limits: 2000 ms M ...

  4. JZOJ 5307. 【NOIP2017提高A组模拟8.18】偷窃 (Standard IO)

    5307. [NOIP2017提高A组模拟8.18]偷窃 (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Description ...

  5. JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 (Standard IO)

    5286. [NOIP2017提高A组模拟8.16]花花的森林 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Descript ...

  6. JZOJ 5305. 【NOIP2017提高A组模拟8.18】C (Standard IO)

    5305. [NOIP2017提高A组模拟8.18]C (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Description ...

  7. JZOJ 5230. 【NOIP2017模拟A组模拟8.5】队伍统计

    5230. [NOIP2017模拟A组模拟8.5]队伍统计 (File IO): input:count.in output:count.out Time Limits: 1500 ms Memory ...

  8. 【NOIP2017提高A组模拟9.17】信仰是为了虚无之人

    [NOIP2017提高A组模拟9.17]信仰是为了虚无之人 Description Input Output Sample Input 3 3 0 1 1 7 1 1 6 1 3 2 Sample O ...

  9. 【NOIP2017提高A组模拟9.17】猫

    [NOIP2017提高A组模拟9.17]猫 题目 Description 信息组最近猫成灾了! 隔壁物理组也拿猫没办法. 信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数) ...

  10. 【NOIP2017提高A组模拟9.17】组合数问题

    [NOIP2017提高A组模拟9.17]组合数问题 题目 Description 定义"组合数"S(n,m)代表将n 个不同的元素拆分成m 个非空集合的方案数. 举个例子,将{1,2,3}拆分成2 个 ...

随机推荐

  1. 查看python安装位置和已安装库的相关操作

    打开cmd.exe, *查看python安装位置 where python *查看已安装库 pip list 或者pip freeze *查看可以更新的第三方库 pip list --outdated ...

  2. 洛谷P4550 【收集邮票】

    题目链接: 神仙题QAQ 题目分析: 概率期望题是不可能会的,一辈子都不可能会的QAQ 这个题也太仙了 首先明确一下题意里面我感觉没太说清楚的地方,这里是抽到第\(i\)次要\(i\)元钱,不是抽到第 ...

  3. WCF服务编程-基础

    WCF是微软建立新一代的分布式应用及面向服务应用的标准平台,是基于原有.NET Framework 2.0的扩展.虽然在WCF发布不久就已经在项目中使用WCF技术了.但是由于在项目中还没有较大规模的应 ...

  4. java使用stream流批量读取并合并文件,避免File相关类导致单文件过大造成的内存溢出。

    import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.F ...

  5. 国内平台比特币(Bitcoin)搬砖流程教学

    建议搬砖时要的价差,实际费用与利润请自行计算,避免亏损或白做工请自行拿捏利润. 请搬砖前要先自行操作与确认双边平台的存取速度.利於拿捏时间,避免时间差导致亏损. (所有内容 仅供参考 盈亏自负) 搬砖 ...

  6. Glassfish安装、基本使用、在idea中配置Glassfish

    Glassfish安装.基本使用. 一.glassfish简介 glassfish是一款web应用服务器,和tomcat一样,也是一款优秀的Servlet容器. 二.glassfish知识点 1.do ...

  7. Android笔记之让Debug和Release模式使用相同的签名

    方法如下图 完整的build.gradle如下 apply plugin: 'com.android.application' android { compileSdkVersion 29 build ...

  8. nginx+supervisor 前后端分离项目的发布流程

    [第一部分] 前端发布(vue项目),假设项目名为demo_vue Step1:编译打包前端项目 cd到demo_vue目录下, 执行cnpm run build:prod命令,生成disc文件夹 S ...

  9. history配置

    /etc/profile配置文件中,末尾增加如下参数项: HFILE=`who -m | awk '{print $1}'`readonly HISTFILE=/var/history/$HFILE- ...

  10. Linux设置复制粘帖的快捷方式

    一.快捷设置 安装gpm:yum install -y gpm* 开启gpm服务:systemctl start gpm 按住鼠标左键,选中想要复制的内容,松开就完成复制,再在复制的位置按右键就完成粘 ...