SPOJ GSS1 && GSS3 (无更新/更新单点,并询问区间最大连续和)
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 (无更新/更新单点,并询问区间最大连续和)的更多相关文章
- spoj gss1 gss3
传送门 gss1 gss3 spoj gss系列=最大字段和套餐 gss1就是gss3的无单点修改版 有区间查询和单点修改,考虑用线段树维护 我们要维护区间权值和\(s\),区间最大前缀和\(xl\) ...
- HDU - 1754 线段树-单点修改+询问区间最大值
这个也是线段树的经验问题,待修改的,动态询问区间的最大值,只需要每次更新的时候,去把利用子节点的信息进行修改即可以. 注意更新的时候区间的选择,需要对区间进行二分. #include<iostr ...
- SPOJ - GSS1&&GSS3
GSS1 #include<cstdio> #include<iostream> #define lc k<<1 #define rc k<<1|1 u ...
- SPOJ GSS1 & GSS3&挂了的GSS5
线段树然后yy一下,搞一搞. GSS1: 题意:求最大区间和. #include <cstdio> #include <algorithm> using namespace s ...
- [转]jquery 点击表格变为input可以修改无刷新更新数据
原文地址:http://www.freejs.net/article_biaodan_43.html 之前已经发了2篇类似的文章<点击变td为input更新>和<jquery表格可编 ...
- window.history.pushState与ajax实现无刷新更新页面url
ajax能无刷新更新数据,但是不能更新url HTML5的新API: window.history.pushState, window.history.replaceState 用户操作history ...
- POJ 2155 Matrix (二维线段树入门,成段更新,单点查询 / 二维树状数组,区间更新,单点查询)
题意: 有一个n*n的矩阵,初始化全部为0.有2中操作: 1.给一个子矩阵,将这个子矩阵里面所有的0变成1,1变成0:2.询问某点的值 方法一:二维线段树 参考链接: http://blog.csdn ...
- Python之路【第十篇】:HTML -暂无等待更新
Python之路[第十篇]:HTML -暂无等待更新
- Python之路,Day25-----暂无正在更新中
Python之路,Day25-----暂无正在更新中
随机推荐
- 1.2 linear SVM 推导
1.将公式中的distance具体化 将$w_0$单独抽出作为$b$,$w=(w_1,...,w_n),x=(x_1,...,x_n)$ 则分割平面为:$w^Tx+b=0$ A.证明w为法向量 ...
- 循环对XML文档添加Attribute以及移除Element 【转】
如下面的图片要求,需要把左边的xml文改为右边的文档. 需要添加Attribute,移除Element,但是所添加的Attribute值已经跟被移除的Element值不相同.实现方法可以参考<对 ...
- 如何用C#把Doc文档转换成rtf格式
先在项目引用里添加上对Microsoft Word 9.0 object library的引用 using System; namespace DocConvert { class DoctoRtf ...
- jQuery特效 隔行变色
1.通过使用onmouseover onmouseout方法 2.变色使用background-color(css)属性 3.变色的标签是td(tr仅仅能使用事件,颜色样式不起作用) 第一种方法 使用 ...
- 自定义ASP.NET WebApplication中调用SharePoint2010的对象
如果你是做SharePoint开发的话,一定不会对如下这段代码陌生: using(SPSite oSiteCollection = new SPSite("http://Server_Nam ...
- 排序算法 -- 数据结构与算法的javascript描述 第12章
排序是常见的功能,给定一组数据,对其进行排序. 在此之前,我们需要准备个基础工作--自动生成数组,并可以对该组数据做任何处理. /** * 测试类 ,数组 * @param numElements * ...
- JavaScript小知识点(一)
JavaScript 有3种方式定义对象 ① var i = { function-x:function{ //todo }}; 这是通过Json方式定义一个函数对象. ② function P ...
- @property和@synthesize
main.m #import <Foundation/Foundation.h> #import "Student.h" int main(int argc, cons ...
- 剑指offier第4题
/* 问题1:替换字符串,是在原来的字符串上做替换,还是新开辟一个字符串做替换! 问题2:在当前字符串替换,怎么替换才更有效率(不考虑java里现有的replace方法). 从前往后替换,后面的字符要 ...
- Storm基础理论
Storm流式计算基础 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB" ...