《整数二分》

171 阅读1分钟
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e6 + 10;
int q[N]; 
int main() 
{ 
   int n, m;
   scanf("%d%d", &n, &m); //n表示数组元素的个数,m表示查询元素的个数。 
   for (int i = 0; i < n; i ++) 
   scanf("%d", &q); //读入n个数组元素。 
   sort(q, q + n); //对这个数组进行排序。 
   while (m --) 
   { 
      int x;
      cin >> x; //读入查询元素的值。 
      int l = 0, r = n - 1;
      while (l < r)
      { 
         int mid = l + r >> 1;
         if (q[mid] >= x) r = mid;
         else l = mid + 1;
      } //不断二分寻找右端点。 
      if (q[l] != x) cout << "-1 -1" << endl;//如果无解则返回-1 -1。 
      else 
      { 
         cout << l << ' ';
         l = 0, r = n - 1;
         while (l < r) 
         { 
            int mid = l + r + 1 >> 1;
            if (q[mid] <= x) l = mid;
            else r = mid - 1;
         } 
         cout << l << endl;
       } //有解的话则不断二分寻找左端点。 
    } 
     return 0; 
}