线段树模板(学长给的,自己消化了一下,其实基本上差不多(好吧,一模一样QAQ))

来源:互联网 发布:8090端口是干嘛的 编辑:程序博客网 时间:2024/04/30 01:45

写这个的目的为了以后能再回看一下,哈哈:

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct node{int l,r,sum,Max,Min;}a[1000<<2];void pushup(int o)//更新数据 {a[o].Max=max(a[o*2].Max,a[o*2+1].Max);a[o].sum=a[o*2].sum+a[o*2+1].sum;a[o].Min=min(a[o*2].Min,a[o*2+1].Min);}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);}int main()//主要输入格式 {int n;scanf ("%d",&n);//n表示全部数据的个数 build(1,1,n);//UpDate(1,1,n,2,7);printf ("%d\n",Qure(1,1,n,2,4));return 0;}




阅读全文
0 0
原创粉丝点击