Gym The 17th Zhejiang Provincial Collegiate Programming Contest B. Bin Packing Problem(线段树+map)

 

 

const int N=1e6+5;

    int n,m,_;
    int i,j,k;
    int a[N];
    struct Node
    {
        int l,r;
        int maxx;
        #define lson id<<1
        #define rson id<<1|1
    }t[N<<2];
    multimap<int,int> mp;

void push_up(int id)
{
    t[id].maxx=max(t[lson].maxx,t[rson].maxx);
}

void build(int l,int r,int id)
{
    t[id].l=l,t[id].r=r;
    t[id].maxx=0;
    if(l==r) t[id].maxx=m;
    else{
        int mid=l+r>>1;
        build(l,mid,lson);
        build(mid+1,r,rson);
        push_up(id);
    }
}

int query(int id,int c)
{
    int l=t[id].l,r=t[id].r;
    if(l==r) return l;
    else{
        int mid=l+r>>1;
        if(t[lson].maxx>=c) return query(lson,c);
        else return query(rson,c);
    }
}

void update(int id,int pos,int c)
{
    int l=t[id].l,r=t[id].r;
    if(l==r) t[id].maxx-=c;
    else{
        int mid=l+r>>1;
        if(mid>=pos) update(lson,pos,c);
        else update(rson,pos,c);
        push_up(id);
    }
}

int main()
{
    rush(){
        sdd(n,m);
        mp.clear();
        for(int i=1;i<=n;i++) sd(a[i]),mp.insert({m,i}); mp.insert({m,n+1});
        build(1,n+1,1);
        for(int i=1;i<=n;i++){
            int pos=query(1,a[i]);
            update(1,pos,a[i]);
        }
        int pos=query(1,m);
        pii ans={pos-1,0};

        auto it=mp.begin();
        for(int i=1;i<=n;i++){
            it=mp.lower_bound(a[i]);
            pii x=make_pair(it->first-a[i],it->second);
            //dbg(it->first);
            mp.insert(x);
            mp.erase(it);
        }
        it=mp.lower_bound(m);
        ans.second=(it->second)-1;
        printf("%d %d\n",ans.first,ans.second);
    }
    //PAUSE;
    return 0;
}

 

相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页