博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
另一个画风的GSS1 - Can you answer these queries I(猫树)
阅读量:7227 次
发布时间:2019-06-29

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

前言

其实我觉得你看猫锟的解释也看不懂(主要是还有一些不良心的讲解者不讲清楚,当然这里不是针对了qwq)

Solution

考虑我们的线段树是个啥玩意?

每一层都是一堆区间叠在一起。
我们在每一个节点维护的又是什么?
左边的max,右边的max,中间的max,还有sum。
那么我们改变一下:
\(p_{dps,i}\)表示在深度为\(dps\)的线段树上\(i\)这个节点所在区间的左边的max,右边的max,然后就可以在\(build\)的时候求

再令\(p_{dps,i}\)表示在深度为\(dps\)的线段树上\(i\)这个节点所在区间的到中间的\(max\),然后也可以在\(build\)的时候求。

然后就可以\(\Theta(1)\)的询问就好了。

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define ll long long#define re register#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)inline int gi(){ int f=1,sum=0;char ch=getchar(); while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();} return f*sum;}const int N=500010;int pos[N],p[21][N],s[21][N],a[N],Log2[N<<3],n;void build(int o,int l,int r,int dps){ if(l==r) { pos[l]=o; return; } int mid=(l+r)>>1,pre,sm; p[dps][mid]=s[dps][mid]=sm=pre=a[mid]; if(sm<0)sm=0; for(int i=mid-1;i>=l;i--) { sm+=a[i];pre+=a[i]; s[dps][i]=max(s[dps][i+1],pre); p[dps][i]=max(p[dps][i+1],sm); if(sm<0)sm=0; } p[dps][mid+1]=s[dps][mid+1]=sm=pre=a[mid+1]; if(sm<0)sm=0; for(int i=mid+2;i<=r;i++) { sm+=a[i];pre+=a[i]; s[dps][i]=max(s[dps][i-1],pre); p[dps][i]=max(p[dps][i-1],sm); if(sm<0)sm=0; } build(o<<1,l,mid,dps+1); build(o<<1|1,mid+1,r,dps+1);}int query(int l,int r){ if(l==r)return a[l]; int dps=Log2[pos[l]]-Log2[pos[l]^pos[r]]; return max(max(p[dps][l],p[dps][r]),s[dps][l]+s[dps][r]);}int main(){ n=gi(); for(int i=1;i<=n;i++)a[i]=gi(); int L=2; while(L
<<=1; for(int i=2;i<=L<<1;i++)Log2[i]=Log2[i>>1]+1; build(1,1,L,1); int m=gi(); while(m--) { int l=gi(),r=gi(); printf("%d\n",query(l,r)); } return 0;}

转载于:https://www.cnblogs.com/mle-world/p/10268053.html

你可能感兴趣的文章
九曲黄河万里沙,浪淘风簸自天涯 — 正则表达式
查看>>
欲哭无泪,联想笔记本性价比
查看>>
很简单的在Ubuntu系统下安装字体和切换默认字体的方法
查看>>
我的友情链接
查看>>
dojo框架用hitch实现函数与上下文的绑定
查看>>
ubuntu编译安装vim7.4
查看>>
python之利用PIL库实现页面的图片验证码及缩略图
查看>>
IP-COM设置×××
查看>>
VPC配置案例
查看>>
十年IT运维谈(五):要专业化还是平台化?
查看>>
分享超级给力的一个外发光Shader
查看>>
oblog_4.6_SQL 语句
查看>>
通过Git WebHooks+脚本实现自动更新发布代码之shell脚本
查看>>
对象实例化、字符串的使用方法
查看>>
keepalived基于LVS实现高可用,实现web服务的高可用
查看>>
80端口被Microsoft-HTTPAPI/2.0占用的解决办法
查看>>
无法抗拒Minecraft给予超高的自由度和探索-微访谈
查看>>
数据结构之串
查看>>
我的友情链接
查看>>
lvs+keepalived+nginx+tomcat高可用高性能集群部署
查看>>