L - Vases and Flowers HDU - 4614 -线段树修改

  • L - Vases and Flowers

  •  HDU - 4614 
  • #include<stdio.h>
    #define maxn 50150
    int ans,st,ed,num;
    int t,k,n,f,q;
    struct node
    {
        int sum,l,r;
        int len()
        {
            return r-l+1;
        }
        int mid()
        {
            return (l+r)/2;
        }
    } tree[maxn*4];
    void build(int root,int l,int r)
    {
        tree[root].l=l;
        tree[root].r=r;
        tree[root].sum=0;
        if(l==r)return;
        int mid=(l+r)/2;
        build(root*2,l,mid);
        build(root*2+1,mid+1,r);
    }
    void pushdown(int root)
    {
        if(tree[root].sum==0)
            tree[root*2].sum=tree[root*2+1].sum=0;
        if(tree[root].sum==tree[root].len())
        {
            tree[root*2].sum=tree[root*2].len();
            tree[root*2+1].sum=tree[root*2+1].len();
        }
    }
    void pushup(int root)
    {
        tree[root].sum=tree[root*2].sum+tree[root*2+1].sum;
    }
    void put(int root,int l,int r)
    {
        if(num==0||tree[root].sum==tree[root].len())
            return;
        if(tree[root].l==l&&tree[root].r==r&&num>=tree[root].len()&&tree[root].sum==0)
        {
            num-=tree[root].len();
            tree[root].sum=tree[root].len();
            if(st==-1)
                st=tree[root].l;
            ed=tree[root].r;
            return ;
        }
        pushdown(root);
        int mid=tree[root].mid();
        if(r<=mid)
            put(root*2,l,r);
        else if(l>mid)
            put(root*2+1,l,r);
        else
        {
            put(root*2,l,mid);
            put(root*2+1,mid+1,r);
        }
        pushup(root);
    }
    void cleard(int root,int l,int r)
    {
        if(tree[root].l==l&&tree[root].r==r)
        {
            ans+=tree[root].sum;
            tree[root].sum=0;
            return;
        }
        pushdown(root);
        int mid=tree[root].mid();
        if(r<=mid)
            cleard(root*2,l,r);
        else if(l>mid)
            cleard(root*2+1,l,r);
        else
        {
            cleard(root*2,l,mid);
            cleard(root*2+1,mid+1,r);
        }
        pushup(root);
    }
    int main()
    {
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&q);
            build(1,1,n);
            for(int i=0; i<q; i++)
            {
                scanf("%d",&k);
                if(k==1)
                {
                    st=ed=-1;
                    scanf("%d%d",&f,&num);
                    put(1,f+1,n);
                    if(st==-1)
                        printf("Can not put any one.\n");
                    else
                        printf("%d %d\n",st-1,ed-1);
                }
                else
                {
                    ans=0;
                    scanf("%d%d",&f,&num);
                    cleard(1,f+1,num+1);
                    printf("%d\n",ans);
                }
            }
            printf("\n");
        }
        return 0;
    }
    

猜你喜欢

转载自blog.csdn.net/BePosit/article/details/84023262