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. SQL Server 移动master 数据库

    第一步: 告诉SQL Server 下次启动时master数据库的文件在哪里!我想们一定想到了(这样做是不对的,它对master不起作用,第二步开始正确的做法) alter database mast ...

  2. block,inline,inline-block

    block元素的特点是: 总是在新行上开始: 高度,行高以及顶和底边距都可控制: 宽度缺省是它的容器的100%,除非设定一个宽度 <div>, <p>, <h1>, ...

  3. css案例学习之层叠样式

    代码 <html> <head> <title>层叠特性</title> <style type="text/css"> ...

  4. 解决Admob Banner首次展示不显示的问题

    Admob banner在第一次虽然加载成功了,但是却不显示.然后等待60秒刷新自动刷新,banner就能正常显示. 如果你没遇到过这种情况,那可能你用的不是集成在play-services里的库,因 ...

  5. Android消息推送之GCM方式(二)

    <声明> 转载请保留本来源地址: http://blog.csdn.net/wzg_1987/article/details/9148023 上一节讲了GCM方式实现前的一些必要准备工作, ...

  6. [ACM] hdu 1003 Max Sum(最大子段和模型)

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  7. 动画原理——绘画API

    书籍名称:HTML5-Animation-with-JavaScript 书籍源码:https://github.com/lamberta/html5-animation 1.canvas的conte ...

  8. Android App开之标注切图

    身为一个android开发狗,真是艰辛啊,适配不好做,Rom特性不好搞,连切图有时候都得自己上啊,设计师MM都不敢去惹呢,新技能Get开始. 其实,都是小case了,我有度娘和谷哥! 因为,有了psd ...

  9. C#用网易邮箱发送邮件(同步异步)

    SmtpClient smtpServer = new SmtpClient("smtp.163.com"); smtpServer.Port = ; smtpServer.Cre ...

  10. 解压tomcat后一闪而过的问题

    解压tomcat压缩包后,直接点击startup会出现一闪而过. 免安装的tomcat双击startup.bat后,启动窗口一闪而过,而且tomcat服务未启动. 原因是:在启动tomcat是,需要读 ...