题意:

单点修改,区间最值

思路:

线段树

原题请戳这里

  1. //By SiriusRen
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #define LSON l,mid,lson
  6. #define RSON mid+1,r,rson
  7. #define N 500000
  8. #define inf 0x3fffffff
  9. using namespace std;
  10. int n,m,jy,xx,yy,RANS,ANS;
  11. int tree[N*4],lmax[N*4],rmax[N*4],maxx[N*4],sum[N*4];
  12. void push_up(int pos,int lson,int rson){
  13. sum[pos]=sum[lson]+sum[rson];
  14. rmax[pos]=max(rmax[rson],sum[rson]+rmax[lson]);
  15. lmax[pos]=max(lmax[lson],lmax[rson]+sum[lson]);
  16. maxx[pos]=max(maxx[lson],max(maxx[rson],rmax[lson]+lmax[rson]));
  17. }
  18. void build(int l,int r,int pos){
  19. if(l==r){
  20. scanf("%d",&tree[pos]);
  21. lmax[pos]=rmax[pos]=sum[pos]=maxx[pos]=tree[pos];
  22. return;
  23. }
  24. int mid=(l+r)/2,lson=pos<<1,rson=pos<<1|1;
  25. build(LSON);build(RSON);
  26. push_up(pos,lson,rson);
  27. }
  28. void query(int l,int r,int pos){
  29. if(l>=xx&&r<=yy){
  30. ANS=max(ANS,max(maxx[pos],RANS+lmax[pos]));
  31. RANS=max(rmax[pos],RANS+sum[pos]);
  32. return;
  33. }
  34. int mid=(l+r)/2,lson=pos<<1,rson=pos<<1|1;
  35. if(mid<xx)query(RSON);
  36. else if(mid>=yy)query(LSON);
  37. else query(LSON),query(RSON);
  38. }
  39. void update(int l,int r,int pos){
  40. if(l==r){
  41. lmax[pos]=rmax[pos]=sum[pos]=maxx[pos]=tree[pos]=yy;
  42. return;
  43. }
  44. int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
  45. if(mid<xx)update(RSON);
  46. else update(LSON);
  47. push_up(pos,lson,rson);
  48. }
  49. int main(){
  50. scanf("%d%d",&n,&m);
  51. build(1,n,1);
  52. while(m--){
  53. scanf("%d%d%d",&jy,&xx,&yy);
  54. if(jy==1){
  55. if(xx>yy)swap(xx,yy);
  56. ANS=RANS=-inf;
  57. query(1,n,1);
  58. printf("%d\n",ANS);
  59. }
  60. else
  61. update(1,n,1);
  62. }
  63. }

TYVJ 1427 线段树的基本操作的更多相关文章

  1. HDOJ-1754(简单线段树)

    最近开始重新学习线段树,先从最简单的开始吧! I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  2. 数据结构3——浅谈zkw线段树

    线段树是所有数据结构中,最常用的之一.线段树的功能多样,既可以代替树状数组完成"区间和"查询,也可以完成一些所谓"动态RMQ"(可修改的区间最值问题)的操作.其 ...

  3. 线段树(segment_tree)

    线段树之——区间修改区间查询 1.概述 线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,基本能保证每个操作的复杂度为O(lgN). 线段树是 ...

  4. HDU - 1698 线段树区间修改,区间查询

    这就是很简单的基本的线段树的基本操作,区间修改,区间查询,对区间内部信息打上laze标记,然后维护即可. 我自己做的时候太傻逼了...把区间修改写错了,对给定区间进行修改的时候,mid取的是节点的左右 ...

  5. Vasya and a Tree CodeForces - 1076E(线段树+dfs)

    I - Vasya and a Tree CodeForces - 1076E 其实参考完别人的思路,写完程序交上去,还是没理解啥意思..昨晚再仔细想了想.终于弄明白了(有可能不对 题意是有一棵树n个 ...

  6. CF438D 线段树 区间求和,区间求膜,单点更新

    题目链接 题目大意: 给定一个长度为n的序列,要求能够执行m次下列操作: 1.查询区间[l,r]的和 2.将区间[l,r]的每一个数%=mod 3.修改第x个数为y 操作1,3都是线段树的基本操作,线 ...

  7. HDU 3577Fast Arrangement(线段树模板之区间增减更新 区间求和查询)

    Fast Arrangement Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  8. 【数据结构系列】线段树(Segment Tree)

    一.线段树的定义 线段树,又名区间树,是一种二叉搜索树. 那么问题来了,啥是二叉搜索树呢? 对于一棵二叉树,若满足: ①它的左子树不空,则左子树上所有结点的值均小于它的根结点的值 ②若它的右子树不空, ...

  9. 线段树(Segment Tree)(转)

    原文链接:线段树(Segment Tree) 1.概述 线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,基本能保证每个操作的复杂度为O(lg ...

随机推荐

  1. iproute2和tc的高级路由用法

    #Linux advanced router ip link show #显示链路 ip addr show #显示地址(或ifconfig) ip route show #显示路由(route -n ...

  2. servlet_获取初始化参数

    在web.xml的<servlet>标签中增添 <init-param> <param-name>XXX</param-name> <param- ...

  3. 09 Django组件之用户认证组件

    没有学习Django认证组件之前使用装饰器方法 from django.shortcuts import render, HttpResponse, redirect from app01.MyFor ...

  4. Xilinx 7系列FPGA部分重配置【2】

    在之前的“Xilinx 7系列FPGA部分重配置[1]”中已经较为详细地记录了分别在工程模式(Project Mode)和非工程模式(Non-Project Mode)下.使用7系列的Xilinx F ...

  5. 关于计算文字显示占用画面大小(System.Drawing.Graphics.MeasureString)

    最近遇到了一个需要手动为显示文字换行的场合,网上转了一圈,最后形成了下面的代码: var font = new Font("微软雅黑", 9F); - DETAIL_BASE_IN ...

  6. vue scss 安装

    1.开始在vue项目中使用sass,在命令行输入一下命令进行安装(使用git命令行要用shift+insert 进行粘贴否则粘贴不上) cnpm install node-sass --save-de ...

  7. 05-Linux系统编程-第02天(文件系统、目录操作、dup2)

    1 课程回顾 02-文件存储 文件名不在inode里 而是保存在一个叫dentry的结构体里了 格式化就是指定一组规则 指定对文件的存储及读取的一般方法 linux下主要使用 ext2 ext3 ex ...

  8. 07.网络编程-2.UDP

    1.udp介绍 UDP --- 用户数据报协议, 是一个无连接的简单的面向数据报的传输层协议. UDP不提供可靠性, 它只是把应用程序传给IP层的数据报发送出去, 但是并不能保证它们能到达目的地. 由 ...

  9. GitLab权限介绍

    访问权限 - Visibility Level 这个是在建立项目时就需要选定的,主要用于决定哪些人可以访问此项目,包含3种 Private - 私有,只有属于该项目成员才有原先查看 Internal ...

  10. Navicat Premium 下载地址

    Navicat Premium(32 bit)简体中文版:http://xiazai.formysql.com/trial/navicat_premium_trial.exe Navicat Prem ...