描述

给定一个序列A[0],A[1],…A[N-1],要求找到p0,p1,p2,p3使得A[p0]+A[p0+1]+…+A[p1] + A[p2]+A[p2+1]+…+A[p3]最大(0<=p0<=p1<p2<=p3<N)。你只需要求出这个最大值就可以。

输入

输入的第一行为一个数N(2<=N<=10000),接下来的一行为N个整数(-100<A[i]<100)。

输出

输出一个整数表示最大值。

样例输入

5
-1 -2 -4 -5 4

样例输出

3

题意

如上。

题解

枚举分割点,求左区间最大子段和和到右区间最大字段和。

区间最大值段和是一个经典题,线段树维护。

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=;
  4. struct node{
  5. int sum,lmax,rmax,lrs;
  6. }tree[maxn<<];
  7. void pushup(int x){
  8. tree[x].sum=tree[x<<].sum+tree[x<<|].sum;
  9. tree[x].lmax=max(tree[x<<].lmax,tree[x<<|].lmax+tree[x<<].sum);
  10. tree[x].rmax=max(tree[x<<|].rmax,tree[x<<].rmax+tree[x<<|].sum);
  11. tree[x].lrs=max(max(tree[x<<].lrs,tree[x<<|].lrs),tree[x<<].rmax+tree[x<<|].lmax);
  12. }
  13. void build(int l,int r,int p){
  14. if(l==r){
  15. scanf("%d",&tree[p].sum);
  16. tree[p].lmax=tree[p].lrs=tree[p].rmax=tree[p].sum;
  17. return;
  18. }
  19. int mid=(l+r)>>;
  20. build(l,mid,p<<);
  21. build(mid+,r,p<<|);
  22. pushup(p);
  23. }
  24. void update(int k,int v,int l,int r,int p){
  25. if(l==r){
  26. tree[p].lmax=tree[p].lrs=tree[p].rmax=tree[p].sum=v;
  27. return;
  28. }
  29. int mid=(l+r)>>;
  30. if(k<=mid)update(k,v,l,mid,p<<);
  31. else update(k,v,mid+,r,p<<|);
  32. pushup(p);
  33. }
  34. node quert(int L,int R,int l,int r,int p){
  35. if(L<=l&&r<=R)return tree[p];
  36. int mid=(l+r)>>;
  37. node vis,f1,f2;
  38. vis.sum=;
  39. if(L<=mid)vis=f1=quert(L,R,l,mid,p<<);
  40. if(R>mid)vis=f2=quert(L,R,mid+,r,p<<|);
  41. if(L<=mid&&R>mid){
  42. vis.sum=f1.sum+f2.sum;
  43. vis.lmax=max(f1.lmax,f1.sum+f2.lmax);
  44. vis.rmax=max(f2.rmax,f2.sum+f1.rmax);
  45. vis.lrs=max(max(f1.lrs,f2.lrs),f1.rmax+f2.lmax);
  46. }
  47. return vis;
  48. }
  49. int main(){
  50. int n,maxx=-1e9;
  51. scanf("%d",&n);
  52. build(,n,);
  53. for(int i=;i<n;i++)
  54. maxx=max(quert(,i,,n,).lrs+quert(i+,n,,n,).lrs,maxx);
  55. printf("%d\n",maxx);
  56. return ;
  57. }

TZOJ 4021 Ugly Problem(线段树区间子段最大)的更多相关文章

  1. TZOJ 3315 买火车票(线段树区间最小值)

    描述 Byteotian州铁道部决定赶上时代,为此他们引进了城市联网.假设城市联网顺次连接着n 个市从1 到n 编号(起始城市编号为1,终止城市编号为n).每辆火车有m个座位且在任何两个运送更多的乘客 ...

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

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

  3. hdu 5475 An easy problem(暴力 || 线段树区间单点更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=5475 An easy problem Time Limit: 8000/5000 MS (Java/Others ...

  4. poj3468 A Simple Problem with Integers(线段树区间更新)

    https://vjudge.net/problem/POJ-3468 线段树区间更新(lazy数组)模板题 #include<iostream> #include<cstdio&g ...

  5. POJ 3468:A Simple Problem with Integers(线段树区间更新模板)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 141093 ...

  6. POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询)

    POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询) 题意分析 注意一下懒惰标记,数据部分和更新时的数字都要是long long ,别的没什么大 ...

  7. poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 75541   ...

  8. (简单) POJ 3468 A Simple Problem with Integers , 线段树+区间更新。

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

  9. POJ 3468 A Simple Problem with Integers(线段树&区间更新)题解

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

随机推荐

  1. MATLAB 中自定义函数的使用

    MATLAB在文件内部(在函数内部)定义函数,但文件名以开头函数来命名,与Java中每个文件只能有一个公开类,但在文件内部还是可以定义其他非公开类一个道理. 无参函数 do.m function do ...

  2. StringUtils工具

    ppublic class StringUtils { private StringUtils() { } /** * 文本左边补零 * * @param maxLength 文本长度 * @para ...

  3. Easy Excel导出

    @GetMapping(value = "/down2") public void down2(HttpServletResponse response) throws Excep ...

  4. 试做Chrome插件——whatweb的chrome插件(从老博客转)

    引子 最近一个月每天早上在学Javascript,刚学完基础语法和一点点jQuery,今天忍不住写个Chrome玩玩看看自己对JavaScript的掌握怎么样了. 目标 考虑了一下,打算做个小东西,但 ...

  5. Android开发 处理拍照完成后的照片角度

    private void initImageAngle(){ Bitmap imageBitmap = BitmapFactory.decodeFile(FilePathSession.getFace ...

  6. leetcode146周赛-5130-等价多米诺骨牌对的数量

    题目描述: 方法一: class Solution(object): def numEquivDominoPairs(self, dominoes): """ :type ...

  7. leetcode-95-不同的二叉搜索树(卡特兰数)

    题目描述: 方法一:动态规划 O(n^2) O(n) class Solution: def numTrees(self, n: int) -> int: dp = [0]*(n+1) dp[0 ...

  8. order方法属于模型的连贯操作方法之一

    order方法属于模型的连贯操作方法之一,用于对操作的结果排序. 用法如下: $Model->where('status=1')->order('id desc')->limit(5 ...

  9. CSS自动换行、强制不换行、强制断行、超出显示省略号

    转自:https://blog.csdn.net/liuyan19891230/article/details/50969393 P标签是默认是自动换行的,因此设置好宽度之后,能够较好的实现效果,但是 ...

  10. Maven的作用及简介

    Maven的作用及简介 一.maven作用 项目之间都是有依赖的,比如A项目依赖于B项目,B项目依赖与C.D项目,等等.这样的依赖链可能很长. 但是,没有一个项目的jar包我们都要导入进去,我们要做的 ...