线段树整理

来源:互联网 发布:淘宝女装banner 编辑:程序博客网 时间:2024/06/03 18:39

主要是记录一下线段树的写法,包括建树、区间查询、单点更新
以后就统一用这个写法了,很清楚

HDU1754(线段树单点查询+单点更新)

#include <iostream>#include <cstring>#include <string>#include <algorithm>#include <cstdio>#include <cmath>#include <map>#include <set>#include <queue>#include <vector>#define mod  1000000007#define INF  0x3f3f3f3f#define fuck() (cout << "----------------------------------------" << endl)using namespace std;const int maxn = 2000000 + 5;int a[maxn];int sum[maxn * 4];void bulid(int o, int l, int r){    if(l == r)    {        sum[o] = a[l];        return;    }    int m = (l + r) / 2;    bulid(o*2, l, m);    bulid(o*2+1, m+1, r);    sum[o] = max(sum[o*2], sum[o*2+1]);}int query(int o, int l, int r, int ql, int qr){    if(ql <= l && qr >= r)        return sum[o];    int m = (l + r) / 2;    int ans1 = 0, ans2 = 0;    if(ql <= m) ans1 = query(o*2,l,m,ql,qr);    if(qr > m) ans2 = query(o*2+1,m+1,r,ql,qr);    return max(ans1, ans2);}void update(int o, int l, int r, int pos, int val){    if(l == pos && r == pos)    {        sum[o] = val;        return;    }    int m = (l + r) / 2;    if(pos <= m)        update(2*o,l,m,pos,val);    else        update(2*o+1,m+1,r,pos,val);    sum[o] = max(sum[o*2],sum[o*2+1]);}int main(){    int n,m;    while(scanf("%d%d",&n,&m) == 2)    {        for(int i=1; i<=n; i++)            scanf("%d",&a[i]);        bulid(1,1,n);        while(m--)        {            char op;            getchar();            scanf("%c",&op);            if(op == 'Q')            {                int l,r;                scanf("%d%d",&l,&r);                printf("%d\n",query(1,1,n,l,r));            }            else            {                int x,y;                scanf("%d%d",&x,&y);                update(1,1,n,x,y);            }        }    }    return 0;}

hihocoder 1078(线段树区间更新+区间查询)

#include <iostream>#include <algorithm>#include <queue>#include <stack>#include <cstdio>#include <string>#include <cstring>#include <vector>#include <set>#define LL long long#define INF 0x3f3f3f3f#define MOD 1000000007const int maxn = 1e5 + 5;using namespace std;int sum[maxn * 4];int lazy[maxn * 4];int a[maxn];void pushdown(int l, int r, int o){    if(lazy[o]){        int m = (l + r) / 2;        sum[o*2] = (m-l+1)*lazy[o];        sum[o*2+1] = (r-m)*lazy[o];        lazy[o*2] = lazy[o];        lazy[o*2+1] = lazy[o];        lazy[o] = 0;    }    return;}void build(int l, int r, int o){    lazy[o] = 0;    if(l == r){        sum[o] = a[l];        return;    }    int m = (l + r) / 2;    build(l,m,o*2);    build(m+1,r,o*2+1);    sum[o] = sum[o*2] + sum[o*2+1];    return ;}void update(int l, int r, int o, int ql, int qr, int c){    if(ql <= l && qr >= r){        sum[o] = (r - l + 1) * c;        lazy[o] = c;        return;    }    int m = (l + r) / 2;    pushdown(l, r, o);    if(ql <= m)        update(l,m,o*2,ql,qr,c);    if(qr > m)        update(m+1,r,o*2+1,ql,qr,c);    sum[o] = sum[o*2] + sum[o*2+1];    return;}int query(int l, int r, int o, int ql, int qr){    if(ql <= l && qr >= r){        return sum[o];    }    int m = (l + r) / 2;    pushdown(l, r, o);    int ans = 0;    if(ql <= m)        ans += query(l,m,o*2,ql,qr);    if(qr > m)        ans += query(m+1,r,o*2+1,ql,qr);    return ans;}int main(){    int n;    scanf("%d",&n);    for(int i=1; i<=n; i++)        scanf("%d",&a[i]);    build(1,n,1);    int q;    scanf("%d",&q);    while(q--){        int op;        scanf("%d",&op);        if(op == 1){            int l, r, c;            scanf("%d%d%d",&l,&r,&c);            update(1,n,1,l,r,c);        }        else{            int l, r;            scanf("%d%d",&l,&r);            printf("%d\n",query(1,n,1,l,r));        }    }}
原创粉丝点击