线段树 模板
来源:互联网 发布:mysql导出所有数据库 编辑:程序博客网 时间:2024/06/08 09:14
- 对于二叉树来说,2n是左子节点,2n+1是右子节点。
- 建树复杂度为O(n),更新和查询的复杂度都是O(lgn)。
- 要注意对一个区间进行更新的时候不需要一直更新到底,可以提高效率,需要的时候往下带就行。
#define maxn 50000struct node{ int l, r, sum; int mid(){ return (l+r)/2; }};node Tree[maxn*4];int value[maxn+10];int flag;//初始化树,根节点是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(2*root, l, (l+r)/2); init_tree(2*root+1, (l+r)/2 + 1, r); Tree[root].sum = Tree[2*root].sum + Tree[2*root+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(2*root+1, l, r); else if(r <= m) return query_tree(2*root, l, r); else return query_tree(2*root, l, m) + query_tree(2*root+1, m+1, r); }}void update_tree(int root, int idx, int v){ if(Tree[root].l == Tree[root].r) Tree[root].sum += flag*v; else{ Tree[root].sum += flag*v; if(idx <= Tree[root].mid()) update_tree(2*root, idx, v); else update_tree(2*root+1, idx, v); }}
1 0
- ACM 线段树模板(模板)
- 线段树模板
- hdu_1166_线段树模板
- 线段树模板
- 线段树模板 poj2777
- 线段树模板
- 线段树模板
- 线段树-模板
- 线段树模板
- 线段树模板
- 线段树模板
- Hdu1166-- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- java中的浅克隆
- 最大流网络之Push-Relabel算法
- Activity & Fragment & tips
- cocos2dx在安卓6.0(android-23)以上版本打包
- 单例模式应用场景和设计失误所引发的问题
- 线段树 模板
- web特殊符号
- python的排序模块bisect
- Cookie免验证自动登录
- shell中的分支
- 【STL】STL空间配置器
- elasticsearch判断索引是否存在
- QT的 QButton 添加ICO 以及添加菜单 Action
- 16 - 12 - 11 HDU 1021 ---Fibonacci Again