Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/146: Рейтинг темы: голосов - 146, средняя оценка - 4.67
34 / 34 / 21
Регистрация: 02.02.2012
Сообщений: 181

Левый и правый двоичный поиск

29.06.2013, 10:51. Показов 29407. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите, пожалуйста, не проходит 1 тест, не понимаю из-за чего

Дано два списка чисел, числа в первом списке упорядочены по неубыванию. Для каждого числа из второго списка определите номер первого и последнего появления этого числа в первом списке.

Формат входных данных
В первой строке входных данных записано два числа N и M (1NM20000). Во второй строке записано N упорядоченных по неубыванию целых чисел — элементы первого списка. В третьей строке записаны M целых неотрицательных чисел - элементы второго списка. Все числа в списках - целые 32-битные знаковые.

Программа должна вывести M строчек. Для каждого числа из второго списка нужно вывести номер его первого и последнего вхождения в первый список. Нумерация начинается с единицы. Если число не входит в первый список, нужно вывести одно число 0.

Примеры
входные данные10 5
1 1 3 3 5 7 9 18 18 57
57 3 9 1 179
выходные данные
10 10
3 4
7 7
1 2
0

Вот моё решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
 
using namespace std;
 
int main()
{
    long n, k, m;
    cin >> n >> k;
    long *a = new long[n];
    long *b = new long[k];  
 
    for (long i = 0; i < n; i++)
        cin >> a[i];
 
    for (long i = 0; i < k; i++)
        cin >> b[i];
 
    for (long i = 0; i < k; i++)
    {
        int l = 0, r = n - 1;
        while (l < r)
        {
            m = (l + r) / 2;
            if (a[m] < b[i]) l = m + 1;
            else r = m;
        }
        if (a[r] == b[i])
        {
            cout << ++r << " ";
            while (a[r] == b[i])
                r++;
            cout << r << endl;
        }
        else cout << 0 << endl;
    }
 
    delete [] a;
    delete [] b;
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.06.2013, 10:51
Ответы с готовыми решениями:

Найти в строке way левый слеш и заменить его на правый
Есть код, нужно найти в строке way левый слеш и заменить его на правый) void main() { string way(&quot;asdas\sdasd\dsa&quot;); ...

Реализация дерева левый сын, правый брат (указатели)
Задание такое:

Поменять местами левый и правый байты целого аргумента
разработайте макрос swab(х) который меняет местами левый и правый байты целого аргумента х .Спасибо!

3
36 / 36 / 2
Регистрация: 28.04.2013
Сообщений: 110
29.06.2013, 16:54
lower_bound()
и
upper_bound()

Вам в помощь. Один ищет первое вхождение, второй последнее вхождение элемента в контейнер
0
0 / 0 / 0
Регистрация: 17.07.2022
Сообщений: 13
17.07.2022, 15:58
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <bits/stdc++.h>
using namespace std;
 
 
int main() {
    int n, m;
    cin >> n >> m;
    int list1[n];
    int list2[m];
    for(int i = 0; i < n; i++){
        cin >> list1[i];
    }
    for(int i = 0; i < m; i++){
        cin >> list2[i];
    }
    for(int x = 0; x < m; x++){
        int i = lower_bound(list1, list1 + n, list2[x]) - list1;
        if(i >= n){
            cout << 0 << endl;
        }
        if(list1[i] == list2[x]){
            cout << i + 1 << " " << upper_bound(list1, list1 + n, list2[x]) - list1 << endl;
        }
    }
}
Помогите, пожалуйставроде бы решение должно быть правильным, но не проходит тесты
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
17.07.2022, 16:44
Цитата Сообщение от Fynjyutq Посмотреть сообщение
int i = lower_bound(list1, list1 + n, list2[x]) - list1;
да кто ж вас так учит писать код ...

Цитата Сообщение от Fynjyutq Посмотреть сообщение
int list1[n];
    int list2[m];
Угу, да да...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <algorithm>
 
int main() {
    int n, m;
    std::cin >> n >> m;
    int * list = new int[n];
    int x;
    for(int i = 0; i < n; i++){
        std::cin >> list[i];
    }
    for(int i = 0; i < m; i++){
        std::cin >> x;
        auto it = std::lower_bound(list, list+n, x);
        if( it==(list+n) || *it != x)
            std::cout << 0 << std::endl;
        else
            std::cout << std::distance(list, it) + 1 << " " << std::distance(list, std::upper_bound(it, list+n, x)) << std::endl;
    }
    delete [] list;
}
Добавлено через 10 минут
edit
upper_bound ищем начиная с it.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.07.2022, 16:44
Помогаю со студенческими работами здесь

Совершить в бинарном дереве обход Правый - Корень - Левый
Нужно совершить обход Правый корень левый в бинарном дереве. #include &quot;stdafx.h&quot; #include &quot;stdlib.h&quot; #include...

Найти левый и правый крайние отрицательные элементы в массиве из 20 элементов
Помогите решить проблему. Есть задание &quot;Создать целочисленный массив из 20 элементов.Заполнить его числами в диапазоне от -13 до 13. ...

Левый и правый двоичный поиск
Дано два списка чисел, числа в первом списке упорядочены по неубыванию. Для каждого числа из второго списка определите номер первого и...

Левый и правый двоичный поиск
Дано два списка чисел, числа в первом списке упорядочены по неубыванию. Для каждого числа из второго списка определите номер первого и...

Левый и правый блок
Пишу главную страницу сайта. Возникла проблема. Я сделал две колонки через float, одну левую, другую правую. В левой колонке пытаюсь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru