博客
关于我
线段树模板
阅读量:318 次
发布时间:2019-03-04

本文共 1010 字,大约阅读时间需要 3 分钟。

建议上B站搜索线段树,播放量最多的那个视频讲的很详细。

#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1000;int tr[maxn],a[maxn];//建树 void build(int i,int l,int r){   	if(l == r) 	{   		tr[i] = a[l]; 		return;	} 	int mid = (l+r) >> 1;	build(2*i,l,mid);//左子树 	build(2*i+1,mid+1,r);//右子树 	tr[i] = tr[2*i] + tr[2*i+1]; //求两个子树的和 }//更新值  把id位置的值更新为val void update(int i,int l,int r,int id,int val){   	if(l == r)//表示查到了id所在的节点 	{   		a[id] = val;		tr[i] = val;		return ;	}	int mid = (l + r)>>1;	//左分支 id < mid  右分支  id>mid 	if(id>=l && id<=mid) update(2*i,l,mid,id,val);	else update(2*i+1,mid+1,r,id,val);	tr[i] = tr[2*i] + tr[2*i+1];}//查询总和 ll query(int i,int l,int r,int L,int R){   	if(R < l || L > r) return 0;//查询区间不在当前的访问区间内 	if(L <= l && r <= R) return tr[i];//减少查询次数,查询区间包含当前访问的区间 	if(l == r) return tr[i];//当前访问到一个节点直接返回值 	int mid = (l+r)>>1;	int suml = query(2*i,l,mid,L,R);//求左树中包含该区间的总和 	int sumr = query(2*i+1,mid+1,L,R);//求右树中包含该区间的总和 	return suml + sumr;//返回查询区间的总和 } int main(){   	return 0;}

转载地址:http://qirq.baihongyu.com/

你可能感兴趣的文章
【IoT】TI BLE CC2541 串口控制蓝牙详解
查看>>
【产品】项目管理的五个过程和九大知识领域之二
查看>>
【项目管理】项目管理流程浅析
查看>>
【Tool】如何使用 Uniflash 烧写 WIFI 芯片 CC3200
查看>>
copy_{to, from}_user()的思考
查看>>
Web前端安全策略之CSRF的攻击与防御
查看>>
纯客户端页面关键字搜索高亮jQuery插件
查看>>
linux运维中常用的命令
查看>>
M1芯片的macbook安装王者荣耀,原神,崩坏方法
查看>>
Java温故而知新-反射机制
查看>>
eclipse引用sun.misc开头的类
查看>>
firefox中angular2嵌套发送请求问题
查看>>
【mybatis3】调试/断点打印日志
查看>>
C++
查看>>
[CTFSHOW]PHP特性
查看>>
navigator对象
查看>>
关于EFI系统分区(ESP)你应该知道的3件事
查看>>
5.Mybatis复杂映射开发
查看>>
Servlet2.5的增删改查功能分析与实现------删除功能(四)
查看>>
环境配置 jdk_mysql_myeclipse8.6
查看>>