ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Washing clothes(李超树)

2019-09-06 19:05:23  阅读:326  来源: 互联网

标签:rt Washing int LL tr define ti 李超树 clothes


original link - https://nanti.jisuanke.com/t/41306

题意:

给出nnn个人的到来时间tit_iti​和手洗的时间为yyy。

每个人可以手洗或者机洗,一个时间内只能有一个人机洗,对于每种机洗时间x[1,y]x\in[1,y]x∈[1,y],求最短完成时间。

解析:

假设答案中iii要手洗,那么显然之前的人也要手洗(不可能使答案变劣)。

那么设第iii人最后手洗,答案应该是max(ti+y,maxj>i(tj+(nj+1)x))max(t_i+y,max_{j>i}(t_j+(n-j+1)x))max(ti​+y,maxj>i​(tj​+(n−j+1)x))

后面部分也不是很难懂,设ppp为之后全部连续至结束的那个人。如果ppp之前有空挡,那么答案一定不会是tj+(nj+1)x&ThickSpace;(j&lt;p)t_j+(n-j+1)x\;(j&lt;p)tj​+(n−j+1)x(j<p),所以答案就是tp(np+1)xt_p(n-p+1)xtp​(n−p+1)x,也就是maxj&gt;i(tj+(nj+1)x)max_{j&gt;i}(t_j+(n-j+1)x)maxj>i​(tj​+(n−j+1)x)


考虑最后的答案,对于第iii个人,如果手洗ti+yt_i+yti​+y,机洗ti+(ni+1)xt_i+(n-i+1)xti​+(n−i+1)x,取一个小的即可。而如果我们以xxx做下标建树,第iii个人的贡献就是一条折线。我们用李超树维护折线,对于每个xxx取最大值即可。

这边可以单单取ti+(ni+1)xt_i+(n-i+1)xti​+(n−i+1)x是因为如果出现不连续,实际值大于ti+(ni+1)xt_i+(n-i+1)xti​+(n−i+1)x的话,这个状态一定会被另外一个点带来。

代码:

/*
 *  Author : Jk_Chen
 *    Date : 2019-09-06-13.16.04
 */
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define rep(i,a,b) for(int i=(int)(a);i<=(int)(b);i++)
#define per(i,a,b) for(int i=(int)(a);i>=(int)(b);i--)
#define mmm(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define pill pair<int, int>
#define fi first
#define se second
#define debug(x) cerr<<#x<<" = "<<x<<'\n';
const LL mod=1e9+7;
const int maxn=1e6+9;
LL rd(){ LL ans=0; char last=' ',ch=getchar();
    while(!(ch>='0' && ch<='9'))last=ch,ch=getchar();
    while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
    if(last=='-')ans=-ans; return ans;
}
/*_________________________________________________________head*/

struct line{
    bool have;
    LL k,b;
}tr[maxn<<2];
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid (l+r>>1)
void build(int rt,int l,int r){
    tr[rt].have=0;
    if(l==r)return;
    build(ls,l,mid);
    build(rs,mid+1,r);
}
void update(LL k,LL b,int L,int R,int rt,int l,int r){
    //printf("update %lld x + %lld, %d %d\n",k,b,L,R);
    if(!(l>=L&&r<=R)){
        if(L<=mid)update(k,b,L,R,ls,l,mid);
        if(R>mid)update(k,b,L,R,rs,mid+1,r);
        return;
    }
    if(!tr[rt].have){
        tr[rt].k=k,
        tr[rt].b=b,
        tr[rt].have=1;
        return;
    }
    LL Old=tr[rt].k*l+tr[rt].b,Old_=tr[rt].k*r+tr[rt].b;
    LL New=k*l+b,New_=k*r+b;
    if(Old>=New&&Old_>=New_)return;
    if(Old<=New&&Old_<=New_){
        tr[rt].k=k,
        tr[rt].b=b;
        return;
    }
    // k won't equiv tr[rt].k
    double pos=-(b-tr[rt].b)/(1.0*k-tr[rt].k);
    if(Old<=New){
        if(pos<=mid){
            update(k,b,L,R,ls,l,mid);
        }
        else{
            update(tr[rt].k,tr[rt].b,L,R,rs,mid+1,r);
            tr[rt].k=k,tr[rt].b=b;
        }
    }
    else{
        if(pos>=mid){
            update(k,b,L,R,rs,mid+1,r);
        }
        else{
            update(tr[rt].k,tr[rt].b,L,R,ls,l,mid);
            tr[rt].k=k,tr[rt].b=b;
        }
    }
}

LL query(int x,int rt,int l,int r){ // query most value at x
    LL ans=-2e18;
    if(tr[rt].have)
        ans=tr[rt].k*x+tr[rt].b;
    if(l==r)return ans;
    if(x<=mid)ans=max(ans,query(x,ls,l,mid));
    else ans=max(ans,query(x,rs,mid+1,r));
    return ans;
}

int t[maxn];
int main(){
    int n,y;
    while(cin>>n>>y){
    build(1,1,y);
    rep(i,1,n)
        t[i]=rd();
    sort(t+1,t+1+n);
    rep(i,1,n){
        if(y/(n-i+1)>=1)
            update(n-i+1,t[i],1,y/(n-i+1),1,1,y);
        if(y/(n-i+1)+1<=y)
            update(0,t[i]+y,y/(n-i+1)+1,y,1,1,y);
    }
    rep(i,1,y){
        printf("%lld%c",query(i,1,1,y)," \n"[i==y]);
    }}
    return 0;
}

标签:rt,Washing,int,LL,tr,define,ti,李超树,clothes
来源: https://blog.csdn.net/jk_chen_acmer/article/details/100584839

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有