• 【FZYZOJ】珂神不等式&平角咖啡厅 题解(二分答案)


    前言:这题太神了,蒟蒻表示思路完全断档,甚至想到DP。得到大佬hs-black的帮助后才AC此题orz

    ---------------------------------

    题目描述

    ck love…… what?

    Long before,某个巷口的拐角处,有个咖啡厅,那咖啡厅真是:北通巫峡,南极潇湘,不知其几千里也。

    “等到了一千年以后~~”,3013年,ck想起那拐角咖啡厅,甚是思念。于是,他在北冥之处也开了家咖啡厅,取名叫“平角咖啡厅”。既然是平角,就不会拐弯,那么我们可以把他的摊位置于一数轴上。ck富可敌国,坐拥n个服务员,这些服务员的当前位置在数轴上分别表示为:h1,h2,h3...hn.这天,他遇到一个棘手的事情,领导“兰斯朵蕾”来抽查,ck和他的小服务员们被要求在最短的时间内接待完最后一批顾客。最后这批顾客有m个人,他们对应站在数轴位置p1,p2,p3...pm。由于是31st century,顾客们都很懒,他们只会呆在原地接受招待。因此,服务员都是在数轴上的“移动靶”,他们每秒钟可以原地不动,或者向左或向右一个单位长度,而服务员们的手速是极快的,因此不用计算招待的时间。What‘s more,一个顾客可以被多个服务员招待。现在,为了尽快得到领导的认可,为了尽快得到老板娘的拥抱,你是不是该主动帮ck算算,他的服务员最快能在几秒后完成“每个顾客都至少被招待一次”的任务,从而听取“兰斯道瑞”领导的训话以及接受老板娘的拥抱呢?(不妨假设一结束招待就可以面见兰斯道瑞并和老板娘拥抱。)

    ck love……what?Music, of course!!咖啡厅的音乐是必不可少的,“音乐小丸子”ck,和老板娘又对唱了一首:“爱转角遇见了谁,是否有爱情的美,爱转角以后的街,能不能由我来陪~~~……”

    输入格式

    第一行,两个正整数n,m

    第二行,n个互不相同的正整数,h1,h2,h3.....hn

    第三行,m个互不相同的正整数,p1,p2.p3....pm

    含义都如题目所述。At the same time,由于Lzl蒟蒟蒻非常mercy,所以,h和p都从小到大排好了序(此处应该有掌声!!)

    输出格式

    仅一个数,即为所求的答案。

    ------------------------------------------

    二分最少用的时间。在$check$函数中,我们设置$last$表示上个服务员不能满足的顾客的位置。假设当前服务员为$i$,顾客为$j$,整体思路就是从$last$开始,一直到顾客$j$,看$i$能否满足要求,如果满足就$j--$;不满足则更新$last$的位置,$i--$。

    注意一个细节:注意$i$的位置与$j$的位置还有$last$的位置距离的大小关系。写起来就是:

    $if (min(abs(h[i]-p[last]),abs(h[i]-p[j]))+abs(p[last]-p[j])<=x) j--$

    时间复杂度$O(nlog n)$

    代码:

    //二分  O(nlogn) 
    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    int n,m,h[100005],p[100005];
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)) {if (ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch)){x=x*10 +ch-'0';ch=getchar();}
        return x*f;
    }
    int check(int x)
    {
        int i=n,j=m,last=m;
        while(i>0&&j>0)
        {
            if (min(abs(h[i]-p[last]),abs(h[i]-p[j]))+abs(p[last]-p[j])<=x) j--;
            else last=j,i--;
        }
        if (j>0) return 0;
        else return 1;
    }
    int work()
    {
        int l=0,r=1e10;
        while(l<=r)
        {
            int mid=(l+r)>>1;
            if (check(mid)) r=mid-1;
            else l=mid+1;
        }
        return l;
    }
    signed main()
    {
        n=read(),m=read();
        for (int i=1;i<=n;i++) h[i]=read();
        for (int i=1;i<=m;i++) p[i]=read();
        cout<<work();
        return 0;
    }
  • 相关阅读:
    Struts2(十六)Json
    Struts2(十五)实现文件上传
    Struts2(十四)拦截器实现权限管理
    Eclipse下link方式安装插件
    Struts2(十三)国际化-internationalization
    Struts2(十二)使用验证框架验证数据较验
    Struts2(十一)OGNL标签三与Struts2标签
    Struts2(十)OGNL标签二与Struts2标签
    Struts2(九)OGNL标签一与Struts2标签
    Elasticsearch 分词器
  • 原文地址:https://www.cnblogs.com/Invictus-Ocean/p/13027599.html
Copyright © 2020-2023  润新知