[LA_3938]最大连续动态和


Sample Input
3 1
1 2 3
1 1
Sample Output
Case 1:
1 1
线段树
L,R表示该区间的左右端点,sum表示该区间值的总和
l,r表示该区间连续的最大和的左右端点,maxall表示该区间的连续最大和
maxqj表示该区间的前缀连续最大和(即val[L]必取),qj表示该区间的前缀连续最大和右端点
maxhj表示该区间的后缀连续最大和(即val[R]必取),hj表示该区间的前缀连续最大和左端点
更新maxall:分3类讨论
1.连续最大和在左子树 或 几种情况中连续最大和相等且这种情况的连续最大和的左端点较小或相等
取左子树的连续最大和及端点
2.连续最大和在左右两子树 或 几种情况中连续最大和相等且这种情况的连续最大和的左端点较小
取左子树的后缀连续最大和加右子树的前缀连续最大和
3.连续最大和在右子树
取有子树的连续最大和及端点
更新maxqj:分两类讨论
1.前缀连续最大和在左右两子树
取左子树的区间值的总和加右子树的前缀连续最大和及端点
2.前缀连续最大和在左子树 或 几种情况中前缀连续最大和相等
取左子树的前缀连续最大和及端点
更新maxhj:分两类讨论
1.后缀连续最大和在左右两子树 或 几种情况中后缀连续最大和相等
取右子树的区间值的总和加左子树的后缀连续最大和及端点
2.后缀连续最大和在右子树
取右子树的后缀连续最大和及端点
更新sum:把左右两子树的sum加起来
对于[a,b],我们用分治的思想,分三种情况讨论:
1.[a,b]在左子树,对左子树递归调用
2.[a,b]在右子树,对右子树递归调用
3.[a,b]在左右子树,对[a,mid],[mid+1,b]分别递归调用
t1(结构体)表示左子树返回的东西,t2表示右子树返回的东西,t表示该子树返回的东西
很明显,对于t的更新,和上面对tree的更新一模一样
如果当前区间与线段树中某区间重合,直接返回线段树中该区间存的内容即可
记得long long
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
int val[],n,m;
struct xxx{
int L,R;
int l,r,qj,hj;
ll sum,maxqj,maxhj,maxall;
}tree[];
inline int read(){
int x;bool f;char c;
for (f=; (c=getchar())<''||c>''; f=c=='-');
for (x=c-''; (c=getchar())>=''&&c<=''; x=(x<<)+(x<<)+c-'');
return f?-x:x;
}
void pushup(int x)
{
ll x1=tree[x<<].maxall,x2=tree[x<<].maxhj+tree[x<<|].maxqj,x3=tree[x<<|].maxall;
if(x1>=x3&&(x1>x2||x1==x2&&tree[x<<].l<=tree[x<<].hj))
tree[x].maxall=x1,tree[x].l=tree[x<<].l,tree[x].r=tree[x<<].r;
else if(x2>=x3)
tree[x].maxall=x2,tree[x].l=tree[x<<].hj,tree[x].r=tree[x<<|].qj;
else
tree[x].maxall=x3,tree[x].l=tree[x<<|].l,tree[x].r=tree[x<<|].r;
if(tree[x<<].sum+tree[x<<|].maxqj>tree[x<<].maxqj)
tree[x].maxqj=tree[x<<].sum+tree[x<<|].maxqj,tree[x].qj=tree[x<<|].qj;
else
tree[x].maxqj=tree[x<<].maxqj,tree[x].qj=tree[x<<].qj;
if(tree[x<<|].sum+tree[x<<].maxhj>=tree[x<<|].maxhj)
tree[x].maxhj=tree[x<<|].sum+tree[x<<].maxhj,tree[x].hj=tree[x<<].hj;
else
tree[x].maxhj=tree[x<<|].maxhj,tree[x].hj=tree[x<<|].hj;
tree[x].sum=tree[x<<].sum+tree[x<<|].sum;
}
void build(int x,int l,int r)
{
if(l==r)
{
tree[x].sum=tree[x].maxqj=tree[x].maxhj=tree[x].maxall=(ll)val[l];
tree[x].l=tree[x].r=tree[x].qj=tree[x].hj=tree[x].L=tree[x].R=l;return;
}
tree[x].L=l;tree[x].R=r;
int mid=(l+r)>>;
build(x<<,l,mid);build(x<<|,mid+,r);pushup(x);
//cout<<l<<" "<<r<<" "<<tree[x].maxall<<" "<<tree[x].l<<" "<<tree[x].r<<tree[x].hj<<endl;
}
xxx query(int x,int l,int r)
{
if(l==tree[x].L&&r==tree[x].R)return tree[x];
int mid=(tree[x].L+tree[x].R)/;
if(r<=mid)return query(x<<,l,r);
else if(l>mid)return query(x<<|,l,r);
else
{
xxx t1=query(x<<,l,mid),t2=query(x<<|,mid+,r),t;
ll x1=t1.maxall,x2=t1.maxhj+t2.maxqj,x3=t2.maxall;
if(x1>=x3&&(x1>x2||x1==x2&&t1.l<=t1.hj))
t.maxall=x1,t.l=t1.l,t.r=t1.r;
else if(x2>=x3)
t.maxall=x2,t.l=t1.hj,t.r=t2.qj;
else
t.maxall=x3,t.l=t2.l,t.r=t2.r;
if(t1.sum+t2.maxqj>t1.maxqj)
t.maxqj=t1.sum+t2.maxqj,t.qj=t2.qj;
else
t.maxqj=t1.maxqj,t.qj=t1.qj;
if(t2.sum+t1.maxhj>=t2.maxhj)
t.maxhj=t2.sum+t1.maxhj,t.hj=t1.hj;
else
t.maxhj=t2.maxhj,t.hj=t2.hj;
return t;
} }
int main()
{
int T=;
while(~scanf("%d%d",&n,&m))
{
T++;
for(int i=;i<=n;i++)val[i]=read();
build(,,n);
printf("Case %d:\n",T);
for(int i=;i<=m;i++)
{
int a=read(),b=read();
xxx x=query(,a,b);
printf("%d %d\n",x.l,x.r);
}
}
return ;
}
[LA_3938]最大连续动态和的更多相关文章
- 把连续动态bmp转换为avi
把动态bmp24转换为avi BYTE tmp_buf[1024*768*4]; //生成avi void BMPtoAVI(CString szAVIName, CString strBmpDir) ...
- 腾讯技术分享:GIF动图技术详解及手机QQ动态表情压缩技术实践
本文来自腾讯前端开发工程师“ wendygogogo”的技术分享,作者自评:“在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦.” 1.GIF格式的历史 GIF ( Gr ...
- Unity 重要基础知识点
这是两个月前的学习记录,发出来了下,如果有误欢迎大家指出: 脚本生命周期 //每当脚本被加载时调用一次 // 1. 在Awake中做一些初始化操作 void Awake(){ //初始化publi ...
- 堆栈指针 ---delete 使用
对拥有堆中一个有效对象的地址的指针进行删除操作的结果,是将这个堆内存的状态从“使用中” 变为“可用”(此时的可用就是指可以调用内存)释放了,可以再次覆盖此处;; 对指针内存进行删除操作后,指针 ...
- I帧 B帧 p帧 IDR帧的区别
转自:http://blog.csdn.net/sphone89/article/details/8086071 IDR(Instantaneous Decoding Refresh)--即时解码刷新 ...
- 论Collision Detection的作用
今天有空就仔细研究了一下Collision Detection的问题,以前总是弄不明白Continuous和Continuous Dynamic到底有什么区别,今天算是彻底弄明白了,官方文档说的太晦涩 ...
- [原]Unity3D深入浅出 - 物理引擎之刚体部件(Rigidbody)
在虚拟世界中,任何物体都是没有活力的,要想变的真实,Rigidbody是必不可少的组件,下面介绍Rigidbody的各个属性: Mass:质量 Drag:阻力,对象在运动时遇到的空气阻力,0表示没有空 ...
- iOS-直播开发(开发从底层做起)
一直在忙, 也没写过几次播客! 但一直热衷于直播开发技术, 公司又不是直播方向的, 所以就年前忙里偷袭研究了一下直播开发, 然后翻阅了很多大神的技术博客等, 写了一个简单的Demo, 又根据网上大神们 ...
- 浓缩的才是精华:浅析GIF格式图片的存储和压缩
成文迪, 在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦. GIF格式的历史 GIF(Graphics Interchange Format)原义是"图像互换 ...
随机推荐
- Apache2服务配置ubuntu16.04+django1.11
话不多说直接上步骤 环境 Ubuntu 16.04 Python 3.5.2 Django 1.11 Apache 2.4 1.Apache2安装 sudo apt-get install apach ...
- 裸机——RTC
1. 首先晓得RTC的基本知识 RTC被划分到timer,但RTC是面向时间点的. 如果按照定时器的思路去思考,那么应该考虑 时间周期 和 计数值. RTC 不是面向时间点的,所以略有不同, 时间周期 ...
- TensorFlow验证码识别
本节我们来用 TensorFlow 来实现一个深度学习模型,用来实现验证码识别的过程,这里我们识别的验证码是图形验证码,首先我们会用标注好的数据来训练一个模型,然后再用模型来实现这个验证码的识别. 验 ...
- Android 第三方库RxLifecycle使用
1.简单介绍RxLifecycle 1.1.使用原因. 在使用rxjava的时候,如果没有及时解除订阅,在退出activity的时候,异步线程还在执行. 对activity还存在引用,此时就会产生内存 ...
- 9 Django 模型层(2) --多表操作
创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系( ...
- 自定义控件的getChildCount
我真的是一步一步走过来,看过来的代码.不是能力问题,而是他们用的,我没用过,我用的他们不用.然后一句一句的问为什么,然后一句一句的去想为什么. 只有这样,才能慢慢的熟悉,东一榔头西一棒子,不是分模块再 ...
- USACO Section2.2 Subset Sums 解题报告 【icedream61】
subset解题报告------------------------------------------------------------------------------------------ ...
- 24、php知识点总结基础教程--part-2
1.表单处理 ①post请求 <html> <body> <form action="welcome.php" method="post&q ...
- MySQL隐式转换测试
Preface There're various data type in MySQL such as number,string,date,time,lob,etc.The data ...
- BATCH梯度下降,单变量线性回归