zoukankan      html  css  js  c++  java
  • 典型二分问题--数的范围

    数的范围--二分算法

    题目描述:给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。

    对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。

    如果数组中不存在该元素,则返回“-1 -1”。

    输入格式

    第一行包含整数n和q,表示数组长度和询问个数。

    第二行包含n个整数(均在1~10000范围内),表示完整数组。

    接下来q行,每行包含一个整数k,表示一个询问元素。

    输出格式

    共q行,每行包含两个整数,表示所求元素的起始位置和终止位置。

    如果数组中不存在该元素,则返回“-1 -1”。

    数据范围

    1≤n≤100000 1≤q≤10000 1≤k≤10000

    输入样例:

     6 3
     1 2 2 3 3 4
     3
     4
     5

    输出样例:

     3 4
     5 5
     -1 -1

    下面是代码:

     #include<iostream>
     #include<cstdio>
     #include<cstring>
     #include<algorithm>
     using namespace std;
     
     const int N = 100010;
     int q[N];
     int n,m;
     
     int main(){
      scanf("%d%d",&n,&m);
      for(int i=0;i<n;i++) scanf("%d",&q[i]);
     
      while(m--){
      int x;
      scanf("%d",&x);
      int l=0,r=n-1;
      while(l<r){
      //先找左端点
                //左端点的特点就是大于等于x的最小的那个,所以判断条件就是q[mid]>=x;
      int mid = l+r>>1;
      if(q[mid]>=x) r=mid;
      else l=mid+1;
      }
      if(q[r]==x){
      cout<<l<<' ';
     
      r=n-1;
      while(l<r){
      int mid = l+r+1>>1;
                     //右端点就是小于等于x的最大的那个,所以判断条件是q[mid]<=x;
      if(q[mid]<=x) l=mid;
      else r=mid-1;
      }
      cout<<l<<endl;
      }else{
      cout<<"-1 -1"<<endl;
      }
      }
      return 0;
     }

    二分套路的模板套路:

     

  • 相关阅读:
    webservice 使用
    不错的下载网站。
    nvarchar 删除 tab 空格
    easyui juery 使用中发现的问题
    jquery easyui 文档资料
    easyui 合并单元格
    extjs4 中汉字显示不好看存在的问题
    微软语音提示
    一个简单的页面跳转
    导出 sqlsever 到access
  • 原文地址:https://www.cnblogs.com/yuanshixiao/p/14475915.html
Copyright © 2011-2022 走看看