zoukankan      html  css  js  c++  java
  • hdu 4614 Vases and Flowers

    http://acm.hdu.edu.cn/showproblem.php?pid=4614

    直接线段树维护

    代码:

    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<cmath>
    #include<set>
    #include<map>
    #include<stack>
    #include<vector>
    #include<algorithm>
    #include<queue>
    #include<bitset>
    #include<deque>
    #include<numeric>
    
    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    typedef long long ll;
    typedef unsigned int uint;
    typedef pair<int,int> pp;
    const double eps=1e-9;
    const int INF=0x3f3f3f3f;
    const ll MOD=1000000007;
    const int N=50001;
    struct node
    {
        int l,r,k;
        int m;
    }btr[N*4];
    void update(int x,int l,int r,int k)
    {
        if(btr[x].l==l&&btr[x].r==r)
        {
            btr[x].k=k;
            btr[x].m=k*(btr[x].r-btr[x].l+1);
            return ;
        }
        if(btr[x].k!=-1)
        {
            btr[(x<<1)].k=btr[(x<<1)|1].k=btr[x].k;
            btr[(x<<1)].m=(btr[(x<<1)].r-btr[(x<<1)].l+1)*btr[(x<<1)].k;
            btr[(x<<1)|1].m=(btr[(x<<1)|1].r-btr[(x<<1)|1].l+1)*btr[(x<<1)|1].k;
        }
        int mid=(btr[x].l+btr[x].r)>>1;
        if(r<=mid)
        update((x<<1),l,r,k);
        else if(l>mid)
        update((x<<1)|1,l,r,k);
        else
        {
            update((x<<1),l,mid,k);
            update((x<<1)|1,mid+1,r,k);
        }
        btr[x].m=btr[(x<<1)].m+btr[(x<<1)|1].m;
        if(btr[(x<<1)].k==btr[(x<<1)|1].k)
        btr[x].k=btr[(x<<1)].k;
        else
        btr[x].k=-1;
    }
    int get(int x,int l,int r)
    {
        if(btr[x].l==l&&btr[x].r==r)
        return btr[x].m;
        if(btr[x].k!=-1)
        return (btr[x].k*(r-l+1));
        int mid=(btr[x].l+btr[x].r)>>1;
        if(r<=mid)
        return get((x<<1),l,r);
        else if(l>mid)
        return get((x<<1)|1,l,r);
        else
        return get((x<<1),l,mid)+get((x<<1)|1,mid+1,r);
    }
    void build(int x,int l,int r)
    {//cout<<x<<" "<<l<<" "<<r<<endl;
        btr[x].l=l;
        btr[x].r=r;
        btr[x].k=0;
        btr[x].m=0;
        if(l==r)
        return ;
        int mid=(l+r)>>1;
        build((x<<1),l,mid);
        build((x<<1)|1,mid+1,r);
    }
    int bs(int l,int r,int k)
    {
        int x=l;
        while(l<=r)
        {
            int m=(l+r)>>1;
            if((m-x+1-get(1,x,m))>=k)
            r=m-1;
            else
            l=m+1;
        }
        return l;
    }
    int main()
    {
        //freopen("data.in","r",stdin);
        int T;
        scanf("%d",&T);
        while(T--)
        {
            int n,m;
            scanf("%d %d",&n,&m);
            build(1,0,n-1);
            while(m--)
            {
                int w;
                scanf("%d",&w);
                if(w==1)
                {
                    int a,f;
                    scanf("%d %d",&a,&f);
                    int tmp=get(1,a,n-1);
                    if(tmp==(n-a)||f==0)
                    {printf("Can not put any one.
    ");continue;}
                    f=min(f,n-a-tmp);
                    int l=bs(a,n-1,1);
                    int r=bs(a,n-1,f);
                    printf("%d %d
    ",l,r);
                    update(1,l,r,1);
                }else
                {
                    int l,r;
                    scanf("%d %d",&l,&r);
                    printf("%d
    ",get(1,l,r));
                    update(1,l,r,0);
                }
            }
            printf("
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    Redis5.x五种数据类型常见命令
    Redis5.x安装以及常见数据类型
    《Redis5.x入门教程》正式推出
    PPT制作套路指南
    如何更优雅地对接第三方API
    软件开发要质量还是要效率?
    前后端分离对于开发人员的挑战
    Spring中老生常谈的FactoryBean
    消费端如何保证消息队列MQ的有序消费
    《ElasticSearch6.x实战教程》之实战ELK日志分析系统、多数据源同步
  • 原文地址:https://www.cnblogs.com/liulangye/p/3215307.html
Copyright © 2011-2022 走看看