zoukankan      html  css  js  c++  java
  • HDU-4902-Nice boat

    这个题我用线段树做的,当中维护了2个值,一个是当前的改变值,另外一个存当前区间被做的取gcd值,那么凡是改变操作到的时候就能够清空后面gcd的操作,最后再每一个值更新一下输出来即可了。

    代码:‘

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    using namespace std;
    const int inf=1<<29;
    const int maxn=1e5+100;
    const int maxm=maxn*4;
    struct Node
    {
        int l;
        int r;
        int val;
        bool update;
        vector<int> X;
    }t[maxm];
    int n,a[maxn];
    void Build(int l,int r,int index)
    {
        t[index].l=l;
        t[index].r=r;
        t[index].update=false;
        t[index].X.clear();
        if(l==r)
        {
            t[index].val=a[l];
            return;
        }
        int mid=(l+r)>>1;
        Build(l,mid,index<<1);
        Build(mid+1,r,index<<1|1);
    }
    void PushDown(int index)
    {
        if(t[index].l==t[index].r)
            return;
        if(t[index].update)
        {
            t[index<<1].val=t[index<<1|1].val=t[index].val;
            t[index<<1].update=t[index<<1|1].update=true;
            t[index].update=false;
            t[index<<1].X=t[index].X;
            t[index<<1|1].X=t[index].X;
        }
        else
        {
            int len=t[index].X.size();
            for(int i=0;i<len;i++)
            {
                t[index<<1].X.push_back(t[index].X[i]);
                t[index<<1|1].X.push_back(t[index].X[i]);
            }
        }
        t[index].X.clear();
    }
    void Update(int l,int r,int index,int val,int op)
    {
        PushDown(index);
        //printf("LR %d %d %d %d %d
    ",t[index].l,t[index].r,l,r,val);
        if(t[index].l==l&&t[index].r==r)
        {
            if(op==1)
            {
                t[index].val=val;
                t[index].X.clear();
                t[index].update=true;
            }
            else if(op==2)
                t[index].X.push_back(val);
            else
            {
                int len=t[index].X.size();
                for(int i=0;i<len;i++)
                    if(t[index].val>t[index].X[i])
                    {
                        t[index].val=__gcd(t[index].val,t[index].X[i]);
                        if(t[index].val==1)
                            break;
                    }
                a[t[index].l]=t[index].val;
            }
            return;
        }
        int mid=(t[index].l+t[index].r)>>1;
        if(r<=mid)
            Update(l,r,index<<1,val,op);
        else if(l>mid)
            Update(l,r,index<<1|1,val,op);
        else
        {
            Update(l,mid,index<<1,val,op);
            Update(mid+1,r,index<<1|1,val,op);
        }
    }
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            for(int i=1;i<=n;i++)
                scanf("%d",&a[i]);
            Build(1,n,1);
            int m;
            scanf("%d",&m);
            while(m--)
            {
                int op,l,r,x;
                scanf("%d%d%d%d",&op,&l,&r,&x);
                if(op==1)
                    Update(l,r,1,x,1);
                else
                    Update(l,r,1,x,2);
            }
            for(int i=1;i<=n;i++)
                Update(i,i,1,0,3);
            for(int i=1;i<=n;i++)
                printf("%d ",a[i]);
            printf("
    ");
        }
        return 0;
    }
    


  • 相关阅读:
    Maximum Depth of Binary Tree
    Single Number
    Merge Two Sorted Lists
    Remove Nth Node From End of List
    Remove Element
    Remove Duplicates from Sorted List
    Add Two Numbers
    编译视频直播点播平台EasyDSS数据排序使用Go 语言 slice 类型排序的实现介绍
    RTMP协议视频直播点播平台EasyDSS在Linux系统中以服务启动报错can’t evaluate field RootPath in type*struct排查
    【解决方案】5G时代RTMP推流服务器/互联网直播点播平台EasyDSS实现360°全景摄像机VR直播
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4026806.html
Copyright © 2011-2022 走看看