线段树基本操作(单点更新,区间极值,区间求和)
来源:互联网 发布:淘宝答题在哪里 编辑:程序博客网 时间:2024/05/22 13:36
做了一部分题目,总结一下线段树的几个基本操作。
#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>using namespace std;const int INF=1<<29;int max_tree[300000];int min_tree[300000];int sum_tree[300000]; int a[300000];void build(int node,int begin,int end){//建树 if(begin==end) min_tree[node]=a[begin],max_tree[node]=a[begin],sum_tree[node]=a[begin];else{build(2*node,begin,(begin+end)/2);build(2*node+1,(begin+end)/2+1,end);max_tree[node]=max(max_tree[2*node],max_tree[2*node+1]);min_tree[node]=min(min_tree[2*node],min_tree[2*node+1]);sum_tree[node]=sum_tree[2*node]+sum_tree[2*node+1];}}int findmin(int node,int begin,int end,int z,int y){//找到z--y的最小值 int p1=INF,p2=INF;if(begin>=z&&end<=y) return min_tree[node];int fz=(begin + end) / 2;if(z<=fz)p1=findmin(2*node,begin,fz, z, y) ;if(y>fz)p2=findmin(2*node+1,fz+1,end,z,y);return min(p1,p2);}int findmax(int node,int begin,int end,int z,int y){//找到z--y的最大值 int p1=-INF,p2=-INF;if(begin>=z&&end<=y) return max_tree[node];int fz=(begin + end) / 2;if(z<=fz)p1=findmax(2*node,begin,fz, z, y) ;if(y>fz)p2=findmax(2*node+1,fz+1,end,z,y);return max(p1,p2);}int getsum(int node,int begin,int end,int z,int y){//求z--y的和 if(begin>=z&&end<=y) return sum_tree[node];int fz=(begin + end) / 2;int sum=0;if(z<=fz) sum+=getsum(2*node,begin,fz,z,y);if(y>fz) sum+=getsum(2*node+1,fz+1,end,z,y);return sum;}void updata(int node,int begin,int end,int x,int num){//单点更新 if(begin==end){min_tree[node]=num;max_tree[node]=num;sum_tree[node]=num;return;}int fz=(begin+end)/2;if(x<=fz) updata(node*2,begin,fz,x,num);else updata(node*2+1,fz+1,end,x,num);min_tree[node]=min(min_tree[2*node],min_tree[2*node+1]);max_tree[node]=max(max_tree[2*node],max_tree[2*node+1]);sum_tree[node]=sum_tree[2*node]+sum_tree[2*node+1];}int main(){a[1]=2,a[2]=3,a[3]=8,a[4]=1,a[5]=5,a[6]=7;// 2 3 8 1 5 7 build(1,1,6);cout<<"2 3 8 1 5 7"<<endl; /*寻找2--5区间最小值 */ cout<<"2--5区间最小值:"<<findmin(1,1,6,2,5)<<endl;/*寻找2--5区间最大值 */ cout<<"2--5区间最大值:"<<findmax(1,1,6,2,5)<<endl;/* 求2--5区间和 */cout<<"2--5区间和 :"<<getsum(1,1,6,2,5)<<endl;/* 更新a[3]=0,a[4]=10 */updata(1,1,6,3,0);updata(1,1,6,4,10);cout<<"2 3 0 10 5 7"<<endl; //查询更新后的结果 /*寻找2--5区间最小值 */ cout<<"2--5区间最小值:"<<findmin(1,1,6,2,5)<<endl;/*寻找2--5区间最大值 */ cout<<"2--5区间最大值:"<<findmax(1,1,6,2,5)<<endl;/* 求2--5区间和 */cout<<"2--5区间和 :"<<getsum(1,1,6,2,5)<<endl;return 0;}
阅读全文
1 0
- 线段树基本操作(单点更新,区间极值,区间求和)
- 线段树(单点更新,区间求和)
- poj2352Stars【线段树单点更新区间求和】
- 线段树单点更新 区间求和,求最值
- leetCode_线段树、单点更新、区间求和
- HDU1166 线段树区间求和,单点更新
- 线段树总结(单点更新,区间更新,区间求和,区间求最值)
- 线段树经典操作模板(单点更新,替换;区间更新,替换;区间求和求最值)
- 线段树经典操作模板(单点更新,替换;区间更新,替换;区间求和求最值)
- hdu1394——线段树(单点更新 区间求和)
- HDU 1166 单点更新 区间求和(ZKW 线段树)
- hdu1166 敌兵布阵(线段树单点更新+区间求和)
- 蓝桥杯算法训练——操作格子(线段树+单点更新+区间求和+求最大值)
- 线段树(单点更新+区间更新)
- 操作格子 (线段树)(单点修改,区间求最值,区间求和)
- 线段树(成段更新,区间求和lazy操作 )
- 线段树 hdu 1166 敌兵布阵 单点更新区间求和
- 线段树 的单点更新和区间求和
- codevs 3336 电话网络 SPFA 解题报告
- Mac 本地安装 wordpress
- 基于深度残差学习的图像识别 Deep Residual Learning for Image Recognition
- 基于二级指针实现动态二维数组的不定长输入及遍历
- CodeForces #431Div. 2 849B Tell your world 几何 暴力 枚举
- 线段树基本操作(单点更新,区间极值,区间求和)
- linux学习---brk(), sbrk() 用法
- https工作原理
- 《机器学习》第二章 模型评估与选择 笔记3 查准率、查全率
- Andriod常用权限和依赖
- 利用POI框架创建excel表格
- 漏洞及渗透练习平台:
- 安利一个icon的网站
- Netty In Action学习心得(一) Netty产生的历史背景