SPOJ - GSS1&&GSS3




GSS1
#include<cstdio>
#include<iostream>
#define lc k<<1
#define rc k<<1|1
using namespace std;
const int M=1e5+,N=M<<;
struct sgt{
int sum,gss,lgss,rgss;
}tr[N];
int n,m,a[N];
void updata(int k){
tr[k].sum=tr[lc].sum+tr[rc].sum;
tr[k].lgss=max(tr[lc].lgss,tr[lc].sum+tr[rc].lgss);
tr[k].rgss=max(tr[rc].rgss,tr[rc].sum+tr[lc].rgss);
tr[k].gss=max(max(tr[lc].gss,tr[rc].gss),tr[lc].rgss+tr[rc].lgss);
}
void build(int k,int l,int r){
if(l==r){
tr[k].sum=tr[k].gss=tr[k].lgss=tr[k].rgss=a[l];
return ;
}
int mid=l+r>>;
build(lc,l,mid);
build(rc,mid+,r);
updata(k);
}
sgt query(int k,int l,int r,int x,int y){
if(l==x&&r==y) return tr[k];
int mid=l+r>>;
if(y<=mid) return query(lc,l,mid,x,y);
else if(x>mid) return query(rc,mid+,r,x,y);
else{
sgt left,right,result;
left=query(lc,l,mid,x,mid);
right=query(rc,mid+,r,mid+,y);
result.sum=left.sum+right.sum;
result.lgss=max(left.lgss,left.sum+right.lgss);
result.rgss=max(right.rgss,right.sum+left.rgss);
result.gss=max(max(left.gss,right.gss),left.rgss+right.lgss);
return result;
}
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
build(,,n);
scanf("%d",&m);
for(int i=,x,y;i<=m;i++){
scanf("%d%d",&x,&y);
printf("%d\n",query(,,n,x,y).gss);
}
return ;
}
GSS3
#include<cstdio>
#include<iostream>
#define lc k<<1
#define rc k<<1|1
using namespace std;
const int M=1e5+,N=M<<;
struct sgtment{
int sum,gss,lgss,rgss;
}tr[N];
int n,m,a[N];
void updata(int k){
tr[k].sum=tr[lc].sum+tr[rc].sum;
tr[k].lgss=max(tr[lc].lgss,tr[lc].sum+tr[rc].lgss);
tr[k].rgss=max(tr[rc].rgss,tr[rc].sum+tr[lc].rgss);
tr[k].gss=max(max(tr[lc].gss,tr[rc].gss),tr[lc].rgss+tr[rc].lgss);
}
void build(int k,int l,int r){
if(l==r){
tr[k].sum=tr[k].gss=tr[k].lgss=tr[k].rgss=a[l];
return ;
}
int mid=l+r>>;
build(lc,l,mid);
build(rc,mid+,r);
updata(k);
}
void change(int k,int l,int r,int pos,int val){
if(l==r){
tr[k].sum=tr[k].gss=tr[k].lgss=tr[k].rgss=val;
return ;
}
int mid=l+r>>;
if(pos<=mid) change(lc,l,mid,pos,val);
else change(rc,mid+,r,pos,val);
updata(k);
}
sgtment query(int k,int l,int r,int x,int y){
if(l==x&&r==y) return tr[k];
int mid=l+r>>;
if(y<=mid) return query(lc,l,mid,x,y);
else if(x>mid) return query(rc,mid+,r,x,y);
else{
sgtment left,right,result;
left=query(lc,l,mid,x,mid);
right=query(rc,mid+,r,mid+,y);
result.sum=left.sum+right.sum;
result.lgss=max(left.lgss,left.sum+right.lgss);
result.rgss=max(right.rgss,right.sum+left.rgss);
result.gss=max(max(left.gss,right.gss),left.rgss+right.lgss);
return result;
}
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
build(,,n);
scanf("%d",&m);
for(int i=,opt,x,y;i<=m;i++){
scanf("%d%d%d",&opt,&x,&y);
if(opt) printf("%d\n",query(,,n,x,y).gss);
else change(,,n,x,y);
}
return ;
}
SPOJ - GSS1&&GSS3的更多相关文章
- spoj gss1 gss3
传送门 gss1 gss3 spoj gss系列=最大字段和套餐 gss1就是gss3的无单点修改版 有区间查询和单点修改,考虑用线段树维护 我们要维护区间权值和\(s\),区间最大前缀和\(xl\) ...
- SPOJ GSS1 && GSS3 (无更新/更新单点,并询问区间最大连续和)
http://www.spoj.com/problems/GSS1/ 题意:无更新询问区间最大连续和. 做法:线段树每个节点维护sum[rt],maxsum[rt],lsum[rt],rsum[rt] ...
- SPOJ GSS1 & GSS3&挂了的GSS5
线段树然后yy一下,搞一搞. GSS1: 题意:求最大区间和. #include <cstdio> #include <algorithm> using namespace s ...
- SPOJ GSS1 - Can you answer these queries I(线段树维护GSS)
Can you answer these queries I SPOJ - GSS1 You are given a sequence A[1], A[2], -, A[N] . ( |A[i]| ≤ ...
- [题解] SPOJ GSS1 - Can you answer these queries I
[题解] SPOJ GSS1 - Can you answer these queries I · 题目大意 要求维护一段长度为 \(n\) 的静态序列的区间最大子段和. 有 \(m\) 次询问,每次 ...
- GSS系列(1)——GSS1&&GSS3
题意:询问一个区间内的最大连续子段和(GSS1),并且有单点修改的操作(GSS2). 思路:这个题目在老人家的大白鼠里出现过,不过那个是求两个下标,并且相同取更小值.——传的东西更多,判断也稍微繁琐一 ...
- SPOJ - GSS1 —— 线段树 (结点信息合并)
题目链接:https://vjudge.net/problem/SPOJ-GSS1 GSS1 - Can you answer these queries I #tree You are given ...
- SPOJ GSS1 Can you answer these queries I[线段树]
Description You are given a sequence A[1], A[2], ..., A[N] . ( |A[i]| ≤ 15007 , 1 ≤ N ≤ 50000 ). A q ...
- SPOJ GSS1 Can you answer these queries I
Time Limit: 115MS Memory Limit: 1572864KB 64bit IO Format: %lld & %llu Description You are g ...
随机推荐
- 洛谷 P 1133 教主的花园
题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树 ...
- 应用defineProperty简单实现vue的双向数据绑定
双向数据绑定简易版本如何应用defineProperty的getter setter 方法 有这样HTML片段 <input type="text" id="dem ...
- css3 实现居中的9中方法
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 标准C程序设计七---112
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- mkdir(): No such file or directory
mkdir(): No such file or directory php创建目录时提示没有文件或目录, (1)先检查目录权限: (2)细看mkdir()的用法: 定义和用法: mkdir() 函数 ...
- Objective-C日期相关工具方法
//date根据formatter转换成string +(NSString*)dateToString:(NSString *)formatter date:(NSDate *)date { NSDa ...
- ASP 500错误解决方法
最有效的解决方法: 经 c:\windows\temp 目录增加everyone写权限. 环境: windows2008
- Java 基础【06】复合赋值运算
这是今天在开发当中遇到的问题,虽然不是很大,但还是花了一点时间去琢磨. 嗯,好了.先看一段源代码 short value=2; value-=2; 源码就是上面这个样子的,我动手写的时候因为理解的问题 ...
- openlayer3 加载geoserver发布的WFS服务
转自原文 openlayer3加载geoserver发布的WFS服务 openlayers3调用GeoServer发布的wfs 1 参考一 1.1 问题 openlayer3加载WFS存在跨域问题,需 ...
- 【Todo】各种语言里面的for循环 & loop
会的语言多了,不同语言的语法就会混淆.整理了一下. Java里面: 普通的for循环之外: 有以下格式: for (int x : intarr) { } JS里面: }; for (x in per ...