codevs 3981 动态最大子段和
3981 动态最大子段和
题目还是简单一点好...
有n个数,a[1]到a[n]。
接下来q次查询,每次动态指定两个数l,r,求a[l]到a[r]的最大子段和。
子段的意思是连续非空区间。
第一行一个数n。
第二行n个数a[1]~a[n]。
第三行一个数q。
以下q行每行两个数l和r。
q行,每行一个数,表示a[l]到a[r]的最大子段和。
7
2 3 -233 233 -23 -2 233
4
1 7
5 6
2 5
2 3
441
-2
233
3
对于50%的数据,q*n<=10000000。
对于100%的数据,1<=n<=200000,1<=q<=200000。
a[1]~a[n]在int范围内,但是答案可能超出int范围。
数据保证1<=l<=r<=n。
空间128M,时间1s。
线段树求GSS模板题
一、一段长的区间的 GSS 有三种情况:
>1 完全在左子区间
>2 完全在右子区间
>3 横跨左右区间
二、需维护的信息:
max 区间GSS ——用来更新情况1、2
max_l 区间左端点开始的GSS——用来更新情况3
max_r 区间右端点开始的GSS——用来更新情况3
sum 区间和——用来更新max_l,max_r
三、建树
1、初始化:区间需维护的信息最初都赋为输入值
2、合并区间信息
max:3中情况中的最大值
max_l:左区间的max_l, 左区间的sum+右区间max_l 取大
max_r 同理
四、查询
情况1、2很简单
情况3的合并与上面的合并区间信息同理
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int n,m,opl,opr,cnt;
struct node
{
int l,r;
long long max,max_l,max_r,sum;
}e[];
void query(int k,long long & ans,long long & ans_l,long long & ans_r)
{
if(e[k].l>=opl&&e[k].r<=opr)
{
ans=e[k].max;
ans_l=e[k].max_l;
ans_r=e[k].max_r;
return;
}
int mid=e[k].l+e[k].r>>;
if(opr<=mid) query(k<<,ans,ans_l,ans_r);
else if(opl>mid) query((k<<)+,ans,ans_l,ans_r);
else
{
long long lch_max=,lch_max_r=,rch_max=,rch_max_l=,lch_max_l=,rch_max_r=;
query(k<<,lch_max,lch_max_l,lch_max_r);
query((k<<)+,rch_max,rch_max_l,rch_max_r);
ans=max(lch_max,rch_max);
ans=max(ans,lch_max_r+rch_max_l);
ans_l=max(lch_max_l,e[k<<].sum+rch_max_l);
ans_r=max(rch_max_r,e[(k<<)+].sum+lch_max_r);
}
}
void unionn(int k)
{
e[k].max=max(max(e[k<<].max,e[(k<<)+].max),e[k<<].max_r+e[(k<<)+].max_l);
e[k].max_l=max(e[k<<].max_l,e[k<<].sum+e[(k<<)+].max_l);
e[k].max_r=max(e[(k<<)+].max_r,e[(k<<)+].sum+e[k<<].max_r);
e[k].sum=e[k<<].sum+e[(k<<)+].sum;
}
void build(int k,int l,int r)
{
e[k].l=l,e[k].r=r;
if(l==r)
{
cin>>e[k].max;
e[k].max_l=e[k].max_r=e[k].sum=e[k].max;
return;
}
int mid=l+r>>;
build(k<<,l,mid);
build((k<<)+,mid+,r);
unionn(k);
}
int main()
{
scanf("%d",&n);
build(,,n);
scanf("%d",&m);
for(int i=;i<=m;i++)
{
scanf("%d%d",&opl,&opr);
long long ans=,ans_l=,ans_r=;
query(,ans,ans_l,ans_r);
printf("%lld\n",ans);
}
}
自己做的2个错误:
1、max_l的更新 : if 左区间的GSS是本身,max_l=max(左区间的max_l,左区间的sum+右区间的max_l)
else max_l=左区间的max_l
错因:例:左区间:5,8,-1,-1 右区间 1,1,1,1
错误方法的GSS=13 正确的GSS=15
2、在查询时ans,ans_l,ans_r的更新同max,max_l,max_r
因为max,max_l,max_r更新用到的左区间、右区间信息可以直接拿来用
而ans,ans_l,ans_r 更新用到的左区间、右区间信息不能直接拿来用,感觉比较棘手,实际只要在递归回溯时更新即可
codevs 3981 动态最大子段和的更多相关文章
- codevs 3981 动态最大子段和(线段树)
题目传送门:codevs 3981 动态最大子段和 题目描述 Description 题目还是简单一点好... 有n个数,a[1]到a[n]. 接下来q次查询,每次动态指定两个数l,r,求a[l]到a ...
- codevs3981动态最大子段和(线段树)
3981 动态最大子段和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 题目还是简单一点好... 有n个数,a ...
- codeVS 动态最大子段和
题目链接:戳我 对于最大子段和,我们只需要维护四个变量--maxl,maxr,maxs,sum(分别表示区间最大前缀子段和,区间最大后缀子段和,区间最大子段和,区间所有数的和) 然后合并的时候是这样的 ...
- [codevs3981]动态最大子段和不带修改(线段树)
解题关键:最大子段和需要多个信息维护. 注意查询时的pushup. #include<cstdio> #include<cstring> #include<algorit ...
- 线段树维护动态连续子段HDU1540
题意:http://acm.hdu.edu.cn/showproblem.php?pid=1540 #define IOS ios_base::sync_with_stdio(0); cin.tie( ...
- OI题目类型总结整理
## 本蒟蒻的小整理qwq--持续更新(咕咕咕) 数据结构 数据结构 知识点梳理 数据结构--线段树 推荐yyb dalao的总结--戳我 以后维护线段树还是把l,r写到struct里面吧,也别写le ...
- 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 ...
- acm算法模板(1)
1. 几何 4 1.1 注意 4 1.2 几何公式 4 1.3 多边形 6 1.4 多边形切割 9 1.5 浮点函数 10 1.6 面积 15 1.7 球面 16 1.8 三角形 17 1.9 三维几 ...
- ACM-ICPC竞赛模板
为了方便打印,不再将代码放到代码编辑器里,祝你好运. ACM-ICPC竞赛模板(1) 1. 几何 4 1.1 注意 4 1.2 几何公式 4 1.3 多边形 6 1.4 多边形切割 9 1.5 浮点函 ...
随机推荐
- I/HwPointEventFilter: do not support AFT because of no config
I/HwPointEventFilter: do not support AFT because of no config 这是华为对系统做了修改,默认不打印日志,要改配置 在拨号界面输入:以下进入工 ...
- 【CJOJ P1333】【HNOI2012】矿场搭建
[HNOI2012]矿场搭建 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖 ...
- Bugku的web题目(多次)的解题
这道题目我弄了好久,最后问了朋友,然后在朋友的帮助下,将flag找到了 这里写一下解题方法,记录一下 一进到这道题,看到了php?id=1,就很熟悉,很有可能是一道sql注入的题目,肯定是要试一下最简 ...
- CSS黄金三段--消除边框的影响
以前常常因为padding.margin等影响了整个边框的大小,只能傻傻的算大小.现在的黄金三段真的是帮了大忙了,下面的代码放在CSS相应的内容中,就可以使得边框的大小就是你设置的width的属性值. ...
- iptables 学习
本博客是学习慕课网课程 用iptables搭建一套强大的安全防护盾 整理而成 iptables相当于在ip层挂载一个hook point对用户进行控制 组成: 四张表+ 五条链(hook point) ...
- 关于AJAX异步请求的那些事儿(2)
1.使用AJAX发起GET请求消息 xhr.open("GET","XX.PHP?K1=V1$K2=V2",true); xhr.send(null); 2.使 ...
- java--Object类接受任意引用数据类型对象
java学习进展到类,首先就对万类之父Object类进行举例练习,这里我是对一维数组和接口用Object接受数组和接口. package test1; public class enum1 { pub ...
- 【django之博客系统开发】
一.项目简介 使用django开发一套博客系统,参考博客园. 需求如下: 项目结构: 二.全部代码 from django.db import models # Create your models ...
- 重命名Apache日志,新日志文件会放在哪里
重命名access.log为access.log.bak,请问新的apache日志会放在哪? 本文转自51cto的李导的博客2017-09-30-08:11:41 原创作品,允许转载,转载时请务必以超 ...
- Linux中断子系统:级联中断控制器驱动
Linux中断子系统 Linux中断子系统是个很大的话题,如下面的思维导图所示,包含硬件.驱动.中断上半部.中断下半部等等.本文着眼于中断控制器(PIC),特别是级联中断控制器驱动部分,对驱动的设计和 ...