codevs3981动态最大子段和(线段树)
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 横跨左右区间
前两种情况可使用子区间的 GSS,但如何处理第三种情况?
注意到我们可以把区间拆成两部分,这两部分是不相关的。
所以我们需要维护一个区间的“最大左子段和”和“最大右子段和”。
gss = MAX{l.gss,r.gss,l.rgss + r.lgss}
由 GSS 一直推下来,对于每个节点,我们一共需要设计4个状态。
1 GSS:最大子段和
2 LGSS:最大左子段和
3 RGSS:最大右子段和
4 SUM:整段和
这里我用了结构体存储(元元真厉害啊!)
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
#define maxn 2000010 using namespace std;
ll n,a[maxn],q,x,y,ans;
struct node{
ll l,r,dis,mx,lmx,rmx;
}tre[maxn>>]; ll init()
{
ll x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} void build(int now,ll l,ll r)
{
tre[now].l=l;tre[now].r=r;
if(l==r)
{
tre[now].dis=init();
tre[now].lmx=tre[now].rmx=tre[now].mx=tre[now].dis;
return ;
}
ll mid=(l+r)>>;
build(now<<,l,mid);
build(now<<|,mid+,r);
//下面是重点之一,要注意。
tre[now].lmx=max(tre[now<<].lmx,tre[now<<].dis+tre[now<<|].lmx);
tre[now].rmx=max(tre[now<<|].rmx,tre[now<<|].dis+tre[now<<].rmx);
tre[now].mx=max(tre[now<<].rmx+tre[now<<|].lmx,max(tre[now<<].mx,tre[now<<|].mx));
tre[now].dis=tre[now<<].dis+tre[now<<|].dis;
} node query(int now,ll l,ll r)
{
node ans;
if(l==tre[now].l&&r==tre[now].r) return tre[now];
ll mid=(tre[now].l+tre[now].r)>>;
if(l>mid) return query(now<<|,l,r);
else if(r<=mid) return query(now<<,l,r);
else//就是这里咋也不会写,递归找边界思路不清晰
{
node lch=query(now<<,l,mid);
node rch=query(now<<|,mid+,r);
ans.lmx=max(lch.lmx,lch.dis+rch.lmx);
ans.rmx=max(rch.rmx,rch.dis+lch.rmx);
ans.mx=max(max(lch.mx,rch.mx),lch.rmx+rch.lmx);
}
return ans;
}
int main()
{
n=init();
build(,,n);
q=init();
for(int i=;i<=q;i++)
{
x=init();y=init();
printf("%lld\n",query(,x,y).mx);
}
return ;
}
codevs3981动态最大子段和(线段树)的更多相关文章
- 【BZOJ3295】动态逆序对(线段树,树状数组)
[BZOJ3295]动态逆序对(线段树,树状数组) 题面 Description 对于序列A,它的逆序对数定义为满足iAj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的 ...
- 指针-动态开点&合并线段树
一个知识点不在一道题里说是没有灵魂的 线段树是用来处理区间信息的咯 但是往往因为需要4倍空间让许多人退却,而动态开点的线段树就非常棒 仿佛只用2倍就可以咯 指针保存位置,即节点信息,是很舒适的,所以用 ...
- BZOJ 4636 (动态开节点)线段树
思路: 偷懒 懒得离散化 搞了个动态开节点的线段树 (其实是一样的--..) 注意会有a=b的情况 要判掉 //By SiriusRen #include <cstdio> #includ ...
- zoj 2112 Dynamic Rankings 动态第k大 线段树套Treap
Dynamic Rankings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/show ...
- LA 3938 动态最大连续和 线段树
题目链接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...
- Luogu P4643 【模板】动态dp(矩阵乘法,线段树,树链剖分)
题面 给定一棵 \(n\) 个点的树,点带点权. 有 \(m\) 次操作,每次操作给定 \(x,y\) ,表示修改点 \(x\) 的权值为 \(y\) . 你需要在每次操作之后求出这棵树的最大权独立集 ...
- [BZOJ3638 && BZOJ3272]带修区间不相交最大K子段和(线段树模拟费用流)
https://www.cnblogs.com/DaD3zZ-Beyonder/p/5634149.html k可重区间集问题有两种建图方式,可能这一种才可以被线段树优化. 换个角度看,这也是一个类似 ...
- luoguU60884 【模板】动态点分治套线段树
题目连接:https://www.luogu.org/problemnew/show/U60884 题意:有N个点,标号为1∼N,用N−1条双向带权通道连接,保证任意两个点能互相到达. Q次询问,问从 ...
- AcWing1264. 动态求连续区间和 (线段树做法)
1.题目 给定 n 个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列 [a,b] 的连续和. 输入格式 第一行包含两个整数 n 和 m,分别表示数的个数和操作次数. 第二行包含 n ...
随机推荐
- 07Html、CSS
07Html.CSS-2018/07/17 1.HTML是用来描述网页的一种标记语言,是一套标记标签.HTML用使用标记标签来描述网页.超文本 标记语言. 2.格式 <html> < ...
- NOIP 2018 真・退役记
目录 NOIp 2018 真・退役记 7.01 7.05 \(summary\) 7.12 7.18 7.26 - 7.27 8.2 8.3 8.3 8.7 8.9 8.20 8.24 8.27 8. ...
- centos7修改时间和时区
设置时区同样, 在 CentOS 7 中, 引入了一个叫 timedatectl 的设置设置程序. 用法很简单: # timedatectl # 查看系统时间方面的各种状态 Local time: 四 ...
- Multisim破解教程
转载:http://www.121down.com/article/article_52879.html
- intel compiler的表现
好久没弄这个东西,今天突然想试下,代码没写完,以后补. #include <stdio.h> #include <stdlib.h> #include <time.h&g ...
- F - Shooter
UVA___10535 The shooter is in a great problem. He is trapped in a “2D” maze with a laser gun and can ...
- [luoguP1901] 发射站(单调栈)
传送门 呵呵 ——代码 #include <cstdio> #include <iostream> #define N 1000010 #define LL long long ...
- jQuery中事情的动态绑定 (转)
小弟初来乍到,还弄不清楚如何添加链接 这是我转别人的,原文地址:http://blog.csdn.net/zhuyong0722/article/details/8590815#comments ...
- codeforces gym 100357 K (表达式 模拟)
题目大意 将一个含有+,-,^,()的表达式按照运算顺序转换成树状的形式. 解题分析 用递归的方式来处理表达式,首先直接去掉两边的括号(如果不止一对全部去光),然后找出不在括号内且优先级最低的符号.如 ...
- 0213微信ZABBIX报警
简介 微信作为日常使用最频繁的工具,因此希望将微信接入zabbix报警. 微信企业号 1.申请微信企业号 申请后,请在“我的企业”页面下记录企业号的CorpID 2.添加通讯录 部门添加完成后,根据实 ...