题目传送门:codevs 3981 动态最大子段和

题目描述 Description

题目还是简单一点好...

有n个数,a[1]到a[n]。

接下来q次查询,每次动态指定两个数l,r,求a[l]到a[r]的最大子段和。

子段的意思是连续非空区间。

输入描述 Input Description

第一行一个数n。

第二行n个数a[1]~a[n]。

第三行一个数q。

以下q行每行两个数l和r。

输出描述 Output Description

q行,每行一个数,表示a[l]到a[r]的最大子段和。

样例输入 Sample Input

7
2 3 -233 233 -23 -2 233
4
1 7
5 6
2 5
2 3

样例输出 Sample Output

441
-2
233
3

数据范围及提示 Data Size & Hint

对于50%的数据,q*n<=10000000。

对于100%的数据,1<=n<=200000,1<=q<=200000。

a[1]~a[n]在int范围内,但是答案可能超出int范围。

数据保证1<=l<=r<=n。

空间128M,时间1s。

题目大意:

  求解区间 a[l]~a[r] 的最大子段和

解题思路:

  用线段树维护区间最大值。开几个变量存区间和sum,完全在左区间的最大值max_l,完全在右区间的最大值max_r,跨左右区间的最大值max。

 1 #include <bits/stdc++.h>
 2 #define lson rt<<1,l,mid
 3 #define rson rt<<1|1,mid+1,r
 4 using namespace std;
 5 const int N = 200000 + 10;
 6 typedef long long int ll;
 7 struct node
 8 {
 9     int l,r;
10     ll max_,max_l,max_r,sum;
11 } a[N<<2];
12 int n,q,x,y;
13 ll ans;
14 void up(int rt)
15 {
16     a[rt].max_=max(max(a[rt<<1].max_,a[rt<<1|1].max_),a[rt<<1].max_r+a[rt<<1|1].max_l);
17     a[rt].max_l=max(a[rt<<1].max_l,a[rt<<1].sum+a[rt<<1|1].max_l);
18     a[rt].max_r=max(a[rt<<1|1].max_r,a[rt<<1|1].sum+a[rt<<1].max_r);
19     a[rt].sum=a[rt<<1].sum+a[rt<<1|1].sum;
20 }
21 void build(int rt,int l,int r)
22 {
23     a[rt].l=l,a[rt].r=r;
24     if (l==r)
25     {
26         scanf("%lld",&a[rt].max_);
27         a[rt].max_l=a[rt].max_r=a[rt].sum=a[rt].max_;
28         return ;
29     }
30     int mid = (l+r)>>1;
31     build(lson);
32     build(rson);
33     up(rt);
34 }
35 void query(int rt,int L,int R,ll &ans,ll &ansl,ll &ansr)
36 {
37     if (L<=a[rt].l&&a[rt].r<=R)
38     {
39         ans=a[rt].max_;
40         ansl=a[rt].max_l;
41         ansr=a[rt].max_r;
42         return ;
43     }
44     int mid=(a[rt].l+a[rt].r)>>1;
45     if (mid>=R) query(rt<<1,L,R,ans,ansl,ansr);
46     else if (mid<L) query(rt<<1|1,L,R,ans,ansl,ansr);
47     else
48     {
49         ll lans=0,lansl=0,lansr=0,rans=0,ransl=0,ransr=0;
50         query(rt<<1,L,R,lans,lansl,lansr);
51         query(rt<<1|1,L,R,rans,ransl,ransr);
52         ans=max(max(lans,rans),lansr+ransl);
53         ansl=max(lansl,ransl+a[rt<<1].sum);
54         ansr=max(ransr,lansr+a[rt<<1|1].sum);
55     }
56 }
57 int main()
58 {
59     scanf("%d",&n);
60     build(1,1,n);
61     for ( scanf("%d",&q); q; q--)
62     {
63         scanf("%d%d",&x,&y);
64         ll ans=0,ansl=0,ansr=0;
65         query(1,x,y,ans,ansl,ansr);
66         printf("%lld\n",ans);
67     }
68     return 0;
69 }

View Code

转载于:https://www.cnblogs.com/l999q/p/9454303.html

codevs 3981 动态最大子段和(线段树)相关推荐

  1. codevs 3981 动态最大子段和

    3981 动态最大子段和 http://codevs.cn/problem/3981/  题目等级 : 钻石 Diamond 题目描述 Description 题目还是简单一点好... 有n个数,a[ ...

  2. 蓝桥杯学习记录||1264. 动态求连续区间和 | 线段树

    AcWing||1264. 动态求连续区间和 活动地址:https://www.acwing.com/activity/content/19/ 考察要点:线段树 题目要求 给定 n 个数组成的一个数列 ...

  3. 线段树动态开点 - - - > 线段树合并

    逆序对 代码 P3224 [HNOI2012]永无乡 并查集+线段树合并       ​​​​ 代码 P5494 [模板]线段树分裂 #include<iostream> #include ...

  4. 动态图连通性(线段树分治+按秩合并并查集)

    在考场上遇到了这个的板子题,,,所以来学习了一下线段树分治 + 带撤销的并查集. 题目大意是这样的:有m个时刻,每个时刻有一个加边or撤销一条边的操作,保证操作合法,没有重边自环,每次操作后输出当前图 ...

  5. 【线段树合并】解题报告:luogu P4556雨天的尾巴 (树上对点差分 + 动态开点 + 线段树合并)线段树合并模板离线/在线详解

    题目链接:雨天的尾巴 本题本身是一个非常简单的一道树上差分的模板题,但是由于变态的数据范围,我们直接用数组是存不下的(本来使用一颗普通的线段树直接维护最大值即可.但是本题的空间只有128MB,直接按照 ...

  6. ICPC 南昌现场赛 K:Tree(dsu on tree + 动态开点线段树)

    Tree 让我们找满足一下五个条件的(x,y(x, y(x,y)点对有多少: x≠yx \neq yx​=y xxx不是yyy的祖先 yyy不是xxx的祖先 dis(x,y)≤kdis(x, y)\ ...

  7. codeforces G - Almost Increasing Array 动态规划、动态开点线段树

    题意 给出一个序列,允许删除一个元素,并将任意元素的值修改为任意整数,问最少修改多少个元素使得序列变成严格单调递增的序列? 题解 这道题目很具有启发性: 不考虑删除元素,原数列各个数值减去他们下标得到 ...

  8. 学习笔记:可持久化线段树(主席树):静态 + 动态

    学习笔记:可持久化线段树(主席树):静态 + 动态 前置知识: 线段树.线段树分享可以看:@秦淮岸.@ZYzzz.@妄想の岚がそこに 树状数组.\(BIT\)分享可以看:@T-Sherlock.Chi ...

  9. 可持久化线段树(静态)【学习笔记】

    (静态)主席树入门 前置知识:动态开点线段树,权值线段树. 1)权值线段树:相当于将线段树当成一个桶,其中的每一个点所代表的区间相当于一段值域.维护的值为这段值域中的一些信息. 例如该图,节点2代表的 ...

最新文章

  1. Git安装与使用教程-本地仓库与远程仓库内容版本管理
  2. 在 .Net 中使用 Plupload 上传图片
  3. 设计模式:控制反转(Inversion Of Control)
  4. 垃圾收集器Serial 、Parallel、CMS、G1
  5. 2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(监听Wi-Fi和APP的数据)
  6. 利用Java手写简单的httpserver
  7. 取消2008关机对话框
  8. 中兴计算机笔试题库,中兴计算机笔试
  9. mp3分割方法,如何将mp3分割
  10. julia集 matlab代码,Julia中文手册1.1版本
  11. python精确有理数实验_有理数类实验报告
  12. 简单排查java应用CPU飙高的线程问题
  13. java 设计模式:软件设计原则、面向对象理论、23 种设计模式
  14. Adobe国际认证设计师证书含金量怎么样?
  15. 送别了我的师父,我觉得我的青春结束了
  16. 变位词的多种判断方法
  17. 第十二讲 dom对象(DOM对象、document对象的常用方法、节点、查找结点、 查看/修改/删除属性节点、创建和增加节点)
  18. 十个模型,总结产品经理沟通方法论
  19. 从原子结构,半导体,PN结到MOS管和CMOS
  20. matlab pls分析,求助确定PLS的最佳潜变量的代码

热门文章

  1. 基于html5制作3D拳击游戏源码下载
  2. table点击一行显示下一行的特效
  3. vs增量链接、清单文件
  4. Windows2003无法看到网络连接,修复COM+组件
  5. C#抽象类和抽象方法的特征和用途
  6. 剑指offer 算法 (发散思维能力)
  7. 在iframe内页触发顶层页面body的blur事件
  8. windows平台 python生成 pyd文件
  9. 读QT5.7源码(三)Q_OBJECT 和QMetaObject
  10. 完全分布式部署Hadoop