线段树——区间修改、区间查询
时间:2019-09-11
本文章向大家介绍线段树——区间修改、区间查询,主要包括线段树——区间修改、区间查询使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
模板
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn=1e5+5; 5 struct node 6 { 7 int l,r; 8 ll sum,lazy; 9 void update(ll x) 10 { 11 sum+=1ll*(r-l+1)*x; 12 lazy+=x; 13 } 14 }tree[maxn<<2]; 15 int n,a[maxn],q; 16 void push_up(int x) 17 { 18 tree[x].sum=tree[x<<1].sum+tree[x<<1|1].sum; 19 } 20 void push_down(int x) 21 { 22 int lazyval=tree[x].lazy; 23 if(lazyval) 24 { 25 tree[x<<1].update(lazyval); 26 tree[x<<1|1].update(lazyval); 27 tree[x].lazy=0; 28 } 29 } 30 void build(int x,int l,int r) 31 { 32 tree[x].l=l,tree[x].r=r; 33 tree[x].lazy=tree[x].sum=0; 34 if(l==r) 35 { 36 tree[x].sum=a[l]; 37 } 38 else 39 { 40 int mid=(l+r)>>1; 41 build(x<<1,l,mid); 42 build(x<<1|1,mid+1,r); 43 push_up(x); 44 } 45 } 46 void update(int x,int l,int r,ll val) 47 { 48 int L=tree[x].l,R=tree[x].r; 49 50 if(l<=L && R<=r) 51 { 52 tree[x].update(val); 53 } 54 else 55 { 56 push_down(x); 57 int mid=(L+R)>>1; 58 if(mid>=l)update(x<<1,l,r,val); 59 if(mid<r)update(x<<1|1,l,r,val); 60 push_up(x); 61 } 62 } 63 ll query(int x,int l,int r) 64 { 65 int L=tree[x].l,R=tree[x].r; 66 67 if(l<=L && R<=r) 68 { 69 return tree[x].sum; 70 } 71 else 72 { 73 push_down(x); 74 ll ans=0; 75 int mid=(L+R)>>1; 76 if(mid>=l)ans+=query(x<<1,l,r); 77 if(mid<r)ans+=query(x<<1|1,l,r); 78 push_up(x); 79 return ans; 80 } 81 82 } 83 int main() 84 { 85 scanf("%d%d",&n,&q); 86 for(int i=1;i<=n;i++) 87 scanf("%d",&a[i]); 88 build(1,1,n); 89 for(int i=1;i<=q;i++) 90 { 91 int l,r,op; 92 ll val; 93 scanf("%d",&op); 94 if(op==1) 95 { 96 scanf("%d%d%lld",&l,&r,&val); 97 update(1,l,r,val); 98 } 99 else 100 { 101 scanf("%d%d",&l,&r); 102 printf("%lld\n",query(1,l,r)); 103 } 104 105 106 } 107 return 0; 108 }
原文地址:https://www.cnblogs.com/j666/p/11505401.html
- mongodb取出json,利用python转成dataframe(dict-to-dataframe)
- JSP简单入门(2)
- JSP简单入门(3)
- 物化视图相关的性能改进 (r7笔记第58天)
- Maven 核心原理解析(1)
- LeetCode——Two Sum
- TensorFlow全新的数据读取方式:Dataset API入门教程
- 不经意发现的dba_objects和dba_tables中的细节(r7笔记第56天)
- LeetCode——Longest Substring Without Repeating Characters
- Python time模块详解(时间戳↔元组形式↔格式化形式三者转化)
- Maven 核心原理解析(2)
- Linux C 编程——互斥锁mutex
- python两个 list 获取交集,并集,差集的方法.
- python——时间与时间戳之间的转换
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CentOS7 systemd添加自定义系统服务的方法
- Linux中sudo、su和su -命令的区别小结
- 非零环绕规则
- Linux被中断的系统如何调用详解
- centos 修改ssh默认端口号的方法示例
- Linux中特殊权限SUID、SGID与SBIT的深入讲解
- linux新文件权限设置之umask的深入理解
- 在 CentOS 8/RHEL 8 上安装和使用 Cockpit的方法
- Linux删除文件提示Operation not permitted的处理办法
- 微任务与宏任务
- Linux 文件权限的详细介绍
- Linux统计一个文件中特定字符个数的方法
- CentOS7 安装 zabbix 4.0 教程(图文详解)
- 浅谈简单使用CentOS7防火墙及开放端口
- Linux后台运行Python程序的几种方法讲解