题意:求一个动态区间的最大连续和。

静态版本的O(n)算法显示不适用了,但是可以用线段树分治,因为一个连续和要在两边的区间,要么跨越两边,对于一个结点维护最大前缀和,后缀和,子区间连续和。

题目要求输出区间,所以还要保存连续和最大的区间,以及前缀和,后缀和的位置。为了维护最大前缀和以及后缀和还需要一个区间和。

写的时候稍微麻烦一点,更新写成一个函数会方便很多。还好一遍过了。。。

#include<bits/stdc++.h>
using namespace std; const int maxn = 5e5+;
typedef long long ll;
struct Seg
{
ll pre,suf,sub,sum;
int l,r,pr,sl;
}tr[maxn<<];
#define lid (id<<1)
#define rid (id<<1|1)
int n,m,a[maxn];
int ql,qr; void updata(Seg&u,Seg&v1,Seg&v2)
{
if(v1.pre >= v1.sum+v2.pre){//y
u.pr = v1.pr; u.pre = v1.pre;
}else {
u.pr = v2.pr; u.pre = v1.sum+v2.pre;
} if(v2.suf <= v2.sum+v1.suf){//x
u.sl = v1.sl; u.suf = v2.sum+v1.suf;
}else {
u.sl = v2.sl; u.suf = v2.suf;
} if(v1.sub >= v2.sub){
u.l = v1.l; u.r = v1.r; u.sub = v1.sub;
}else {
u.l = v2.l; u.r = v2.r; u.sub = v2.sub;
}
if(u.sub < v1.suf+v2.pre || (u.sub == v1.suf+v2.pre && (u.l>v1.sl ||(u.l == v1.sl && u.r > v2.pr) ) ) ){
u.sub = v1.suf+v2.pre; u.l = v1.sl; u.r = v2.pr;
} u.sum = v1.sum + v2.sum;
} void build(int l = ,int r = n,int id = )
{
  if(l == r) {
     Seg &u = tr[id];
u.pre = u.suf = u.sub = u.sum = a[l];
u.l = u.r = u.pr = u.sl = l;
return;
}
int mid = (l+r)>>, lc = lid, rc = rid;
build(l,mid,lc);
build(mid+,r,rc);
updata(tr[id],tr[lc],tr[rc]); } Seg query(int l = ,int r = n, int id = )
{
if(ql<=l&&r<=qr) { return tr[id]; }
int mid = (l+r)>>, lc = lid, rc = rid;
Seg ret;
if(ql<=mid && mid<qr){
Seg L = query(l,mid,lc), R = query(mid+,r,rc);
updata(ret,L,R);
return ret;
}
if(qr <= mid) {
return query(l,mid,lc);
}
return query(mid+,r,rc);
} int main()
{
//freopen("in.txt","r",stdin);
int kas = ;
while(~scanf("%d%d",&n,&m)){
for(int i = ; i <= n; i++) scanf("%d",a+i);
build();
printf("Case %d:\n",++kas);
while(m--){
int x,y; scanf("%d%d",&x,&y);
ql = x,qr = y;
Seg ans = query();
printf("%d %d\n",ans.l,ans.r);
}
}
return ;
}

UVALive 3938 Ray, Pass me the dishes! (动态最大连续和)的更多相关文章

  1. uvalive 3938 "Ray, Pass me the dishes!" 线段树 区间合并

    题意:求q次询问的静态区间连续最大和起始位置和终止位置 输出字典序最小的解. 思路:刘汝佳白书 每个节点维护三个值 pre, sub, suf 最大的前缀和, 连续和, 后缀和 然后这个题还要记录解的 ...

  2. UVALive 3938 - "Ray, Pass me the dishes!" - [最大连续子列和+线段树]

    题目链接:https://cn.vjudge.net/problem/UVALive-3938 参考刘汝佳书上说的: 题意: 给出一个长度为n的序列, 再给出m个询问, 每个询问是在序列 $[a,b] ...

  3. UvaLA 3938 "Ray, Pass me the dishes!"

                            "Ray, Pass me the dishes!" Time Limit: 3000MS   Memory Limit: Unkn ...

  4. UVA 1400."Ray, Pass me the dishes!" -分治+线段树区间合并(常规操作+维护端点)并输出最优的区间的左右端点-(洛谷 小白逛公园 升级版)

    "Ray, Pass me the dishes!" UVA - 1400 题意就是线段树区间子段最大和,线段树区间合并,但是这道题还要求输出最大和的子段的左右端点.要求字典序最小 ...

  5. UVA 1400 1400 - &quot;Ray, Pass me the dishes!&quot;(线段树)

    UVA 1400 - "Ray, Pass me the dishes!" option=com_onlinejudge&Itemid=8&page=show_pr ...

  6. 【LA3938】"Ray, Pass me the dishes!"

    原题链接 Description After doing Ray a great favor to collect sticks for Ray, Poor Neal becomes very hun ...

  7. 线段树(区间合并) LA 3989 "Ray, Pass me the dishes!"

    题目传送门 题意:动态最大连续子序列和,静态的题目 分析:nlogn的归并思想.线段树维护结点的三个信息,最大前缀和,最大后缀和,该区间的最大和的两个端点,然后答案是三个的better.书上用pair ...

  8. UVALive - 3938:"Ray, Pass me the dishes!"

    优美的线段树 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring& ...

  9. UVALive3938 &quot;Ray, Pass me the dishes!&quot; 线段树动态区间最大和

    AC得相当辛苦的一道题.似乎不难,可是须要想细致, 開始的时候的错误思路----是受之前做过的区间最长连续子串影响http://blog.csdn.net/u011026968/article/det ...

随机推荐

  1. 1、在 Windows 上安装 OpenCV-Python & ubuntu16.04安装 opencv

    Goals In this tutorial We will learn to setup OpenCV-Python in your Windows system. Below steps are ...

  2. Spring入门第二十课

    返回通知,异常通知,环绕通知 看代码: package logan.study.aop.impl; public interface ArithmeticCalculator { int add(in ...

  3. IE11浏览器中的My97日历控件刷新后无法打开问题解决办法

    IE11浏览器中的My97日历控件刷新后无法打开问题解决办法   IE11浏览器中的My97日历控件刷新后无法打开问题解决办法:(谷歌浏览器下正常.IE11失效) 解决办法:1:找到WdatePick ...

  4. C# 写 LeetCode easy #13 Roman to Integer

    13.Roman to Integer Roman numerals are represented by seven different symbols: I, V, X, L, C, D and  ...

  5. python_文件目录的操作

    Python文件的主要操作 主要包括: 1,创建一个文件 2,删除一个文件 3,创建一个目录 4,删除一个目录 5,拷贝,重命名,查看文件大小 6,列出某个目录下文件的数量 7,递归打印某个目录下的所 ...

  6. php 连接 memcached 并调用

    话不多说,上代码,自己看注释 <?php header("Content-type: text/html; charset=utf-8"); $mem = new Memca ...

  7. Java基础--基本规则、语法

    一.关键字.保留字.标识符.常量.变量 1.关键字:使用某种语言赋予特殊含义的单词. 2.保留字:没有赋予特殊含义,但以后可能会使用的单词. 3.标识符:自定义的单词,以数字.字母.下划线以及$符组成 ...

  8. LCS最大公共子序列【转载】

    在两个字符串中,有些字符会一样,可以形成的子序列也有可能相等,因此,长度最长的相等子序列便是两者间的最长公共字序列,其长度可以使用动态规划来求. 以s1={1,3,4,5,6,7,7,8},s2={3 ...

  9. 小技巧(updating)

    小技巧 我们要算一个点集中所有点到另一个点集中所有点的一些量的时候,可以建立一个超级源点和超级汇点,从多->多变成单->单 整体二分的时候,操作要可以撤销,才能保证复杂度,每一层到左边区间 ...

  10. 补充:jQuery的ajax

    一.jQuery的ajax 什么是ajax AJAX = 异步的javascript和XML(Asynchronous Javascript and XML) 简言之,在不重载整个网页的情况下,AJA ...