【JZOJ5231】【NOIP2017模拟A组模拟8.5】序列问题 线段树
题面
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】序列问题 线段树的更多相关文章
- JZOJ 100029. 【NOIP2017提高A组模拟7.8】陪审团
100029. [NOIP2017提高A组模拟7.8]陪审团 Time Limits: 1000 ms Memory Limits: 131072 KB Detailed Limits Got ...
- JZOJ 5328. 【NOIP2017提高A组模拟8.22】世界线
5328. [NOIP2017提高A组模拟8.22]世界线 (File IO): input:worldline.in output:worldline.out Time Limits: 1500 m ...
- JZOJ 5329. 【NOIP2017提高A组模拟8.22】时间机器
5329. [NOIP2017提高A组模拟8.22]时间机器 (File IO): input:machine.in output:machine.out Time Limits: 2000 ms M ...
- JZOJ 5307. 【NOIP2017提高A组模拟8.18】偷窃 (Standard IO)
5307. [NOIP2017提高A组模拟8.18]偷窃 (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Description ...
- JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 (Standard IO)
5286. [NOIP2017提高A组模拟8.16]花花的森林 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Descript ...
- 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 ...
- JZOJ 5230. 【NOIP2017模拟A组模拟8.5】队伍统计
5230. [NOIP2017模拟A组模拟8.5]队伍统计 (File IO): input:count.in output:count.out Time Limits: 1500 ms Memory ...
- 【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 ...
- 【NOIP2017提高A组模拟9.17】猫
[NOIP2017提高A组模拟9.17]猫 题目 Description 信息组最近猫成灾了! 隔壁物理组也拿猫没办法. 信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数) ...
- 【NOIP2017提高A组模拟9.17】组合数问题
[NOIP2017提高A组模拟9.17]组合数问题 题目 Description 定义"组合数"S(n,m)代表将n 个不同的元素拆分成m 个非空集合的方案数. 举个例子,将{1,2,3}拆分成2 个 ...
随机推荐
- [转]C#的扩展方法解说
C#的扩展方法解说 扩展方法的目的就是为一个现有类型添加一个方法,现有类型既可以是int,string等数据类型,也可以是自定义的数据类型. 为数据类型的添加一个方法的理解:一般来说,int数据类型有 ...
- Excel生成Oracle数据库表sql工具类
1.解决问题: 开发文档中字段比较多的时候,建表sql(Oracle下划线命名规范)比较麻烦,容易出错~~ (主要是懒) 特意手写一个工具,根据excel字段,生成建表的sql语句. ~~~末尾附Gi ...
- http response 过长 导致Connection reset
http response 过长(2W byte) 导致Connection reset
- iOS之CAShapeLayer属性简介
1.CAShapeLayer需要和贝塞尔曲线一块使用! #import <QuartzCore/CALayer.h> NS_ASSUME_NONNULL_BEGIN CA_CLASS_AV ...
- 转:linux中select()函数分析
源地址:http://blog.csdn.net/zi_jin/article/details/4214359 Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱 ...
- 用python打造简单的cms识别
代码 #!/usr/bin/env python3 # coding:utf-8 #lanxing #判断代码,判断是否安装requests库 try: import requests except: ...
- selenium 三种断言以及异常类型
selenium 提供了三种模式的断言:assert .verify.waitfor Assert 失败时,该测试将终止. Verify 失败时,该测试将继续执行,并将错误记入日显示屏 .也就是说允许 ...
- Chapter 6 排序
Chapter 6 排序 1- 直接插入排序 O(n2) O(1) 2- 折半插入排序 O(n2) O(1) 适合关键字较多 3- 希尔排序O(nlogn) O(1) 又名,缩小增量排序 ...
- Tomcat Add and Remove 项目时提示 Project facet Java version 1.8 is not supported 错误
原因:项目的jdk和tomcat的jdk版本不同 将eclipse-preference-server-runtime environments 点击你要用的tomcat 点击 edit-jre选择和 ...
- vue:使用不同参数跳转同一组件,实现动态加载图片和数据,以及利用localStorage和vuex持久化数据
需求:通过不同的参数复用同一组件,实现动态加载数据和图片,同时,在页面刷新时,图片依旧可以加载成功. 过程出现的bug和问题: 1.使用params传参后,再次刷新页面,参数丢失导致数据无法再次加载 ...