• hdu 4902 Nice boat


    http://acm.hdu.edu.cn/showproblem.php?pid=4902

    线段树 区间更新 模板题

    #include<bits/stdc++.h>
    using namespace std;
    #define N 100005
    #define mid (l+r)/2
    #define lc (rt<<1)
    #define rc (rt<<1|1)
    
    int T[N<<2],lazy[N<<2];
    void up(int rt){
        T[rt] = max(T[lc],T[rc]);
    }
    int gcd(int a,int b){
        return b==0?a:gcd(b,a%b);
    }
    void down(int rt){
        if(lazy[rt] != -1){
            lazy[lc]=lazy[rc]=lazy[rt];
            T[lc]=T[rc]=T[rt];
            lazy[rt]=-1;
        }
    }
    void build(int l,int r,int rt){
        lazy[rt] = -1;
        if(l == r){
            scanf("%d",&T[rt]);
            lazy[rt] = T[rt];
            return ;
        }
        build(l,mid,lc);
        build(mid+1,r,rc);
        up(rt);
    }
    void update(int l,int r,int L,int R,int id,int x,int rt){
        if(L <= l && r <= R){
            if(id == 1){
                lazy[rt]=x;
                T[rt] = x;
                return ;
            }
            else {
                if(lazy[rt] != -1){
                    if(lazy[rt] > x)
                    {
                        lazy[rt] = gcd(lazy[rt],x);
                        T[rt] = lazy[rt];
                    }
                    return ;
                }//如果不等于1的话 还是要进行后面的继续查询
            }
        }
        down(rt);
        if(L <= mid)update(l,mid,L,R,id,x,lc);
        if(R > mid )update(mid+1,r,L,R,id,x,rc);
        up(rt);
    }
    void out(int l,int r,int rt)
    {
        if(lazy[rt] != -1){
            for(int i=l;i<=r;i++){
                printf("%d ",T[rt]);
            }
            return ;
        }
        if(l == r){
            printf("%d ",&T[rt]);
            return ;
        }
        down(rt);
        out(l,mid,lc);
        out(mid+1,r,rc);
    }
    int main ()
    {
        int t;
        scanf("%d",&t);
        while (t--){
            int n,m;
            scanf("%d",&n);
            build(1,n,1);
            scanf("%d",&m);
            for(int i=1;i<=m;i++)
            {
                int id,l,r,x;
                scanf("%d %d %d %d",&id,&l,&r,&x);
                update(1,n,l,r,id,x,1);
            }
            out(1,n,1);
            puts("");
        }
        return 0;
    }
  • 相关阅读:
    安卓学习57
    安卓学习56
    安卓学习55
    安卓学习54
    安卓学习53
    安卓学习52
    安卓学习51
    安卓学习50
    安卓学习49
    安卓学习48
  • 原文地址:https://www.cnblogs.com/Draymonder/p/7751755.html
Copyright © 2020-2023  润新知