zoukankan      html  css  js  c++  java
  • ACwing_789. 数的范围

    算法竞赛进阶指南上说据说只有10%的程序员能写对二分,而我这种蒟蒻。。所以虽然这是一道非常基础的二分,但我觉得对我来说还是有必要写一篇博客来总结一下,也在写的过程中检验一下自己.

    一开始看到这道题我还傻乎乎的想要通过看这个数字之前或者之后是否与自己相同来作为判断条件。。后来才发现这种想法实在愚蠢。。

    然后再想了想,这不就是整数域上二分的模板题吗?

    代码如下

    #include<bits/stdc++.h>
    #define R register int
    using namespace std;
    const int maxn=100005,maxq=10005;
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9') if(ch=='-') f=-1,ch=getchar();
        while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
        return x*f;
    }
    int n,q;
    int a[maxn];bool book[maxq];
    inline int workl(int x)
    {
        int l=0,r=n-1;
        while(l<r)
        {
            int mid=(l+r)>>1;
            if(a[mid]>=x) r=mid;else l=mid+1;
        }
        return l;
    }
    inline int workr(int x)
    {
        int l=0,r=n-1;
        while(l<r)
        {
            int mid=(l+r+1)>>1;
            if(a[mid]<=x) l=mid;else r=mid-1;
        }
        return r;
    }
    //bool book[maxn];
    int main()
    {
        n=read();q=read();//位置从0开始计数 
        for(R i=0;i<n;i++)
        {
            //a[i]=read();
            int x=read();
            book[x]=1;
            a[i]=x;
        }
        for(R i=1;i<=q;i++)
        {
            //int st,en;
            int x=read();
            if(!book[x])
            printf("-1 -1
    ");
            else
            {
                //st=workl(x);
                //en=workr(x);
                printf("%d %d
    ",workl(x),workr(x));
            }
        }
        return 0;
    }

    没有注释,太懒了

  • 相关阅读:
    nyist_21(三个水杯)(BFS)
    寒假刷题之普通之红与黑
    寒假刷题之普通之变形课
    寒假刷题之普通之最小差
    什么是 Spring Boot
    择业十诫----与内心的渴望同行
    模式窗体中调用父页面Javascript
    二级域名解析
    软件测试
    网狐系统介绍
  • 原文地址:https://www.cnblogs.com/smartljy/p/11765409.html
Copyright © 2011-2022 走看看