zoukankan      html  css  js  c++  java
  • hdu4614 (二分线段树)

    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    #include<string>
    #include<cstring>
    #include<set>
    #include<map>
    #include<list>
    #include<queue>
    #include<vector>
    #define tree int o,int l,int r
    #define lson o<<1,l,mid
    #define rson o<<1|1,mid+1,r
    #define lo o<<1
    #define ro o<<1|1
    #define ULL unsigned long long
    #define LL long long
    #define UI unsigned int
    #define inf 0x7fffffff
    #define eps 1e-7
    #define N 50009
    using namespace std;
    int T,n,m,t,maxv,x,y,ql,qr,k,b,a,f;
    int sum[N<<2];
    int setv[N<<2];
    void maintain(int o)
    {
        sum[o]=sum[o<<1]+sum[o<<1|1];
    }
    void pushdown(tree)
    {
        if(setv[o]!=-1)
        {
            int mid=(l+r)>>1;
            setv[o<<1]=setv[o<<1|1]=setv[o];
            sum[o<<1]=setv[o]*(mid-l+1);
            sum[o<<1|1]=setv[o]*(r-mid);
            setv[o]=-1;
        }
    }
    void update(tree,int val)
    {
        if(ql<=l&&qr>=r)
        {
            setv[o]=val;
            sum[o]=val*(r-l+1);
        }
        else
        {
            pushdown(o,l,r);
            int mid=(l+r)>>1;
            if(ql<=mid)
                update(lson,val);
            if(qr>mid)
                update(rson,val);
            maintain(o);
        }
    }
    int query(tree)
    {
        if(setv[o]!=-1)
            return (min(r,qr)-max(l,ql)+1)*setv[o];
        if(ql<=l&&qr>=r)
            return sum[o];
        else
        {
            pushdown(o,l,r);
            int mid=(l+r)>>1;
            int ans=0;
            if(ql<=mid)
                ans+=query(lson);
            if(qr>mid)
                ans+=query(rson);
    //        maintain(o);
            return ans;
        }
    }
    int bsearch(int l,int r,int x)
    {
        ql=l;
        while(l<r)
        {
            int mid=(l+r)>>1;
            qr=mid;
            int s=query(1,0,n);
            s=mid-ql+1-s;
            if(s>x)
                r=mid-1;
            else if(s<x)
                l=mid+1;
            else
                r=mid;
        }
        return l;
    }
    int main()
    {
    #ifndef ONLINE_JUDGE
        freopen("ex.in","r",stdin);
    #endif
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&m);
            n--;
            memset(sum,0,sizeof(sum));
            memset(setv,-1,sizeof(setv));
            while(m--)
            {
                scanf("%d%d%d",&k,&a,&b);
                f=b;
                if(k==1)
                {
                    ql=a,qr=n;
                    int s=query(1,0,n);
                    if(qr-ql+1-s==0)
                        printf("Can not put any one.
    ");
                    else
                    {
                        s=min(qr-ql+1-s,f);
                        int ll=ql,rr=qr;//ql会不断变化
                        int xl=bsearch(ll,rr,1);
                        int xr=bsearch(ll,rr,s);
                        ql=xl,qr=xr;
                        printf("%d %d
    ",ql,qr);
                        update(1,0,n,1);
                    }
                }
                else
                {
                    ql=a,qr=b;
                    printf("%d
    ",query(1,0,n));
                    update(1,0,n,0);
                }
            }
            puts("");
        }
        return 0;
    }
    

      

  • 相关阅读:
    第五周
    第三章 程序的机器级表示
    第二章 信息的表示和处理
    嵌入式Linux应用开发——Linux下的C编程基础
    Linux基础入门(20135207 王国伊)
    Java实验报告(实验四)
    linux系统之pam模块
    linux 从入门到跑路-时间,日期问题
    linux 从入门到跑路-Shell和部分命令
    linux 从入门到跑路-挂载,命令的执行顺序
  • 原文地址:https://www.cnblogs.com/sbaof/p/3215235.html
Copyright © 2011-2022 走看看