线段树
来源:互联网 发布:网络ping值多少正常 编辑:程序博客网 时间:2024/06/17 01:21
很长,但此模板基本上把线段树所有的功能都包括了,包括更新,查询区间等,并且提前就把和还有最大最小值都写上了,到时候只需要去掉某些部分,并且把下面的部分内容改一下就好:
给一道模板题自己看看吧:
猛戳这里
代码如下:
//线段树模板struct node{int r,l,sum,MAX,MIN;}a[1000<<2];//存树 void pushup(int o)//更新数据 {a[o].MAX=maxa([o*2].MAX,a[o*2+1].MAX);a[o].MIN=min(a[o*2].MIN,a[o*2+1].MIN);a[o].sum=a[o*2].sum+a[o*2+1].sum; } void build(int o,int l,int r)//递归建树 { a[o].l=l; a[o].r=r; if(l==r) { int t; scanf("%d",&t); a[o].Max=a[o].Min=a[o].sum=t; return ; } int mid=(r+l)/2; 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) { if(l==r) { a[o].Max=a[o].Min=a[o].sum=y; return ; } int mid=(r+l)/2; if(x<=mid)//二分思想,判断左右区间 update(o*2,l,mid,x,y); else update(o*2+1,mid+1,r,x,y); pushup(o);//更新当前各节点的值 } int Qure(int o,int l,int r,int x,int y)//球x到y区间的和(当然也可以在这里面稍加改变,就可以转变成就最大和最小值) { if(l==x&&r==y) { return a[o].sum; } int mid=(l+r)/2; if(y<=mid)//表示要查找的区间在左半部分 return Qure(o*2,l,mid,x,y); else if(x>mid)//表示要查找的区间在右半部分 return Qure(o*2+1,mid+1,r,x,y); else//表示既有左又有右 return Qure(o*2,l,mid,x,mid)+Qure(o*2+1,mid+1,r,mid+1,y); }
注意的是,这是c++,所以里面的max min等函数都得有头文件algorithm
阅读全文
0 0
- 线段树?线段树!
- 线段树?线段树!
- 线段_线段树
- 线段_线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 新JEP将简化Java类型变异
- install ubuntu source code
- HDU3394 Railway —— 点双联通分量 + 桥
- 使用Spring Boot快速构建基于SQLite数据源的应用
- G
- 线段树
- java的算术右移(>>)与逻辑右移(>>>)
- C++的输入输出文件方法
- linux python工具pip和 easy_install的安装
- PHP基本配置--POST文件上传修改
- HDU6124-Euler theorem
- webpack 如何优雅的使用tree-shaking(摇树优化)
- JNI字段描述符解析
- SSL P2699 完美交换