设为首页 加入收藏

TOP

HDU 4902 Nice boat(线段树 区间更新)
2015-07-20 17:59:36 来源: 作者: 【 】 浏览:1
Tags:HDU 4902 Nice boat 线段 区间 更新

Nice boat


大意:给你一个区间,每次可以进行两种操作,1:把区间中的数全都变成x 2:把区间中大于x的数变成gcd(a[i], x),最后输出序列。


思路:线段树成段更行,用num数组的叶子存储数据,节点当作lazy来使用。

#include 
  
   
const int maxn = 100005;

int num[maxn<<2];

int gcd(int a, int b){
    return b?gcd(b, a%b):a;
}

void PushUp(int id){
    if(num[id<<1] == num[id<<1|1]){
        num[id] = num[id<<1];
    }
}

void PushDown(int id){
    if(num[id] != -1){
        num[id<<1] = num[id<<1|1] = num[id];
        num[id] = -1;
    }
}

void Build(int l, int r, int id){
    num[id] = -1;
    if(l == r){
        scanf("%d", &num[id]);
        return ;
    }
    int mid = (l+r)>>1;
    Build(l, mid, id<<1);
    Build(mid+1, r, id<<1|1);
    PushUp(id);
}


void Update(int op, int L, int R, int t, int l, int r, int id){
    if(op == 1){
        if(L <= l && r <= R){
            num[id] = t;
            return ;
        }
    }
    else if(op == 2){
        if(L <= l && r <= R && num[id] != -1){
            if(num[id] > t){
                num[id] = gcd(num[id], t);
            }
            return ;
        }
    }
    PushDown(id);
    int mid = (l+r)>>1;
    if(L <= mid){
        Update(op, L, R, t, l, mid, id<<1);
    }
    if(R > mid){
        Update(op, L, R, t, mid+1, r, id<<1|1);
    }
    PushUp(id);
}

void Query(int l, int r, int id){
    if(l == r){
        printf("%d ", num[id]);
        return ;
    }
    PushDown(id);
    int mid = (l+r)>>1;
    Query(l, mid, id<<1);
    Query(mid+1, r, id<<1|1);
}

int T, n, m;

int main()
{
    scanf("%d", &T);
    while(T--){
        scanf("%d", &n);
        Build(1, n, 1);
        scanf("%d", &m);
        while(m--){
            int op, a, b, c;
            scanf("%d%d%d%d", &op, &a, &b, &c);
            Update(op, a, b, c, 1, n, 1);
        }
        Query(1, n, 1);
        puts("");
    }

    return 0;
}

  


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇ural 1932 The Secret of Identif.. 下一篇关于c++与java中文乱码问题分析与..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: