线段树
来源:互联网 发布:大煌软件 编辑:程序博客网 时间:2024/05/18 13:30
线段树:擅长处理区间的数据结构,对区间的操作(1.查询 2.更新)可以在O(logn)时间内完成;
代码:(基于线段树的RMQ)
const int INF=0x3f3f3f3f;const int maxn=1<<17;//存储线段树的全局数组;int n,dat[2*maxn-1];//初始化void init(int n_){ //为计算方便,元素个数扩大为2的幂; n=1; while(n<n_) n*=2; for(int i=0;i<2*n-1;i++) dat[i]=INF;}//n_个元素的初始化:for(int k=0;k<n_;k++) update(k,a[k]);//把第k个值(从0开始)更新为a;void update(int k,int a){ k+=n-1; dat[k]=a; //向上更新; while(k>0) { k=(k-1)/2; dat[k]=min(dat[2*k+1],dat[2*k+2]); }}//求[a,b)的最小值;//后面的参数是为了计算方便传入的;//k是节点的编号,l,r表示这个节点对应的是[l,r)区间;//外部调用时,用query(a,b,0,0,n);int query(int a,int b,int k,int l,int r){ //如果[a,b)和[l,r)不相交,则返回INF; if(r<=a||b<=l) return INF; //如果[a,b)完全包含[l,r),则返回当前节点的值; if(a<=l&&r<=b) return dat[k]; else{ //否则返回两个儿子中值的较小者; int vl=query(a,b,k*2+1,l,(l+r)/2); int vr=query(a,b,k*2+2,(l+r)/2,r); return min(vl,vr); }}
阅读全文
1 0
- 线段树?线段树!
- 线段树?线段树!
- 线段_线段树
- 线段_线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- butterknife 黄油刀 学习记录
- leetcode 7 Reverse Integer golang实现
- 终于要长大了吗?是的,你毕业了。
- PHP中赋值运算符.=的使用方法与技巧
- Live555服务端与客户端的交互解析
- 线段树
- HelloWorld+通用mapper+durid测试数据联通
- css选择器学习
- kafka操作(单broker)
- 微信支付流程图
- centos7yum安装mysql
- 使用VLC做流媒体服务器(直播形式)
- 导入Maven项目中的web版本错误的解决方法
- Java学习