线段树 模板
来源:互联网 发布:php短信轰炸机 编辑:程序博客网 时间:2024/06/03 09:23
对于二叉树来说,2n是左子节点,2n+1是右子节点。
建树复杂度为O(n),更新和查询的复杂度都是O(lgn)。
要注意对一个区间进行更新的时候不需要一直更新到底,可以提高效率,需要的时候往下带就行。
#define maxn 200000struct node{ int l, r, sum; int mid(){ return (l+r)>>1; }};node Tree[maxn<<2];int value[maxn+10]; //从 1 开始赋值 //初始化树,根节点是1void init_tree(int root, int l, int r){ Tree[root].l = l; Tree[root].r = r; if(l == r) Tree[root].sum = value[l]; else{ init_tree(root<<1, l, (l+r)>>1); init_tree((root<<1)+1, ((l+r)>>1) + 1, r); Tree[root].sum = Tree[root<<1].sum + Tree[(root<<1)+1].sum; }}//查找和int query_tree(int root, int l, int r){ int m = Tree[root].mid(); if(l == Tree[root].l && r == Tree[root].r) return Tree[root].sum; else{ if(l > m) return query_tree((root<<1)+1, l, r); else if(r <= m) return query_tree(root<<1, l, r); else return query_tree(root<<1, l, m) + query_tree((root<<1)+1, m+1, r); }}void update_tree(int root, int idx, int v){ if(Tree[root].l == Tree[root].r) Tree[root].sum += v; else{ if(idx <= Tree[root].mid()) update_tree(root<<1, idx, v); else update_tree((root<<1)+1, idx, v); Tree[root].sum = Tree[root<<1].sum + Tree[(root<<1)+1].sum; }}
出处:http://blog.csdn.net/cfarmerreally/article/details/53574139
阅读全文
0 0
- ACM 线段树模板(模板)
- 线段树模板
- hdu_1166_线段树模板
- 线段树模板
- 线段树模板 poj2777
- 线段树模板
- 线段树模板
- 线段树-模板
- 线段树模板
- 线段树模板
- 线段树模板
- Hdu1166-- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 自定义控件_自定义日历
- 转自动化测试之路——起点
- 【BeagleBone Black Rev. C试用体验】+固件更换
- leetcode 39|40|216|377. Combination Sum 1|2|3|4
- 【逆向】Windows可执行文件简述(一)
- 线段树 模板
- Cookie源码翻译
- C#:获取系统当前日期/时间
- 华为工程师预测十年后的Kubernetes
- Ecshop快递物流查询插件
- 【NanoPi Duo试用体验】+一个简单的字符设备驱动
- 删除docker-register的镜像
- 递推求乘法逆元
- runtime 创建动态类及常用方法的介绍