一些线段树的题目

来源:互联网 发布:无间道3解析知乎 编辑:程序博客网 时间:2024/05/17 03:28

hdu 1689

lazt tag

#include<iostream>#include<cstring>using namespace std;const int maxn = 800000;const int inf = 65535;int add[maxn];struct node{    int l, r, sum;}tree[maxn];void build(int rt, int l, int r){    tree[rt].l = l;    tree[rt].r=r;    tree[rt].sum=1;    int mid = (l+r)>>1;    if(l == r)        return;    if(l<=mid) build(rt<<1,l,mid);    if(r>mid) build(rt<<1|1,mid+1,r);}void push_down(int rt){    if(add[rt]){        add[rt<<1] = add[rt<<1|1] = add[rt];        tree[rt<<1].sum = (tree[rt<<1].r-tree[rt<<1].l+1)*add[rt];        tree[rt<<1|1].sum = (tree[rt<<1|1].r-tree[rt<<1|1].l+1)*add[rt];        add[rt] = 0;    }}void update(int l, int r, int num,  int rt){    if(l<=tree[rt].l && r>=tree[rt].r){        add[rt] = num;        tree[rt].sum = num*(tree[rt].r-tree[rt].l+1);        return ;    }    push_down(rt);    int mid = (tree[rt].l+tree[rt].r)>>1;    if(l<=mid)        update(l, r,num, rt<<1);    if(r>mid)        update(l, r,num,  rt<<1|1);    tree[rt].sum = tree[rt<<1].sum + tree[rt<<1|1].sum;}int main(int argc, char const *argv[]) {    int T;    cin >> T;    while(T--){        memset(add, 0, sizeof(add));        int n;        cin >> n;        build(1,1, n);        cout << "1" << endl;        int m;        cin >> m;        int a, b, c;        for(int i=1; i<=m; i++){            cin >> a >> b >> c;            update(a, b, c, 1);        }        cout << tree[1].sum << endl;    }    return 0;}/*11021 5 25 9 3*/

poj 3667

#include <stdio.h>const int maxn = 50000;int n, mNum, op, a, b;int sum[maxn*3], lsum[maxn*3], rsum[maxn*3], cover[maxn*3];void BuildTree(int l, int r, int rt){    cover[rt] = -1;    lsum[rt] = rsum[rt] = sum[rt] = r-l+1;    if (l == r)        return ;    int m = (l+r)>>1;    BuildTree(l, m, rt<<1);    BuildTree(m+1, r, rt<<1|1);}/* BuildTree */void PushDown(int rt, int k){    if (cover[rt] != -1)    {   /* Lazy Tag */        cover[rt<<1] = cover[rt<<1|1] = cover[rt];        lsum[rt<<1] = rsum[rt<<1] = sum[rt<<1] = cover[rt]==0 ? 0:(k-(k>>1));        lsum[rt<<1|1] = rsum[rt<<1|1] = sum[rt<<1|1] = cover[rt]==0 ? 0:(k>>1);        cover[rt] = -1;    }}/* PushDown */int query(int w, int l, int r, int rt){    if (l == r)        return 1;    PushDown(rt, r-l+1);    /* Push Down */    int m = (l+r)>>1;    if (sum[rt<<1] >= w)    /* 左连续区间长度 */        return query(w, l, m, rt<<1);    else if (rsum[rt<<1]+lsum[rt<<1|1] >= w) /* 左区间后半部分与右区间左半部分长度 */        return m-rsum[rt<<1]+1;    else                    /* 右连续区间长度 */        return query(w, m+1, r, rt<<1|1);}/* query */int Max(int x, int y){    return (x>y ? x:y);}/* Max */void PushUp(int rt, int k){    lsum[rt] = lsum[rt<<1];   /* 左区间的左半部分 */    rsum[rt] = rsum[rt<<1|1]; /* 右区间的右半部分 */    if (lsum[rt] == k-(k>>1))        lsum[rt] += lsum[rt<<1|1];    if (rsum[rt] == k>>1)        rsum[rt] += rsum[rt<<1];    sum[rt] = Max(rsum[rt<<1]+lsum[rt<<1|1], Max(sum[rt<<1], sum[rt<<1|1]));}/* PushUp */void UpData(int L, int R, int c, int l, int r, int rt){    if (L<=l && r<=R)    {        lsum[rt] = rsum[rt] = sum[rt] = c==0? 0 : r-l+1;        cover[rt] = c;        return ;    }/* End of If */    PushDown(rt, r-l+1);    /* Push Down */    int m = (l+r)>>1;    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, r-l+1);      /* Push Up */}/* Updata */int main(){    scanf("%d %d", &n, &mNum);    BuildTree(1, n, 1); /* BuildTree */    for (int i=1; i<=mNum; ++i)    {        scanf("%d", &op);        if (op == 1)        {   // Request            scanf("%d", &a);            if (sum[1] < a)                printf("0\n");  /* No result */            else            {                int pos = query(a, 1, n, 1);                printf("%d\n", pos);                UpData(pos, pos+a-1, 1, 1, n, 1);   /* UpData the interval */            }        }/* End of If */        else        {            scanf("%d %d", &a, &b);            UpData(a, a+b-1, 0, 1, n, 1);   /* UpData the interval */        }    }/* End of For */    return 0;}/*10 61 31 31 31 32 5 51 6*/

poj 3468

/*#include <iostream>#include<cstdio>using namespace std;const int maxn = 100001;int lsum[maxn*4], rsum[maxn*4], sum[maxn*4], cov[maxn*4];int v[maxn];int n, m;void build(int l, int r, int rt){    cov[rt] = 0;    lsum[rt] = rsum[rt] = sum[rt] = 0;    if(l == r)        return ;    int m = (l+r)>>1;    build(l, m, rt<<1);    build(m+1, r, rt<<1|1);}int query(int ll, int rr, int l, int r, int rt){    if(ll<=l && rr>=r)    {        return sum[rt];    }    int m = (l+r)>> 1;    if(ll<m)        query(ll, m, l, r, rt<<1);    if(rr>=m)        query(m+1, rr, l, r, rt<<1|1);    sum[rt] = lsum[rt<<1]+ rsum[rt<<1|1];}void update(int ll, int rr, int v, int l, int r, int rt){    if(ll<=l && rr>=r)    {        sum[rt] += v*(rr-ll+1);        lsum[rt] += v*(rr-ll+1);        rsum[rt] += v*(rr-ll+1);        return ;    }    int m = (ll+rr)>>1;    if(ll < m)    update(ll, m, v, l, r, rt<<1);    if(rr >= m)    update(m+1, rr, v, l, r, rt<<1|1);}int main(){    char c;    int a, b, v;    cin >> n >> m;    build(1, n, 1);    for(int i=1; i<=n; i++)    {        scanf("%d", &v);        update(i, i, v, 1, n, 1);    }    for(int i=1; i<=m; i++)    {        scanf("%c", &c);        if(c == 'Q')        {            scanf("%d%d", &a, &b);            int ans = query(a, b, 1, n, 1);            printf("%d\n", ans);        }        else        {            scanf("%d%d%d", &a, &b, &v);            update(a, b, v, 1, n, 1);        }    }    return 0;}*//*10 51 2 3 4 5 6 7 8 9 10Q 4 4Q 1 10Q 2 4C 3 6 3Q 2 4*//*455915Process returned 0 (0x0)   execution time : 4.933 sPress any key to continue.*/#include <stdio.h>#include<iostream>using namespace std;#define N 111111#define LL long long#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1LL add[N<<2];LL sum[N<<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]+=(m-(m>>1))*add[rt];        sum[rt<<1|1]+=(m>>1)*add[rt];        add[rt]=0;    }}void Build(int l,int r,int rt){    add[rt]=0;    if(l==r)    {        scanf("%I64d",&sum[rt]);        return;    }    int m=(l+r)>>1;    Build(lson);    Build(rson);    PushUP(rt);}void Update(int L,int R,int c,int l,int r,int rt){    if(L<=l&&R>=r)    {        add[rt]+=c;        sum[rt]+=(LL)c*(r-l+1);        return;    }    PushDown(rt,r-l+1);    int m=(l+r)>>1;    if(L<=m)        Update(L,R,c,lson);    if(R>m)        Update(L,R,c,rson);    PushUP(rt);}LL Query(int L,int R,int l,int r,int rt){    if(L<=l&&R>=r)        return sum[rt];    PushDown(rt,r-l+1);    int m=(l+r)>>1;    LL ret=0;    if(L<=m)   ret+=Query(L,R,lson);    if(R>m)    ret+=Query(L,R,rson);    return ret;}int main(){    scanf("%d%d",&n,&m);    Build(1,n,1);    while(m--)    {        char s[5];        int a,b,c;        scanf("%s",s);        if(s[0]=='Q')        {            scanf("%d%d",&a,&b);            printf("%I64d\n",Query(a,b,1,n,1));        }        else        {            scanf("%d%d%d",&a,&b,&c);            Update(a,b,c,1,n,1);        }    }    return 0;}


0 0
原创粉丝点击