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 ;
}

最新文章

  1. shell脚本二
  2. scala基础语法(变量,数据类型,函数)
  3. Java设计模式-装饰模式(Decorator)
  4. 记录把方法添加到 JavaScript 对象不明白的地方
  5. SharePoint 沙盒解决方案 VS 场解决方案
  6. 最牛逼的的shell命令
  7. 基于KVM建立虚拟机的步骤及总结说明
  8. 找出并解决 JavaScript 和 Dojo 引起的浏览器内存泄露问题
  9. HDU 5572 An Easy Physics Problem (计算几何+对称点模板)
  10. koa 学习1
  11. ifconf家族命令
  12. react-navigation实现页面框架(转载)
  13. javase中javax源码下载地址
  14. PostgreSQL 保存json,jsonb类型
  15. HDU 1561 The more, The Better (有依赖背包 || 树形DP)
  16. lintcode-158-两个字符串是变位词
  17. [洛谷P3527] [POI2011]MET-Meteors
  18. Android架构分析之Android消息处理机制(一)
  19. C#非泛型集合和泛型集合
  20. EF使用延迟加载的本质原因

热门文章

  1. C语言真正的编译过程(4个步骤~~预编译,编译,汇编,连接)
  2. 亲手搭建一个基于Asp.Net WebApi的项目基础框架2
  3. React-router4简约教程
  4. 【转】灰色在PPT中的运用
  5. shell编程——参数传递
  6. python学习笔记二:流程控制
  7. sql的nvl()函数
  8. linux系统下怎么关闭一个端口
  9. 使用BootStrapValidator来完成前端输入验证
  10. CentOS 6.3 下 vsftp搭建