线段树模板

来源:互联网 发布:萨德对中国的影响 知乎 编辑:程序博客网 时间:2024/06/10 16:32

区间修改+区间查询

#include <iostream>#include <cstdio>using namespace std;typedef long long LL;const int MAXN=100000+10;LL sum[MAXN<<2],Add[MAXN<<2];//注意数组要开成n*4大小;LL A[MAXN];int n,m,n1,x1,y1,k1;void Pushup(int rt) { sum[rt]=sum[rt<<1]+sum[(rt<<1)|1]; }void Pushdown(int rt,int ln,int rn){    if(Add[rt])    {        sum[rt<<1]+=Add[rt]*ln;        sum[(rt<<1)|1]+=Add[rt]*rn;        Add[rt<<1]+=Add[rt];            //下放标记的时候注意加的时Add[rt];        Add[(rt<<1)|1]+=Add[rt];        Add[rt]=0;    }}void build(int l,int r,int rt){    if(l==r)    {        sum[rt]=A[l];        return ;    }    int m=(l+r)>>1;    build(l,m,rt<<1);    build(m+1,r,(rt<<1)|1);    Pushup(rt);//要更新当前}void updata(int L,int R,int C,int l,int r,int rt)    //区间修改{    if(L<=l&&R>=r)    {        Add[rt]+=C;        sum[rt]+=C*(r-l+1);        return ;    }    int m=(l+r)>>1;    Pushdown(rt,m-l+1,r-m);    //每到一个节点就要下放标记    if(L<=m)    updata(L,R,C,l,m,rt<<1);    if(R>m) updata(L,R,C,m+1,r,(rt<<1)|1);    Pushup(rt);//注意}LL Query(int L,int R,int l,int r,int rt){    if(L<=l&&R>=r)    {           return sum[rt];    }    int m=(l+r)>>1; //!!!    Pushdown(rt,m-l+1,r-m);    //每到一个节点就下放标记;    LL ans=0;    if(L<=m)    ans+=Query(L,R,l,m,rt<<1);    if(R>m) ans+=Query(L,R,m+1,r,(rt<<1)|1);    return ans;}int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)        scanf("%lld",&A[i]);    build(1,n,1);    for(int i=1;i<=m;i++)    {        scanf("%d",&n1);        if(n1==1)        {            scanf("%d%d%d",&x1,&y1,&k1);            updata(x1,y1,k1,1,n,1);        }        else {            scanf("%d%d",&x1,&y1);            printf("%lld\n",Query(x1,y1,1,n,1));        }    }    return 0;   }

单点修改+区间查询

#include <iostream>#include <cstdio>using namespace std;const int MAXN=100000+10;int sum[MAXN<<2];int A[MAXN],n,m;int num,x1,y1,k;void Pushup(int rt) {sum[rt]=sum[rt<<1]+sum[(rt<<1)|1];}void build(int l,int r,int rt){    if(l==r)    {        sum[rt]=A[l];        return ;    }    int m=(l+r)>>1;    build(l,m,rt<<1);    build(m+1,r,(rt<<1)|1);    Pushup(rt);//要更新当前节点}void updata(int L,int C,int l,int r,int rt){    if(l==r)    {        sum[rt]+=C;        return ;    }    int m=(l+r)>>1;    if(L<=m)    updata(L,C,l,m,rt<<1);    else updata(L,C,m+1,r,(rt<<1)|1);    Pushup(rt);//更新当前节点}int Query(int L,int R,int l,int r,int rt){    if(L<=l&&R>=r)    {        return sum[rt];    }    int m=(l+r)>>1;    int ans=0;    if(L<=m)    ans+=Query(L,R,l,m,rt<<1);    if(R>m) ans+=Query(L,R,m+1,r,(rt<<1)|1);    return ans;}int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++)        scanf("%d",&A[i]);    build(1,n,1);    scanf("%d",&m);    for(int i=1;i<=m;i++)    {        scanf("%d%d%d",&x1,&y1,&k);        if(x1==1)   updata(y1,k,1,n,1);        else printf("%d\n",Query(y1,k,1,n,1));    }    return 0;}



0 0
原创粉丝点击