Как решить задачу на бин поиск?

Рейтинг: 0Ответов: 1Опубликовано: 25.07.2023

Не понимаю почему, 2 день не могу решить задачу. Ломается на одном тесте(WA).

Меньше либо равно В этой задаче вам нужно будет несколько раз находить в отсортированном массиве первое число, которое меньше либо равно числу из запроса. Обратите внимание - в этой задаче массив нумеруется с единицы. Входные данные В первой строке записаны два целых числа n, m (1≤n,m≤2 * 10^5) - размер массива и количество запросов. Во второй строке записаны n целых чисел в невозрастающем порядке, каждое по модулю не превышает 1 * 10^9. Эти числа образуют данный массив. В следующих mm строках даны числа запросов, по одному в строке. Выходные данные Для каждого запроса выведите индекс самого левого числа в массиве, которое меньше либо равно данному. Если такого числа нет, вместо него выведите NO SOLUTION

Sample Input: 
10 10 
16 15 13 5 3 -1 -4 -6 -15 -18
-1 7 -6 0 5 18 15 3 -18 -19 
Sample Output: 
6 4 8 6 4 1 2 5 10 NO SOLUTION

Мой код -

#include <iostream>
using namespace std;

long binary(long array[], long x, long n){
    if (x > array[0]) return 1;

    long l = -1;
    long r = n;

    while (l < r){
        long mid = l + (r - l) / 2;

        if (x < array[mid]){
            l = mid + 1;
        }
        else{
            r = mid;
        }

    }

    return l + 1;

}

int main()
{
    long n, m, x;

    cin >> n >> m;
    long array[n];

    for (long i = 0; i < n; i++) cin >> array[i];
    for (long j = 0; j < m; j++){
        cin >> x;
        if (x < array[n - 1])
            cout << "NO SOLUTION" << endl;

        else
            cout << binary(array, x, n) << endl;


    }

    return 0;
}

Ответы

▲ 1Принят

Сверив процедуру бинарного поиска с binary_search_leftmost здесь, видим, что l должно инициализироваться нулём.

  long l = 0;
    long r = n;

    while (l < r){
        long mid = l + (r - l) / 2;

        if (x < array[mid]){
            l = mid + 1;
        }
        else{
            r = mid;
        }

    }

    return l + 1;

}