
线段树模板
发布日期:2021-05-07 03:06:26
浏览次数:18
分类:原创文章
本文共 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;}
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年03月20日 04时19分57秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
简单Makefile的编写
2021-05-08
使用BAT批处理 匹配查找指定文件夹,并在当文件夹下创建空文件
2021-05-08
wxpython的Hello,World代码探索
2021-05-08
【数字图像处理】OpenCV3 学习笔记
2021-05-08
【单片机开发】智能小车工程(经验总结)
2021-05-08
【单片机开发】基于stm32的掌上游戏机设计 (项目规划)
2021-05-08
KeepAlived介绍、配置示例、KeepAlived配置IPVS、调用脚本进行监控
2021-05-08
【Numpy学习】np.count_nonzero()用法解析
2021-05-08
Scala集合-数组、元组
2021-05-08
JAVA网络爬虫01-http client爬取网络内容
2021-05-08
04 程序流程控制
2021-05-08
java并发编程(1)
2021-05-08
C++&&STL
2021-05-08
子集(LeetCode 78)
2021-05-08
1004 Counting Leaves (30分)
2021-05-08
1093 Count PAT‘s (25分) 含DP做法
2021-05-08
一篇解决JMM与volatile详解(二)
2021-05-08
数据结构之数组与经典面试题(二)
2021-05-08
无锁并发框架-Disruptor的使用(二)
2021-05-08
Android wm命令
2021-05-08