GSS系列
GSS1
直接维护静态区间和即可
#include<bits/stdc++.h>
using namespace std;
const int N=;
int n,a[N];
struct Seg_Tree{int lmax,rmax,dat,sum;}tr[N<<];
inline void pushup(int k){
tr[k].sum=tr[k<<].sum+tr[k<<|].sum;
tr[k].lmax=max(tr[k<<].lmax,tr[k<<].sum+tr[k<<|].lmax);
tr[k].rmax=max(tr[k<<|].rmax,tr[k<<|].sum+tr[k<<].rmax);
tr[k].dat=max(max(tr[k<<].dat,tr[k<<|].dat),tr[k<<].rmax+tr[k<<|].lmax);
}
inline void build(int k,int l,int r){
if(l==r)return tr[k].lmax=tr[k].rmax=tr[k].dat=tr[k].sum=a[l],void();
int mid=(l+r)>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
pushup(k);
}
inline Seg_Tree query(int k,int l,int r,int x,int y){
if(x<=l&&r<=y)return tr[k];
int mid=(l+r)>>;
if(x>mid)return query(k<<|,mid+,r,x,y);
if(y<=mid)return query(k<<,l,mid,x,y);
Seg_Tree a=query(k<<,l,mid,x,y),b=query(k<<|,mid+,r,x,y),ans;
ans.sum=a.sum+b.sum;
ans.lmax=max(a.lmax,a.sum+b.lmax);
ans.rmax=max(b.rmax,b.sum+a.rmax);
ans.dat=max(max(a.dat,b.dat),a.rmax+b.lmax);
return ans;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
build(,,n);
int q,l,r;
scanf("%d",&q);
while(q--){
scanf("%d%d",&l,&r);
printf("%d\n",query(,,n,l,r).dat);
}
}
GSS3
加入单点查询就好了
#include<bits/stdc++.h>
using namespace std;
const int N=;
int n,a[N];
struct Seg_Tree{int lmax,rmax,dat,sum;}tr[N<<];
inline void pushup(int k){
tr[k].sum=tr[k<<].sum+tr[k<<|].sum;
tr[k].lmax=max(tr[k<<].lmax,tr[k<<].sum+tr[k<<|].lmax);
tr[k].rmax=max(tr[k<<|].rmax,tr[k<<|].sum+tr[k<<].rmax);
tr[k].dat=max(max(tr[k<<].dat,tr[k<<|].dat),tr[k<<].rmax+tr[k<<|].lmax);
}
inline void build(int k,int l,int r){
if(l==r)return tr[k].lmax=tr[k].rmax=tr[k].dat=tr[k].sum=a[l],void();
int mid=(l+r)>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
pushup(k);
}
inline Seg_Tree query(int k,int l,int r,int x,int y){
if(x<=l&&r<=y)return tr[k];
int mid=(l+r)>>;
if(x>mid)return query(k<<|,mid+,r,x,y);
if(y<=mid)return query(k<<,l,mid,x,y);
Seg_Tree a=query(k<<,l,mid,x,y),b=query(k<<|,mid+,r,x,y),ans;
ans.sum=a.sum+b.sum;
ans.lmax=max(a.lmax,a.sum+b.lmax);
ans.rmax=max(b.rmax,b.sum+a.rmax);
ans.dat=max(max(a.dat,b.dat),a.rmax+b.lmax);
return ans;
}
inline void change(int k,int l,int r,int x,int v){
if(x>r||x<l)return;
if(l==r&&l==x)return tr[k].lmax=tr[k].rmax=tr[k].dat=tr[k].sum=v,void();
int mid=(l+r)>>;
change(k<<,l,mid,x,v);
change(k<<|,mid+,r,x,v);
pushup(k);
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
build(,,n);
int q,t,l,r;
scanf("%d",&q);
while(q--){
scanf("%d%d%d",&t,&l,&r);
if(t)printf("%d\n",query(,,n,l,r).dat);
else change(,,n,l,r);
}
}
GSS系列的更多相关文章
- SPOJ GSS 系列
来怒做GSS系列了: GSS1:https://www.luogu.org/problemnew/show/SP1043 这题就是维护一个 sum , mx , lmx , rmx,转移时用结构体就好 ...
- spoj GSS系列简要题解
文章目录 GSS1 GSS2 GSS3 GSS4 GSS5 GSS6 GSS7 GSS8 传送门 这个GSSGSSGSS系列全部是跟子段有关的数据结构菜题. 于是来水一篇博客. GSS1 传送门 题意 ...
- SPOJ GSS系列
众所周知的仅次于ynoi的毒瘤数据结构系列.(跟Qtree系列并列?) GSS1: 长度为 $n$ 的序列 $a$,$m$ 个询问,每次询问区间 $[l,r]$ 之间的最大子段和. $1\le n,m ...
- SPOJ GSS系列(数据结构维护技巧入门)
题目链接 GSS $GSS1$ 对于每个询问$l$, $r$,查询$a_{l}$, $a_{l+1}$, $a_{l+2}$, ..., $a_{r}$这个序列的最大字段和. 建立线段树,每个节点维护 ...
- GSS 系列题解
GSS GSS1 随便猫树或者线段树,就可以过了 猫树不说,线段树可以维护左边最大,右边最大,区间最大,区间值然后就做出来了. //Isaunoya #pragma GCC optimize(2) # ...
- 激!GSS系列
#include <cstdio> ; ; inline int max(int, int); inline int getint(); inline void putint(int); ...
- GSS系列(1)——GSS1&&GSS3
题意:询问一个区间内的最大连续子段和(GSS1),并且有单点修改的操作(GSS2). 思路:这个题目在老人家的大白鼠里出现过,不过那个是求两个下标,并且相同取更小值.——传的东西更多,判断也稍微繁琐一 ...
- GSS系列题解——最大子段和系列
开坑啦! 2019 3/28 以前一直不知道怎么搞最大子段和,如今终于可以学习,其实真的很简单啊. 2019 3/29 树链剖分上最大子段和也OK啦 前置技能:线段树 题目大意:询问区间[l,r]的最 ...
- SPOJ GSS3 线段树系列1
SPOJ GSS系列真是有毒啊! 立志刷完,把线段树搞完! 来自lydrainbowcat线段树上的一道例题.(所以解法参考了lyd老师) 题意翻译 n 个数, q 次操作 操作0 x y把 Ax 修 ...
随机推荐
- xx.exe 中的 0x014180bd 处有未经处理的异常: 0xC0000005: 读取位置 0xfeeefeee 时发生访问冲突(当指针访问异常时,应考虑是不是对象未创建)。
xx.exe 中的 0x014180bd 处有未经处理的异常: 0xC0000005: 读取位置 0xfeeefeee 时发生访问冲突
- Java并发-CopyOnWriteArrayList
前言 今天我们一起学习下java.util.concurrent并发包里的CopyOnWriteArrayList工具类.当有多个线程可能同时遍历.修改某个公共数组时候,如果不希望因使用synchro ...
- 「Sqlserver」数据分析师有理由爱Sqlserver之九-无利益关系推荐Sqlserver书单
在前面系列文章的讲述下,部分读者有兴趣进入Sqlserver的世界的话,笔者不太可能在自媒体的载体上给予全方位的带领,最合适的方式是通过系统的书籍来学习,此篇给大家梳理下笔者曾经看过的自觉不错值得推荐 ...
- TP框架基础 (二) ---空控制器和空操作
通过之前的学习我们知道了index.php是一个入口文件,如果没有这个入口文件的话,我们需要自己创建! [视图模板文件创建] 视图模板文件存放发位置在: 里面没有模板文件 如果我们想要访问Login控 ...
- linux初学者-延迟及定时任务篇
linux初学者-延迟及定时任务篇 在linux系统的学习工作中,南面会遇到需要延迟进行的任务和需要定时去完成的任务,就像手机的闹钟一样,这时候就需要用到linux系统当中的系统延迟和定时任务的设置了 ...
- 02、HTML 基础
1.HTML 标题 HTML 标题(Heading)是通过<h1> - <h6> 标签来定义的. <!DOCTYPE html> <html> < ...
- 用margin还是padding ?
margin是用来隔开元素与元素的间距:padding是用来隔开元素与内容的间隔. margin用于布局分开元素使元素与元素互不相干:padding用于元素与内容之间的间隔,让内容(文字)与(包裹)元 ...
- 给定一个IP地址,转化为二进制32位,再转化为十进制,写出一个方法让其十进制转为IP地址
十进制是已知的数值 第一种方法: <script type="text/javascript"> var num=2148140545; var str=num.toS ...
- CSS和html如何结合起来——选择符及优先级
1.选择符 兼容性 统配选择符 * 元素选择符 body 类选择符 .class id选择符 #id 包含原则符 p strong (所有 ...
- iOS开发 8小时时差问题
今天调试遇到时间计算的问题,发现怎么算都会有差别,后来仔细观察,发现有8小时的时差…… 这篇文章解释的很好,用到了,因此记之. ios有关时间打印出来差8小时的问题