线段树个人模板

来源:互联网 发布:工业企业数据库 161 编辑:程序博客网 时间:2024/04/30 09:26
第一段代码:维护区间内最大值(单点维护)
<pre name="code" class="cpp">#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#define rep(i,a,b)for (int i=a;i<=b;i++)using namespace std;const int Max=0x3f3f3f3f;struct Node{int maxi;int l,r;}node[600050];int n,m,score[200050]={0};void buildtree(int pos,int l,int r){node[pos].l=l,node[pos].r=r;if (l==r)node[pos].maxi=score[l];else {buildtree(2*pos,l,(l+r)>>1);buildtree(2*pos+1,((l+r)>>1)+1,r);node[pos].maxi=max(node[2*pos].maxi,node[2*pos+1].maxi);}}void update(int pos,int k,int val){if (val>node[pos].maxi)node[pos].maxi=val;if (node[pos].l==node[pos].r)return ;if (k<=node[2*pos].r)update(pos*2,k,val);else update(pos*2+1,k,val);}int query(int pos,int l,int r){if (node[pos].l==l&&node[pos].r==r)return node[pos].maxi;if (r<=node[2*pos].r)return query(pos*2,l,r);if (l>=node[2*pos+1].l)return query(pos*2+1,l,r);int v1=query(pos*2,l,node[pos*2].r),v2=query(pos*2+1,node[2*pos+1].l,r);return (max(v1,v2));}int main(){scanf("%d%d",&n,&m);rep(i,1,n)scanf("%d",&score[i]);getchar();buildtree(1,1,n);char c;int a,b;rep(i,1,m){scanf("%c%d%d",&c,&a,&b);getchar();if (c=='U')update(1,a,b);elseprintf("%d\n",query(1,a,b));}return 0;}



第二段代码:维护一段区间和,能够对一段区间进行更新(区间维护)
#include<iostream>#include<cstdio>#include<cstring>#define rep(i,a,b)for (int i=a;i<=b;i++)using namespace std;struct Node{int sum,l,r;}node[3000];int n,m,num[3000]={0};void build(int k,int l,int r){node[k].l=l,node[k].r=r;if (l==r)node[k].sum=num[l];else{build(2*k,l,(l+r)>>1);build(2*k+1,((l+r)>>1)+1,r);node[k].sum=node[2*k].sum+node[2*k+1].sum;}}void update(int k,int l,int r,int x){if (l<=node[k].l&&r<=node[k].r)node[k].sum+=(r-l+1)*x;if (node[k].l==node[k].r)return ;if (l<=node[2*k].r)update(2*k,l,node[2*k].r,x);if (r>=node[2*k+1].l)update(2*k+1,node[2*k+1].l,r,x);}int query(int k,int l,int r){if (l==node[k].l&&r==node[k].r)return node[k].sum;if (r<=node[2*k].r)return query(2*k,l,r);if (l>=node[2*k+1].l)return query(2*k+1,l,r);return query(2*k,l,node[2*k].r)+query(2*k+1,node[2*k+1].l,r);}int main(){scanf("%d%d",&n,&m);rep(i,1,n)scanf("%d",&num[i]);build(1,1,n);getchar();char c;int a,b,x;rep(i,1,m){scanf("%c",&c);if (c=='U'){scanf("%d%d%d",&a,&b,&x);getchar();update(1,a,b,x);}else{scanf("%d%d",&a,&b);getchar();printf("%d\n",query(1,a,b));}}return 0;}


0 0
原创粉丝点击