HDU-4902-Nice boat

來源:互聯網
上載者:User

標籤:style   io   os   ar   for   sp   div   art   on   

這個題我用線段樹做的,當中維護了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\n",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("\n");    }    return 0;}


HDU-4902-Nice boat

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.