С Новым годом! Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
69 / 61 / 11
Регистрация: 08.04.2019
Сообщений: 117

Нахождение НВП при помощи дерева отрезков

07.10.2023, 01:20. Показов 2064. Ответов 7

Студворк — интернет-сервис помощи студентам
Всем привет! У меня есть алгоритм нахождения наибольшей возрастающей последовательности (НВП) на дереве отрезков (числа не больше чем 10^5), но проблема заключается в том, что он неправильно восстанавливает ответ (по крайней мере вылетает wa). В чем ошибка?

Вот код:
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
 
auto max_comp = [](const std::tuple<int, int, int, int> &fst, const std::tuple<int, int, int, int> &snd) {
    return (std::get<2>(fst) < std::get<2>(snd));
};
 
 
struct SegTree {
    int lb, rb;
 
    // Изначально в предке -1 можем хранить, т.к. все равно введенные числа не дойдут до этого диапазона
    std::tuple<int, int, int, int> max_ind_elem_di_pred_ind = {-1, -1, 0, -1};
    // Индекс элемента, на который оканчивается возр. последовательность, сам элемент, динамика d[i] и предок
 
    SegTree *l_child = nullptr, *r_child = nullptr;
 
    SegTree(int lb_, int rb_) : lb(lb_), rb(rb_) {
        if (rb - lb > 1) { // Проверка на лист
            int M = (lb + rb) / 2;
            l_child = new SegTree(lb, M);
            r_child = new SegTree(M, rb);
        }
    }
 
 
    // Добавляем элемент в ДО
    void update(std::vector<int> &arr, int ind, int val, int pred_ind) {
 
        max_ind_elem_di_pred_ind = std::max(max_ind_elem_di_pred_ind, {ind, arr[ind], val, pred_ind}, max_comp);
 
        // Есть ли дети
        if (l_child) {
            // k лежит либо в промежутке <l_child->lb, l_child->rb> либо в <r_child->lb, r_child->rb>
            if (arr[ind] < l_child->rb) {
                l_child->update(arr, ind, val, pred_ind);
            } else {
                r_child->update(arr, ind, val, pred_ind);
            }
        }
    }
 
    std::tuple<int, int, int, int> get_max(int lq, int rq) {
        if (lb >= lq && rb <= rq) {
            return max_ind_elem_di_pred_ind;
        }
 
        if (std::max(lb, lq) >= std::min(rb, rq))
            return {-1, -1, 0, -1};
 
        return std::max(l_child->get_max(lq, rq), r_child->get_max(lq, rq), max_comp);
    }
};
 
 
int main() {
    std::vector<int> arr = {1, 3, 4, 6};
    int n = arr.size();
 
    int max_elem_ind = std::max_element(arr.begin(), arr.end()) - arr.begin();
 
    SegTree MaxTree(0, arr[max_elem_ind] + 1);
    for (int i = 0; i < n; i++) {
        if (arr[i] == 0) {
            MaxTree.update(arr, i, 1, -1);
        } else {
            MaxTree.update(arr, i, std::get<2>(MaxTree.get_max(0, arr[i])) + 1,
                           std::get<0>(MaxTree.get_max(0, arr[i])));
        }
    }
 
    std::tuple<int, int, int, int> ans_max = MaxTree.get_max(0, arr[max_elem_ind] + 1);
 
 
    int first_elem_of_max_lis = std::get<1>(ans_max),
            max_len_of_lis = std::get<2>(ans_max),
            pred = std::get<3>(ans_max);
 
    std::vector<int> ans(max_len_of_lis, first_elem_of_max_lis);
 
    for (int i = 1; i < max_len_of_lis; i++) {
        if (pred == -1) break;
        ans[i] = arr[pred];
        pred = std::get<3>(MaxTree.get_max(arr[pred], arr[pred] + 1));
    }
 
    for (int i = max_len_of_lis - 1; i >= 0; i--) {
        std::cout << ans[i] << " ";
    }
 
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.10.2023, 01:20
Ответы с готовыми решениями:

Нахождение НВП при помощи ДО
У меня есть алгоритм нахождения наибольшей возрастающей последовательности (НВП) на дереве отрезков (числа не больше чем 10^5), но проблема...

Проблема с навигацией по сайту при помощи дерева.
Здравствуйте. Я создал MasterPage. На нём создал навигационный элемент - дерево. Проблема состоит в том, что когда я нахожусь на других...

Вывести подмассив при помощи дерева Фенвика
имеется массив А c индексами [0,N) а элементы массива числа [0,M) как сохранить данные массива так чтобы эффективно вывести множество...

7
Модератор
Эксперт функциональных языков программирования
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,876
08.10.2023, 12:11
Что такое wa и в какой строке оно вылетает?
0
69 / 61 / 11
Регистрация: 08.04.2019
Сообщений: 117
10.10.2023, 01:40  [ТС]
wa - wrong answer в тестирующей системе, и, к сожалению, тест, на котором все валится, скрыт...
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
18.10.2023, 20:29
Никогда не понимал, зачем списывать школьные олимпиады. Эти соревнования нужны исключительно для интереса олимпиадников. Призом за них идёт участие в более высоком туре и обучение в спецлагере для олимпиадников. Если списать - интереса не будет, тебя просто возьмут в более продвинутое место, где ты, если списывал, все равно ничего не поймёшь!
0
69 / 61 / 11
Регистрация: 08.04.2019
Сообщений: 117
18.10.2023, 20:42  [ТС]
Друг, это было домашним заданием по алгоритмам, никакой речи об олимпиадах и не идет. Я даже не говорил, чтобы за меня задачу решили, просто попросил найти баг в коде, и пояснить что не так. Где здесь списывание?!
0
1966 / 822 / 114
Регистрация: 01.10.2012
Сообщений: 4,804
Записей в блоге: 2
19.10.2023, 09:04

Не по теме:

Цитата Сообщение от 4343H Посмотреть сообщение
Друг, ...просто попросил найти баг в коде, и пояснить что не так.
Для меня это выглядит примерно так
Ну я тут немного написял/накакал. Друг, ну ты за мной прибери



По поводу этого "дерева отрезков". Не то чтобы я прямо жить без него не могу, но подобные задачки мелькали неоднократно. Напр нужно растянуть колонку таблицы по ширине чтобы умещался максимальный текст. Ну запоминаю макс длину, дальше при добавлении/удалении строк ее отслеживаю, если изменилась - приходится перебирать все строки. Это помогает, но не всегда. А заводить полноценное дерево для такой мелочи не хочется. Есть ли что-то лучшее? Спасибо
0
69 / 61 / 11
Регистрация: 08.04.2019
Сообщений: 117
19.10.2023, 11:16  [ТС]
Эта задача уже решена динамикой с бин. поиском за тот же O(n log n) (дз было просто на до, поэтомв и хотелось решить соответствующе), да я и не понимаю, что от меня на форуме хотят: я задал вопрос, показал, что за попытка у меня есть, если нужно какое-нибудь уточнение, я бы ответил, но нет, мне тут про какое-то списывание начинают говорить
0
Модератор
Эксперт функциональных языков программирования
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,876
21.10.2023, 16:23
4343H,
Пользователям обычно лень разбираться в чужом коде. Особенно, если код на малознакомом ЯП. В данном случае ИМХО больше шансов получить ответ в разделе С++.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.10.2023, 16:23
Помогаю со студенческими работами здесь

Разрешение коллизий при помощи бинарного дерева в хеш-функции
Написать код, который разрешает коллизии при помощи бинарного дерева в хеш-функции. Язык-Visual Basic.

Нахождение СДНФ и СКНФ при помощи равносильных преобразований
Помогите найти СДНФ и СКНФ при помощи равносильных преобразований и если можно, поделитесь хорошим мануалом для самостоятельного нахождения.

Нахождение максимального и минимального элементов при помощи функции
Два одномерных массива(размерность-5 и 8 вещественных элементов, вводимых с клавиатуры).Требуется в каждом массиве найти наибольший и...

Нахождение кратчайшего пути в графе при помощи алгоритма Дейкстры
1 Решение задач, реализуемых с помощью алгоритмов с возвращением 2 Нахождение кратчайшего пути в графе при помощи алгоритма Дейкстры ...

Нахождение среднего арифметического для 5 чисел при помощи внешней подпрограммы
Составить программу для нахождения среднего арифметического из 5 чисел при помощи внешней подпрограммы.


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru