线段树模板

来源:互联网 发布:linux grep命令 递归 编辑:程序博客网 时间:2024/06/18 12:35

单点更新,区间求和:

#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int NV = 100005;int sum[NV<<2];void PushUp(int rt){    sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void build(int l,int r,int rt=1){    if (l == r)    {        sum[rt]=0;        return ;    }    int m = (l + r) >> 1;    build(lson);    build(rson);    PushUp(rt);}void update(int L,int c,int l,int r,int rt=1){    if (L == l && l == r)    {        sum[rt] += c;        return ;    }    int m = (l + r) >> 1;    if (L <= m) update(L , c , lson);    else update(L , c , rson);    PushUp(rt);}int query(int L,int R,int l,int r,int rt=1){    if (L <= l && r <= R)        return sum[rt];    int m = (l + r) >> 1;    int ret = 0;    if (L <= m) ret += query(L , R , lson);    if (m < R) ret += query(L , R , rson);    return ret;}int main(){    return 0;}

区间更新,区间求和:

#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int NV = 100005;long long add[NV<<2],sum[NV<<2];void PushUp(int rt){    sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void PushDown(int rt,int m){    if (add[rt])    {        add[rt<<1] += add[rt];        add[rt<<1|1] += add[rt];        sum[rt<<1] += add[rt] * (m - (m >> 1));        sum[rt<<1|1] += add[rt] * (m >> 1);        add[rt] = 0;    }}void build(int l,int r,int rt=1){    add[rt] = 0;    if (l == r)    {        scanf("%lld",&sum[rt]);        return ;    }    int m = (l + r) >> 1;    build(lson);    build(rson);    PushUp(rt);}void update(int L,int R,long long c,int l,int r,int rt=1){    if (L <= l && r <= R)    {        add[rt] += c;        sum[rt] += c * (r - l + 1);        return ;    }    PushDown(rt , r - l + 1);    int m = (l + r) >> 1;    if (L <= m) update(L , R , c , lson);    if (m < R) update(L , R , c , rson);    PushUp(rt);}long long query(int L,int R,int l,int r,int rt=1){    if (L <= l && r <= R)    {        return sum[rt];    }    PushDown(rt , r - l + 1);    int m = (l + r) >> 1;    long long ret = 0;    if (L <= m) ret += query(L , R , lson);    if (m < R) ret += query(L , R , rson);    return ret;}int main(){    return 0;}


0 0
原创粉丝点击