给定长度为N的数列A,以及M条指令 (N≤500000, M≤100000),每条指令可能是以下两种之一:

“2 x y”,把 A[x] 改成 y。

“1 x y”,查询区间 [x,y] 中的最大连续子段和,即 max(x≤l≤r≤y)⁡ { \(\sum_{i=l}^r\) A[i] }。

对于每个询问,输出一个整数表示答案。

一道模板题,线段树的区间最大子段和。

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int SIZE=500010;
  4. struct node{
  5. long long data;
  6. long long sum;
  7. long long l,r;
  8. long long lmax,rmax;
  9. }t[SIZE*4];
  10. long long n,m,u,v,k,sum,a[SIZE];
  11. void build(long long p,long long l,long long r){
  12. t[p].l=l,t[p].r=r;
  13. if(l==r){
  14. t[p].sum=t[p].data=t[p].lmax=t[p].rmax=a[l];
  15. return;
  16. }
  17. long long mid=(l+r)/2;
  18. build(p*2,l,mid);
  19. build(p*2+1,mid+1,r);
  20. t[p].sum=t[p*2].sum+t[p*2+1].sum;
  21. t[p].lmax=max(t[p*2].lmax,t[p*2].sum+t[p*2+1].lmax);
  22. t[p].rmax=max(t[p*2+1].rmax,t[p*2+1].sum+t[p*2].rmax);
  23. t[p].data=max(max(t[p*2].data,t[p*2+1].data),t[p*2].rmax+t[p*2+1].lmax);
  24. }
  25. void change(long long p,long long x,long long v){
  26. if(t[p].l==t[p].r){
  27. t[p].data=t[p].sum=t[p].lmax=t[p].rmax=v;
  28. return;
  29. }
  30. long long mid=(t[p].l+t[p].r)/2;
  31. if(x<=mid) change(p*2,x,v);
  32. else change(p*2+1,x,v);
  33. t[p].sum=t[p*2].sum+t[p*2+1].sum;
  34. t[p].lmax=max(t[p*2].lmax,t[p*2].sum+t[p*2+1].lmax);
  35. t[p].rmax=max(t[p*2+1].rmax,t[p*2+1].sum+t[p*2].rmax);
  36. t[p].data=max(max(t[p*2].data,t[p*2+1].data),t[p*2].rmax+t[p*2+1].lmax);
  37. }
  38. node ask(long long p,long long l,long long r){
  39. if(l<=t[p].l&&r>=t[p].r) return t[p];
  40. long long mid=(t[p].l+t[p].r)/2;
  41. if(mid>=r) return ask(p*2,l,r);
  42. if(mid<l) return ask(p*2+1,l,r);
  43. else{
  44. node ans,a1,b;
  45. a1=ask(p*2,l,r);
  46. b=ask(p*2+1,l,r);
  47. ans.sum=a1.sum+b.sum;
  48. ans.data=max(max(a1.data,a1.rmax+b.lmax),b.data);
  49. ans.lmax=max(a1.lmax,a1.sum+b.lmax);
  50. ans.rmax=max(b.rmax,b.sum+a1.rmax);
  51. return ans;
  52. }
  53. }
  54. int main(){
  55. scanf("%lld",&n);
  56. scanf("%lld",&m);
  57. for(int i=1;i<=n;++i){
  58. scanf("%lld",&a[i]);
  59. }
  60. build(1,1,n);
  61. while(m--){
  62. scanf("%lld %lld %lld",&k,&u,&v);
  63. if(k==1){
  64. if(u>v) swap(u,v);
  65. printf("%lld\n",ask(1,u,v).data);
  66. }
  67. else{
  68. change(1,u,v);
  69. }
  70. }
  71. return 0;
  72. }

CH4301 Can you answer on these queries III 题解的更多相关文章

  1. SPOJ GSS3 Can you answer these queries III[线段树]

    SPOJ - GSS3 Can you answer these queries III Description You are given a sequence A of N (N <= 50 ...

  2. GSS3 SPOJ 1716. Can you answer these queries III gss1的变形

    gss2调了一下午,至今还在wa... 我的做法是:对于询问按右区间排序,利用splay记录最右的位置.对于重复出现的,在splay中删掉之前出现的位置所在的节点,然后在splay中插入新的节点.对于 ...

  3. 数据结构(线段树):SPOJ GSS3 - Can you answer these queries III

    GSS3 - Can you answer these queries III You are given a sequence A of N (N <= 50000) integers bet ...

  4. 线段树 SP1716 GSS3 - Can you answer these queries III

    SP1716 GSS3 - Can you answer these queries III 题意翻译 n 个数,q 次操作 操作0 x y把A_xAx 修改为yy 操作1 l r询问区间[l, r] ...

  5. 「 SPOJ GSS3 」 Can you answer these queries III

    # 题目大意 GSS3 - Can you answer these queries III 需要你维护一种数据结构,支持两种操作: 单点修改 求一个区间的最大子段和 # 解题思路 一个区间的最大子段 ...

  6. Can you answer these queries III

    Can you answer these queries III 题目:洛谷 SPOJ [题目描述] 给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“0 x y”,把A[x]改 ...

  7. Can you answer these queries III(线段树)

    Can you answer these queries III(luogu) Description 维护一个长度为n的序列A,进行q次询问或操作 0 x y:把Ax改为y 1 x y:询问区间[l ...

  8. C#版(击败97.76%的提交) - Leetcode 557. 反转字符串中的单词 III - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. Leetcod ...

  9. SPOJ GSS3 Can you answer these queries III

    Time Limit: 330MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu Description You are g ...

随机推荐

  1. Java动态,安全追踪工具

    Java动态,安全追踪工具 在我们日常的开发中,总是难以避免的要解决线上的问题.如果线上的问题我们在本地调试的时候无论调试多少次发现明明本地调用了这个方法呀,怎么线上就是没调呢?还有就是出了问题的时候 ...

  2. 夯实Java基础(四)——面向对象之多态

    1.多态介绍 面向对象三大特征:封装.继承.多态.多态是Java面向对象最核心,最难以理解的内容.从一定角度来看,封装和继承几乎都是为多态而准备的. 多态就是指程序中定义的引用变量所指向的具体类型和通 ...

  3. coursera课程《how to learning 怎么学习》 总结

    总体来说,学完课程没有茅舍顿开的感觉,而是更加印证了之前的那个认知:大道至简,践则无敌,很多的学习方法上学的时候老师都教过我们,关键是我们能否坚持执行.课程讲了很多脑科学有关学习的知识,但对于我们实践 ...

  4. Logback配置文件这么写,TPS提高10倍

    通过阅读本篇文章将了解到 1.日志输出到文件并根据LEVEL级别将日志分类保存到不同文件 2.通过异步输出日志减少磁盘IO提高性能 3.异步输出日志的原理 配置文件logback-spring.xml ...

  5. vue+el-menu实现路由刷新和导航栏菜单状态保持(局部刷新页面)

    一.菜单项激活状态保持 有时,我们在项目中会有这样一个需求,即实现 一个侧导航栏,点击不同的菜单项,右边内容会跟着变化,而页面手动刷新后想要使菜单激活状态保持,那么这个功能该如何实现呢? 现在给出以下 ...

  6. Spark 系列(十五)—— Spark Streaming 整合 Flume

    一.简介 Apache Flume 是一个分布式,高可用的数据收集系统,可以从不同的数据源收集数据,经过聚合后发送到分布式计算框架或者存储系统中.Spark Straming 提供了以下两种方式用于 ...

  7. SpringBoot分布式:Dubbo+zookeeper

    西部开源-秦疆老师:SpringBoot + Dubbo + zookeeper 秦老师交流Q群号: 664386224 未授权禁止转载!编辑不易 , 转发请注明出处!防君子不防小人,共勉! 基础知识 ...

  8. Jvm内存泄漏

    内存泄漏和内存溢出的关系 内存泄露:指程序中动态分配内存给一些临时对象,但是对象不会被GC所回收,它始终占用内存.即被分配的对象可达但已无用. 内存溢出:指程序运行过程中无法申请到足够的内存而导致的一 ...

  9. 阿里注册中心Nacos生产部署方案

    一.说明 生产环境中部署nacos首先肯定是使用集群模式cluster保证高可用,本文主要详细介绍最佳的集群方案怎样搭建与spring cloud程序怎样集成   二.集群方案 下图是官方推荐的集群方 ...

  10. rwcheck:为嵌入式设备设计的读写压测工具

    我设计的一款读写压测工具,开源在我的github仓库 rwcheck是一个对嵌入式设备进行读写压测的工具 什么是rwcheck 正如其名,rwcheck工具用于读写压测.它是什么工作原理呢?为什么要用 ...