题目传送门:codevs 3981 动态最大子段和

题目描述 Description

题目还是简单一点好...

有n个数,a[1]到a[n]。

接下来q次查询,每次动态指定两个数l,r,求a[l]到a[r]的最大子段和。

子段的意思是连续非空区间。

输入描述 Input Description

第一行一个数n。

第二行n个数a[1]~a[n]。

第三行一个数q。

以下q行每行两个数l和r。

输出描述 Output Description

q行,每行一个数,表示a[l]到a[r]的最大子段和。

样例输入 Sample Input

7
2 3 -233 233 -23 -2 233
4
1 7
5 6
2 5
2 3

样例输出 Sample Output

441
-2
233
3

数据范围及提示 Data Size & Hint

对于50%的数据,q*n<=10000000。

对于100%的数据,1<=n<=200000,1<=q<=200000。

a[1]~a[n]在int范围内,但是答案可能超出int范围。

数据保证1<=l<=r<=n。

空间128M,时间1s。

题目大意:

  求解区间 a[l]~a[r] 的最大子段和

解题思路:

  用线段树维护区间最大值。开几个变量存区间和sum,完全在左区间的最大值max_l,完全在右区间的最大值max_r,跨左右区间的最大值max。

 #include <bits/stdc++.h>
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
using namespace std;
const int N = + ;
typedef long long int ll;
struct node
{
int l,r;
ll max_,max_l,max_r,sum;
} a[N<<];
int n,q,x,y;
ll ans;
void up(int rt)
{
a[rt].max_=max(max(a[rt<<].max_,a[rt<<|].max_),a[rt<<].max_r+a[rt<<|].max_l);
a[rt].max_l=max(a[rt<<].max_l,a[rt<<].sum+a[rt<<|].max_l);
a[rt].max_r=max(a[rt<<|].max_r,a[rt<<|].sum+a[rt<<].max_r);
a[rt].sum=a[rt<<].sum+a[rt<<|].sum;
}
void build(int rt,int l,int r)
{
a[rt].l=l,a[rt].r=r;
if (l==r)
{
scanf("%lld",&a[rt].max_);
a[rt].max_l=a[rt].max_r=a[rt].sum=a[rt].max_;
return ;
}
int mid = (l+r)>>;
build(lson);
build(rson);
up(rt);
}
void query(int rt,int L,int R,ll &ans,ll &ansl,ll &ansr)
{
if (L<=a[rt].l&&a[rt].r<=R)
{
ans=a[rt].max_;
ansl=a[rt].max_l;
ansr=a[rt].max_r;
return ;
}
int mid=(a[rt].l+a[rt].r)>>;
if (mid>=R) query(rt<<,L,R,ans,ansl,ansr);
else if (mid<L) query(rt<<|,L,R,ans,ansl,ansr);
else
{
ll lans=,lansl=,lansr=,rans=,ransl=,ransr=;
query(rt<<,L,R,lans,lansl,lansr);
query(rt<<|,L,R,rans,ransl,ransr);
ans=max(max(lans,rans),lansr+ransl);
ansl=max(lansl,ransl+a[rt<<].sum);
ansr=max(ransr,lansr+a[rt<<|].sum);
}
}
int main()
{
scanf("%d",&n);
build(,,n);
for ( scanf("%d",&q); q; q--)
{
scanf("%d%d",&x,&y);
ll ans=,ansl=,ansr=;
query(,x,y,ans,ansl,ansr);
printf("%lld\n",ans);
}
return ;
}

codevs 3981 动态最大子段和(线段树)的更多相关文章

  1. codevs 3981 动态最大子段和

    3981 动态最大子段和 http://codevs.cn/problem/3981/    题目等级 : 钻石 Diamond   题目描述 Description 题目还是简单一点好... 有n个 ...

  2. 【BZOJ3295】动态逆序对(线段树,树状数组)

    [BZOJ3295]动态逆序对(线段树,树状数组) 题面 Description 对于序列A,它的逆序对数定义为满足iAj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的 ...

  3. 指针-动态开点&合并线段树

    一个知识点不在一道题里说是没有灵魂的 线段树是用来处理区间信息的咯 但是往往因为需要4倍空间让许多人退却,而动态开点的线段树就非常棒 仿佛只用2倍就可以咯 指针保存位置,即节点信息,是很舒适的,所以用 ...

  4. BZOJ 4636 (动态开节点)线段树

    思路: 偷懒 懒得离散化 搞了个动态开节点的线段树 (其实是一样的--..) 注意会有a=b的情况 要判掉 //By SiriusRen #include <cstdio> #includ ...

  5. zoj 2112 Dynamic Rankings 动态第k大 线段树套Treap

    Dynamic Rankings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/show ...

  6. LA 3938 动态最大连续和 线段树

    题目链接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...

  7. Luogu P4643 【模板】动态dp(矩阵乘法,线段树,树链剖分)

    题面 给定一棵 \(n\) 个点的树,点带点权. 有 \(m\) 次操作,每次操作给定 \(x,y\) ,表示修改点 \(x\) 的权值为 \(y\) . 你需要在每次操作之后求出这棵树的最大权独立集 ...

  8. [BZOJ3638 && BZOJ3272]带修区间不相交最大K子段和(线段树模拟费用流)

    https://www.cnblogs.com/DaD3zZ-Beyonder/p/5634149.html k可重区间集问题有两种建图方式,可能这一种才可以被线段树优化. 换个角度看,这也是一个类似 ...

  9. luoguU60884 【模板】动态点分治套线段树

    题目连接:https://www.luogu.org/problemnew/show/U60884 题意:有N个点,标号为1∼N,用N−1条双向带权通道连接,保证任意两个点能互相到达. Q次询问,问从 ...

随机推荐

  1. CODE FESTIVAL 2017 qual B C 3 Steps(补题)

    总感觉这题是个题意杀,理解错题目了,看了好久才发现题目意思:操作是让,只要两点没有直接相连,而且只要有一条路的距离3,就可以把这两点连接起来. 按照题解中讲的,可以把图分为二分图和非二分图来解.不过题 ...

  2. PHP程序员技术职业生涯,你是如何规划的?

    职业规划是这样的 看到很多PHP程序员职业规划的文章,都是直接上来就提Linux.PHP.MySQL.Nginx.Redis.Memcache.jQuery这些,然后就直接上手搭环境.做项目,中级就是 ...

  3. 2018-10-19-Nuget-通过-dotnet-命令行发布

    title author date CreateTime categories Nuget 通过 dotnet 命令行发布 lindexi 2018-10-19 09:15:53 +0800 2018 ...

  4. vue用法父组件调用子组件方法--->$refs

    vue下载excel模板(放入弹框独立出来)后再导入表格 子组件 <el-dialog title="导入" :visible.sync="dialogVisibl ...

  5. 5-1rquests模拟登陆知乎之httpcode

    1,状态码: 400错误:请求无效 (Bad request);出现这个请求无效报错说明请求没有进入到后台服务里 2,requests库:python常用的库,有空仔细阅读一下官方文档

  6. Server,Servlet,ServletConfig,ServletContext,Session,Request,Response

    Server流程 解析URL->找到应用->找到Servlet->实例化Servlet->调用init->调用service->返回响应->调用destroy ...

  7. 正则&转义字符&特殊字符

    正则 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 由于正则表达式主要应用对 ...

  8. spring的几个面试题

    Spring 是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性.Spring 官网:https://spring.io/. 我们一般说 Spring 框架指的都是 Spring Fr ...

  9. 【37.48%】【hdu 2587】How far away ?(3篇文章,3种做法,LCA之Tarjan算法)

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  10. vue移动端图片上传压缩

    上传压缩方法 import {api} from '../../api/api.js'; import axios from 'axios'; export function imgPreview ( ...