http://www.spoj.com/problems/GSS1/

题意:无更新询问区间最大连续和。

做法:线段树每个节点维护sum[rt],maxsum[rt],lsum[rt],rsum[rt],分别区间和、区间最大和、区间左端最大和和区间右端最大和。

  查询时按从左到右扫,维护ans为最大连续和,rans为到该段的右端最大连续和,扫到每一段时有:

  ans = max(ans,maxsum[rt]);

  ans = max(ans,rans+lsum[rt]);
  rans = max(rsum[rt],rans+sum[rt]);

 /*
*Author: Zhaofa Fang
*Created time: 2013-09-05-22.18 星期四
*/
#include <cstdio>
#include <cstdlib>
#include <sstream>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <string>
#include <utility>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std; typedef long long ll;
typedef pair<int,int> PII;
#define DEBUG(x) cout<< #x << ':' << x << endl
#define FOR(i,s,t) for(int i = (s);i <= (t);i++)
#define FORD(i,s,t) for(int i = (s);i >= (t);i--)
#define REP(i,n) for(int i=0;i<(n);i++)
#define REPD(i,n) for(int i=(n-1);i>=0;i--)
#define PII pair<int,int>
#define PB push_back
#define ft first
#define sd second
#define lowbit(x) (x&(-x))
#define INF (1<<30)
#define eps (1e-8) #define lson l , m , rt<<1
#define rson m + 1 , r , rt<<1|1
const int maxn = ;
int sum[maxn<<],maxsum[maxn<<],lsum[maxn<<],rsum[maxn<<];
int rans,ans;
void pushUp(int l,int r,int rt){
sum[rt] = sum[rt<<] + sum[rt<<|];
maxsum[rt] = max(maxsum[rt<<],maxsum[rt<<|]);
maxsum[rt] = max(maxsum[rt],rsum[rt<<]+lsum[rt<<|]);
lsum[rt] = max(lsum[rt<<],sum[rt<<]+lsum[rt<<|]);
rsum[rt] = max(rsum[rt<<|],sum[rt<<|]+rsum[rt<<]);
}
void build(int l,int r,int rt){
if(l == r){
scanf("%d",&sum[rt]);
lsum[rt] = rsum[rt] = maxsum[rt] = sum[rt];
return;
}
int m = (l + r) >> ;
build(lson);
build(rson);
pushUp(l,r,rt);
}
void query(int L,int R,int l,int r,int rt){
if(L <= l && r <= R){
ans = max(ans,maxsum[rt]);
ans = max(ans,rans+lsum[rt]);
rans = max(rsum[rt],rans+sum[rt]);
return;
}
int m = (l + r) >> ;
if(L <= m)query(L,R,lson);
if(m < R)query(L,R,rson);
}
int main(){
//freopen("in","r",stdin);
//freopen("out","w",stdout);
int n;
while(~scanf("%d",&n)){
build(,n,);
int Q;
scanf("%d",&Q);
while(Q--){
int l,r;
scanf("%d%d",&l,&r);
ans = rans = -INF;
query(l,r,,n,);
printf("%d\n",ans);
}
}
return ;
}

http://www.spoj.com/problems/GSS3/

题意:更新单点,询问区间最大连续和。

做法:做法与GSS1差不多,多了个修改。

 /*
*Author: Zhaofa Fang
*Created time: 2013-09-13-12.56 星期五
*/
#include <cstdio>
#include <cstdlib>
#include <sstream>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <string>
#include <utility>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std; typedef long long ll;
typedef pair<int,int> PII;
#define DEBUG(x) cout<< #x << ':' << x << endl
#define FOR(i,s,t) for(int i = (s);i <= (t);i++)
#define FORD(i,s,t) for(int i = (s);i >= (t);i--)
#define REP(i,n) for(int i=0;i<(n);i++)
#define REPD(i,n) for(int i=(n-1);i>=0;i--)
#define PII pair<int,int>
#define PB push_back
#define ft first
#define sd second
#define lowbit(x) (x&(-x))
#define INF (1<<30)
#define eps (1e-8) #define lson l , m , rt<<1
#define rson m + 1 , r , rt<<1|1 const int maxn = ;
int sum[maxn<<],lsum[maxn<<],rsum[maxn<<],mx[maxn<<]; void pushUp(int rt){
sum[rt] = sum[rt<<] + sum[rt<<|];
mx[rt] = max(mx[rt<<],mx[rt<<|]);
mx[rt] = max(mx[rt],rsum[rt<<] + lsum[rt<<|]); lsum[rt] = max(lsum[rt<<],sum[rt<<] + lsum[rt<<|]);
rsum[rt] = max(rsum[rt<<|],sum[rt<<|]+rsum[rt<<]);
}
void build(int l,int r,int rt){
if(l == r){
scanf("%d",&sum[rt]);
mx[rt] = lsum[rt] = rsum[rt] = sum[rt];
return ;
}
int m = (l + r) >> ;
build(lson);
build(rson);
pushUp(rt);
}
void update(int k,int val,int l,int r,int rt){
if(l == k && k == r){
mx[rt] = lsum[rt] = rsum[rt] = sum[rt] = val;
return;
}
int m = (l + r) >> ;
if(k <= m)update(k,val,lson);
else update(k,val,rson);
pushUp(rt);
}
int ans,lans;
void query(int L,int R,int l,int r,int rt){
if(L <= l && r <= R){
ans = max(ans,mx[rt]);
ans = max(ans,lans+lsum[rt]);
lans = max(lans+sum[rt],rsum[rt]);
return;
}
int m = (l + r) >> ;
if(L <= m)query(L,R,lson);
if(m < R)query(L,R,rson);
}
int main(){
//freopen("in","r",stdin);
//freopen("out","w",stdout);
int n;
while(~scanf("%d",&n)){
build(,n,);
int Q;
scanf("%d",&Q);
while(Q--){
int op,x,y;
scanf("%d%d%d",&op,&x,&y);
if(!op)update(x,y,,n,);
else {
ans = lans = -INF;
query(x,y,,n,);
printf("%d\n",ans);
}
}
}
return ;
}

SPOJ GSS1 && GSS3 (无更新/更新单点,并询问区间最大连续和)的更多相关文章

  1. spoj gss1 gss3

    传送门 gss1 gss3 spoj gss系列=最大字段和套餐 gss1就是gss3的无单点修改版 有区间查询和单点修改,考虑用线段树维护 我们要维护区间权值和\(s\),区间最大前缀和\(xl\) ...

  2. HDU - 1754 线段树-单点修改+询问区间最大值

    这个也是线段树的经验问题,待修改的,动态询问区间的最大值,只需要每次更新的时候,去把利用子节点的信息进行修改即可以. 注意更新的时候区间的选择,需要对区间进行二分. #include<iostr ...

  3. SPOJ - GSS1&&GSS3

    GSS1 #include<cstdio> #include<iostream> #define lc k<<1 #define rc k<<1|1 u ...

  4. SPOJ GSS1 & GSS3&挂了的GSS5

    线段树然后yy一下,搞一搞. GSS1: 题意:求最大区间和. #include <cstdio> #include <algorithm> using namespace s ...

  5. [转]jquery 点击表格变为input可以修改无刷新更新数据

    原文地址:http://www.freejs.net/article_biaodan_43.html 之前已经发了2篇类似的文章<点击变td为input更新>和<jquery表格可编 ...

  6. window.history.pushState与ajax实现无刷新更新页面url

    ajax能无刷新更新数据,但是不能更新url HTML5的新API: window.history.pushState, window.history.replaceState 用户操作history ...

  7. POJ 2155 Matrix (二维线段树入门,成段更新,单点查询 / 二维树状数组,区间更新,单点查询)

    题意: 有一个n*n的矩阵,初始化全部为0.有2中操作: 1.给一个子矩阵,将这个子矩阵里面所有的0变成1,1变成0:2.询问某点的值 方法一:二维线段树 参考链接: http://blog.csdn ...

  8. Python之路【第十篇】:HTML -暂无等待更新

    Python之路[第十篇]:HTML -暂无等待更新

  9. Python之路,Day25-----暂无正在更新中

    Python之路,Day25-----暂无正在更新中

随机推荐

  1. LINUX用户管理——/etc/passwd文件详解

      输入vi /etc/passwd 可以查看此文件的内容 .本机内容如下: [root@localhost ~]# vi /etc/passwdroot:x:0:0:root:/root:/bin/ ...

  2. centos6.4 ceph安装部署之ceph block device

    1,prelight/preface ceph storage clusterceph block deviceceph filesystemceph object storage 此篇记录ceph ...

  3. Subsequence(暴力+二分)

    Subsequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10875   Accepted: 4493 Desc ...

  4. js的this几种用法

    1.普通的函数调用 此时指的是全局对象 function aaa(){ this.x=1;}aaa();alert(x) 2.对象内的方法this调用 此时指的是上一级对象 var aaa={ zz: ...

  5. SSIS之Foreach循环容器用法

    要实现的业务:A数据库服务器上某库的T_GOODS_DECL的状态字段“Is_Delete”标记为“1”的时候删除B数据库服务器上对应库的T_GOODS_DECL表中的记录,二者的主键为“DECL_N ...

  6. Android源码大全

    JavaApk-安卓应用游戏APP源码下载 - Android App Games Source Download. http://www.javaapk.com/  700多个 Android 例子 ...

  7. SQL 字段里有逗号隔开的数据的取值

    table 1 : id code1 0012 001,0023 001,002,003 table 2:code name001 数学002 体育003 美术 要求结果 id name1 数学2 数 ...

  8. getopt()函数

    在讨论这个函数之前我们先理解两个概念:选项及其参数 gcc -o program program.c 在上述命令中 -o 就是其选项 program就是参数. getopt(): 头文件: #incl ...

  9. Android BaseAdapter

    ListView显示与缓存机制:      只会加载当前屏幕所要显示的数据.显示完成就会被回收到Recycler中.       BaseAdapter 基本结构:      public int g ...

  10. jQuery中的类型判断

    在JQuery中有一个type方法,在1.11.2中是这样写的 var class2type = {}; var toString = class2type.toString; jQuery.each ...