【线段树】备用模板
来源:互联网 发布:ae 2017 cc mac破解版 编辑:程序博客网 时间:2024/05/19 02:06
来自学长的线段树模板:
#include<cstdio>#include<algorithm>using namespace std;#define L o<<1#define R (o<<1)|1struct Node{int l,r,sum,Max,Min;}Tree[1000<<2];void PushUp(int o){Tree[o].sum = Tree[o*2].sum + Tree[o*2+1].sum;Tree[o].Max = max(Tree[o*2].Max,Tree[o*2+1].Max);Tree[o].Min = min(Tree[o*2].Min,Tree[o*2+1].Min);}void Build(int o,int l,int r){//首先记录l和r的值 Tree[o].l = l;Tree[o].r = r;if (l == r)//到达最底层,递归终止{int t;scanf ("%d",&t);//输入数据 Tree[o].sum = Tree[o].Max = Tree[o].Min = t;//更新节点数据 return;}int mid = (l+r) >> 1;//找到中间节点 Build(o*2 , l , mid);//递归建左子树 Build(o*2+1 , mid+1 , r);//递归建右子树 PushUp(o);//更新当前节点的值 }void UpDate(int o,int l,int r,int x,int y)//把x节点更新为y{if (l == r)//递归结束{Tree[o].Max = Tree[o].Min = Tree[o].sum = y;//精确找到了节点,更新 return;}int mid = (l+r) / 2;//找到中间位置if (x <= mid)UpDate(o*2,l,mid,x,y);//找左子树 elseUpDate(o*2+1,mid+1,r,x,y);//找右子树 PushUp(o);//更新当前节点 }int QuerySum(int o,int l,int r,int x,int y)//查找x到y的和 {if (l == x && r == y)//如果恰好是当前节点,就返回 {return Tree[o].sum;}int mid = (l + r) / 2;if (mid >= y)//全在左边 return QuerySum(o*2,l,mid,x,y);else if (x > mid)//全在右边 return QuerySum(o*2+1,mid+1,r,x,y);else//一半在左一半在右 return QuerySum(o*2,l,mid,x,mid) + QuerySum(o*2+1,mid+1,r,mid+1,y);}int main(){int n;scanf ("%d",&n);Build(1,1,n);//UpDate(1,1,n,2,7);printf ("%d\n",QuerySum(1,1,n,2,4));return 0;}
阅读全文
0 0
- 【线段树】备用模板
- 【线段树】nyoj-备用 2344: 盖伦的告白
- 【矩阵】备用模板
- ACM 线段树模板(模板)
- 线段树模板
- hdu_1166_线段树模板
- 线段树模板
- 线段树模板 poj2777
- 线段树模板
- 线段树模板
- 线段树-模板
- 线段树模板
- 线段树模板
- 线段树模板
- Hdu1166-- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- ACM第三次比赛题目及标准程序(贪心)
- 《剑指offer》牛客网java题解-从尾到头打印链表
- 循环——的斐波那契数列——虽然听懂了,但直接听答案果然效果不好,忘得真快
- Effective C++学习心得一
- JVM那些事儿之执行原理(二)
- 【线段树】备用模板
- HDU 6105 Gameia (博弈)
- 十进制转八进制(递归版)
- 高效算法设计(二分查找,范围统计)
- Python:在文件中的每一行添加一个逗号
- 文章标题
- Kotlin集合及其操作函数
- Python代码实现简单的MNIST手写数字识别(适合初学者看)
- 士兵杀敌(一)