题目描述 Description
给一个长度为N的序列以及Q的询问,每次两个参数l,r,问你序列[l,r]中的最大连续和
输入描述 Input Description

一行二个正整数N,Q。
  接下来一行N个整数,描述序列A。
  接下来Q行,每行两个参数L,R,描述一个询问。

输出描述 Output Description
对于每个询问,输出一行一个整数,描述答案。
样例输入 Sample Input
4 3
1 -2 3 2
1 4
1 2
2 2
样例输出 Sample Output
5
1
0
数据范围及提示 Data Size & Hint
测试点编号 数据范围及特殊说明
1,2,3 N,Q≤1000
4,5,6,7 N,Q≤10^5
8,9,10 N≤10^5,Q≤10^6

线段树。对于每个节点,维护三个值。sum,suml,sumr表示该点的最大连续和,最大前缀和和最大后缀和。

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long LL;
inline int read()
{
int x=,f=;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-;c=getchar();}
while(isdigit(c)){x=x*+c-'';c=getchar();}
return x*f;
}
const int oo=;
const int maxn=;
int n,q,a[maxn],x,y;
LL pre[maxn],sum[maxn],suml[maxn],sumr[maxn];
void build(int l,int r,int o)
{
if(l==r)
{
suml[o]=sumr[o]=sum[o]=pre[r]-pre[l-];
return;
}
int mid=(l+r)>>,lo=o<<,ro=lo+;
build(l,mid,lo);
build(mid+,r,ro);
sum[o]=max(sum[lo],sum[ro]);
sum[o]=max(sum[o],sumr[lo]+suml[ro]);
suml[o]=max(suml[lo],pre[mid]-pre[l-]+suml[ro]);
sumr[o]=max(sumr[ro],pre[r]-pre[mid]+sumr[lo]);
return;
}
LL queryl(int x,int y,int l,int r,int o)
{
if(x==l && y==r) return sumr[o];
int mid=(l+r)>>,lo=o<<,ro=lo+;
if(x>mid) return queryl(x,y,mid+,r,ro);
else
{
LL tmp=pre[r]-pre[mid]+queryl(x,mid,l,mid,lo);
return max(sumr[ro],tmp);
}
}
LL queryr(int x,int y,int l,int r,int o)
{
if(x==l && y==r) return suml[o];
int mid=(l+r)>>,lo=o<<,ro=lo+;
if(y<=mid) return queryr(x,y,l,mid,lo);
else
{
LL tmp=pre[mid]-pre[l-]+queryr(mid+,y,mid+,r,ro);
return max(suml[lo],tmp);
}
}
LL query(int x,int y,int l,int r,int o)
{
if(x<=l && y>=r)return sum[o];
int mid=(l+r)>>,lo=o<<,ro=lo+;
if(y<=mid) return query(x,y,l,mid,lo);
else if(x>mid) return query(x,y,mid+,r,ro);
else
{
LL ls,rs;
ls=queryl(x,mid,l,mid,lo);
rs=queryr(mid+,y,mid+,r,ro);
return max(max(query(x,mid,l,mid,lo),query(mid+,y,mid+,r,ro)),rs+ls);
}
}
int main()
{
freopen("sequence.in","r",stdin);
freopen("sequence.out","w",stdout);
n=read();q=read();
for(int i=;i<=n;i++)a[i]=read(),pre[i]=pre[i-]+a[i];
build(,n,);
while(q--)
{
x=read();y=read();
LL tmp=query(x,y,,n,);
if(tmp<)tmp=;
printf("%lld\n",tmp);
}
return ;
}

对于后三个点肯定没戏,毕竟线段树常数那么大。满分做法好像是整体二分,然而并不会,等着以后来填坑吧。

[冬令营Day1 T2]sequence的更多相关文章

  1. codevs 4511 信息传递(NOIP2015 day1 T2)

    4511 信息传递 NOIP2015 day1 T2 时间限制: 1 s 空间限制: 128000 KB 传送门 题目描述 Description 有个同学(编号为 1 到)正在玩一个信息传递的游戏. ...

  2. 【NOIP2016 Day1 T2】天天爱跑步

    题目传送门:https://www.luogu.org/problemnew/show/P1600 感觉这两天在处理边界问题上有点神志不清......为了从80的暴力变成100,花了整整一个下午+一个 ...

  3. 3728 联合权值[NOIP 2014 Day1 T2]

    来源:NOIP2014 Day1 T2 OJ链接: http://codevs.cn/problem/3728/ https://www.luogu.org/problemnew/show/P1351 ...

  4. [NOIP2016 DAY1 T2]天天爱跑步-[差分+线段树合并][解题报告]

    [NOIP2016 DAY1 T2]天天爱跑步 题面: B[NOIP2016 DAY1]天天爱跑步 时间限制 : - MS 空间限制 : 565536 KB 评测说明 : 2s Description ...

  5. 【NOIP2016】DAY1 T2 天天爱跑步

    [NOIP2016]DAY1 T2 天天爱跑步 Description 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.?天天爱跑步?是一个养成类游戏,需要玩家每天按时 ...

  6. 国庆集训 Day1 T2 生成图 DP

    国庆集训 Day1 T2 生成图 现在要生成一张\(n\)个点的有向图.要求满足: 1.若有 a->b的边,则有 b->a 的边 2.若有 a->b 的边和 b->c 的边,则 ...

  7. 【 NOIP2015 DAY1 T2 信息传递】带权并查集

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

  8. 【NOIP2015提高组】 Day1 T2 信息传递

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

  9. 【NOIP 2016】Day1 T2 天天爱跑步

    Problem Description 小 C 同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任 ...

随机推荐

  1. 推荐一款万年历App 诸葛万年历

    推荐一款万年历App 诸葛万年历 1 介绍 应用简介: 提供标准和专业的时间信息查询,记录和承载生活中的美好记忆,帮助用户高效快捷的管理个人时间.精美的日期展示和完善的重要事件提醒功能,可以方便安排日 ...

  2. guava(一)Preconditions

    工具类 就是封装平常用的方法,不需要你重复造轮子,节省开发人员时间,提高工作效率.谷歌作为大公司,当然会从日常的工作中提取中很多高效率的方法出来.所以就诞生了guava.. 高效设计良好的API,被G ...

  3. 微软 Azure DevOps Server 2019 Update 1 (TFS 2019.1)

    1.概述 微软在2019年5月发布Azure DevOps Server 2019后不到2个月的时间里,就快速准备好了第一个升级包(2019 Update 1),并计划在几周后发布正式版本.也许你还没 ...

  4. Python 遍历目录下的子目录和文件

    import os A: 遍历目录下的子目录和文件 for root,dirs ,files in os.walk(path) root:要访问的路径名 dirs:遍历目录下的子目录 files:遍历 ...

  5. layer弹出框,zIndex不断增加的问题

    针对layer弹出框每次进行弹出操作时z-index不断加1的问题,手动设置过zIndex值不管用,每次关闭时清空layer对象也不管用. 解决办法: 修改layer.js,,将红框代码改为绿框代码, ...

  6. Can't locate Math/Round.pm in @INC

    遭遇报错: Can't locate Math/Round.pm in @INC 经过亲自测试,下面的命令解决了我的问题. yum install perl-Math-Round 参考资料 ===== ...

  7. Java 常用知识点汇总(数据类型之间转换、字符串的相关操作-截取、转换大小写等)

    1.Java四类八种数据类型 byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围- ...

  8. RabbitMQ实例C#

    驱动组件.NET版本 官网推荐驱动:RabbitMQ.Client https://www.rabbitmq.com/devtools.html#dotnet-dev Connection和Chann ...

  9. Mysql char(10) 与 varchar(10)的区别

    DROP TABLE test_string; ), col_varchar )); INSERT INTO `test_string` VALUES ('mysql', 'mysql'); 在创建数 ...

  10. Prometheus 运维监控

    Prometheus 运维监控 1.Prometheus 介绍详解 2.Prometheus 安装部署 3.Prometheus 配置文件详解 4.Prometheus PromSQL 常用资源 5. ...