博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【JZOJ5231】【NOIP2017模拟A组模拟8.5】序列问题 线段树
阅读量:5264 次
发布时间:2019-06-14

本文共 2192 字,大约阅读时间需要 7 分钟。

题面

1146820-20170806114402209-64008841.png

100

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

枚举了左端点之后,需要知道以这个左端点为起点的前缀max,前缀min。
这里只讨论前缀max,前缀min同理。
当我们倒序枚举左端点的时候,这个前缀max就可以用线段树来维护:
左端点向左移一位到i——
首先我们要预处理出a[i]向右第一个比他小的,以及第一个比他大的。
然后就相当于是区间赋值,并在线段树中维护好每一位的min和max积之和。
时间复杂度为\(O(nlogn)\)

code

#include
#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
v2 || r
=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 && 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;}

转载于:https://www.cnblogs.com/hiweibolu/p/7294322.html

你可能感兴趣的文章
Linux中防火墙centos
查看>>
mysql新建用户,用户授权,删除用户,修改密码
查看>>
FancyCoverFlow
查看>>
JS博客
查看>>
如何设置映射网络驱动器的具体步骤和方法
查看>>
ASP.NET WebApi 基于OAuth2.0实现Token签名认证
查看>>
283. Move Zeroes把零放在最后面
查看>>
Visual Studio Code 打开.py代码报Linter pylint is not installed解决办法
查看>>
Python 数据类型
查看>>
S5PV210根文件系统的制作(一)
查看>>
centos下同时启动多个tomcat
查看>>
slab分配器
查看>>
数据清洗
查看>>
【读书笔记】C#高级编程 第三章 对象和类型
查看>>
针对sl的ICSharpCode.SharpZipLib,只保留zip,gzip的流压缩、解压缩功能
查看>>
【转】代码中特殊的注释技术——TODO、FIXME和XXX的用处
查看>>
【SVM】libsvm-python
查看>>
Jmeter接口压力测试,Java.net.BindException: Address already in use: connect
查看>>
Leetcode Balanced Binary Tree
查看>>
九.python面向对象(双下方法内置方法)
查看>>