读——二分

题目:

  一个数轴,有N个寻找点,M个被查询点,查询点以1m/s的速度移动,从0s开始n个点开始移动,问覆盖到所有被查询点所用的最短时间?

思路:

  枚举结果(最短时间),查询时,对于每个查询点,会遍历两个区间,一个单倍,一个双倍长度。(长度和就是时间)

  判断对于当前长度能否覆盖所有被查询点。

#include<iostream >
#include<cstdio>
#include<queue>
#include<algorithm>
#include<math.h>
#include<cstring>
using namespace std;
int n,m;
long long  a[200009],b[200009],l,r,mid;
bool check(long long  x)
{
    long  long  tot=0,to;
    int last=1,last1;
    for(int i=1;i<=n;i++)
    {
        if(b[last]<a[i])
        {
            if(a[i]-b[last]>x)    return 1;
            to=x+b[last]-(a[i]-b[last]);
            last1=last;
            while(b[last]<=to)    last++;//先左 

            tot=(x-(a[i]-b[last1]))/2+a[i];
            while(b[last1]<=tot)    last1++;

            last=max(last,last1);
        }else
        {
            to=x+a[i];
            while(b[last]<=to)    last++;
        }

    }
    if(last==m)    return 1;
    return 0;
}
int main()
{
    freopen("read.in","r",stdin);
    freopen("read.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    for(int i=1;i<=m;i++) scanf("%lld",&b[i]);
    b[m+1]=b[m]*12;
    l=0,r=(max(a[n],b[m]))*2,mid;
    while( l<r )
    {
        mid=(l+r)>>1;
        if(check(mid)) l=mid+1;
        else r=mid;
    }
    cout<<r;
    return 0;
}
时间: 2024-12-10 08:36:55

读——二分的相关文章

二分小结

NOIP中二分应该是很简单的算法了,去年noip的day2-t1就是裸的二分,这里有两个例题 1.poj2456:Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are located along a straight line at positions x1,...,xN (0 <= xi <= 1,000,000,000). His C (2 <= C

二分暑假专题 训练记录 2017-7-29

POJ3258-River Hopscotch 题意: 给你区间[0,L]给你n个石头,然后去除m个石头  最大化 石头间最小的距离 思路: 首先0和L 这两个石头是不可以动的   然后用 s 数组记录 整个区间的石头 然后排序  此时石头的排序就是有序的了  然后二分套模板 接着check函数才是最关键的好的把 从0到 n+1-m   总共就有 n+2-m 个石头了 而由于第0个石头不可以动 , 所以从第一个开始动 同时判断条件是 s[cur] - s[last] < d 而不是 <= #i

二分查找实现(Jon Bentley:90%程序员无法正确实现)

二分查找实现(Jon Bentley:90%程序员无法正确实现)作者:July出处:结构之法算法之道引言Jon Bentley:90%以上的程序员无法正确无误的写出二分查找代码.也许很多人都早已听说过这句话,但我还是想引用<编程珠玑>上的如下几段文字:“二分查找可以解决(预排序数组的查找)问题:只要数组中包含T(即要查找的值),那么通过不断缩小包含T 的范围,最终就可以找到它.一开始,范围覆盖整个数组.将数组的中间项与T 进行比较,可以排除一半元素,范围缩小一半.就这样反复比较,反复缩小范围,

poj 1743 最长不重叠重复子串 后缀数组+lcp+二分

题比较容易读懂,但是建模需动点脑子: 一个子串加常数形成的子串认为跟子串相同,求最长不重叠重复子串 题目中说 is disjoint from (i.e., non-overlapping with) at least one of its other appearance(s) 意味着不能重叠,举个例子 1, 2,3,  52, 53,54 1,2, 3和 52, 53,54满足题意,差值为51 枚举差值肯定不行------看了题解明白的:: 后项减去前一项得到: 1,1,1,49,1,1  

[HDOJ6154] CaoHaha&#39;s staff(规律, 打表, 二分)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6154 有些题一辈子只会做一次,比如这个题.. 题意:炒鸡难懂,学弟读明白的.懒得描述,反正这题以后不会再做. f(i)表示i个线段能围成的最大面积,画画图就会发现一个规律. 然后查询的时候二分最小的大于等于s的即可. 1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ / 6 ┛┗┛┗┛┃ノ) 7 ┓┏┓┏┓┃ 8 ┛┗┛

poj3258 二分 最小值最大化问题

River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10842   Accepted: 4654 Description Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping from rock to rock in a river.

贪心(bnuoj49103+二分+贪心)

贪心 小明喜欢养小鸡,小鸡喜欢吃小米.小明很贪心,希望养s只不同种类的小鸡,小鸡也很贪心,每天除了吃固定的ai粒小米外,还想多吃bi*s粒小米. 小明每天有M(0<=M<=10^9)粒小米可以喂小鸡,小鸡共有N(0<=N<=1000)种.问小明最多可以养多少只小鸡? Input 多组数据,请读到文件尾 第一行,整数N,M,以空格分隔,之后两行,第一行为N个整数ai,第二行为N个整数bi. ai.bi都在int范围内 Output 一行一个整数,s. Sample Input 2 4

二分查找学习

数组在有序的情况查找某元素,用二分查找可以达到logn的时间复杂度.二分查找虽然看似容易,想要把这个算法完全写好,并灵活运用确并非易事儿.据说专业的程序员有90%的人无法正确实现.如果你不信,不妨自己动手试一试,然后用一些测试用例测一下. 二分查找的思想:在有序数组A[n]中查找x,令s=0,e=n-1,我们先相信x在[s,e]区间,m=(s+e)/2为中间坐标,如果正好x=A[m]则找到输出:如果x<A[m],则x出现m的左边,反之出现在m的右边.这样每次都可以缩小查找范围,当s>e时未找到

Codeforces Round #425 (Div. 2) Problem C (Codeforces 832C) Strange Radiation - 二分答案 - 数论

n people are standing on a coordinate axis in points with positive integer coordinates strictly less than 106. For each person we know in which direction (left or right) he is facing, and his maximum speed. You can put a bomb in some point with non-n