6 / 6 / 0
Регистрация: 29.03.2011
Сообщений: 47
|
||||||
1 | ||||||
Дерево отрезков30.07.2012, 21:00. Показов 5072. Ответов 4
Метки нет (Все метки)
Добрый день, помогите пож-та решить задачи на с++. Нашел решение (расписаны все алгоритмы, процедуры подсчета и т. д.), но сложность состоит в том, что я не понимаю строищихся структур и вообще никогда не программировал на c++.Поэтому прошу помочь собрать все воедино (чтение из файла, работа программы, запись в файл). Основная задача - считать с файла, воспользоваться функцией, вывести в файл
Дан массив целых чисел. Поступают запросы модификации элемента и поиска суммы элементов на отрезке. Необходимо ответить на каждый запрос суммы. Вход: В первой строке через пробел записаны два натуральных числа N и M (N, M < 105), где N – количество элементов массива, M – количество запросов. Во второй строке записан массив чисел (элементы массива разделены пробелом). В следующих M строках идут запросы (по одному в строке). Запрос вида 'M 5 9' означает, что необходимо присвоить элементу с индексом 5 число 9. Запрос вида 'S 2 4' означает, что необходимо найти сумму элементов массива, начиная от элемента с индексом 2 и заканчивая элементом с индексом 4 (включая эти два элемента). Гарантируется, что второй индекс больше первого. Гарантируется, что массив имеет элементы с такими индексами. Все элементы в массиве до и после замены – неотрицательные целые числа меньше 10. Индексация элементов массива идет с нуля. Выход: Для каждого запроса поиска суммы выведите результат его выполнения в порядке появления (каждый на отдельной строке) .***решение Построим бинарное дерево T следующим образом. Корень дерева будет храниться в элементе T[1]. Он будет содержать сумму элементов A[0..N-1], т.е. всего массива. Левый сын корня будет храниться в элементе T[2] и содержать сумму первой половины массива A: A[0..N/2], а правый сын - в элементе T[3] и содержать сумму элементов A[N/2+1..N-1]. В общем случае, если T[i]-ый элемент содержит сумму элементов с L-го по R-ый, то его левым сыном будет элемент T[i*2] и содержать сумму A[L..(L+R)/2], а его правым сыном будет T[i*2+1] и содержать сумму A[(L+R)/2+1..R]. Исключение, разумеется, составляют листья дерева - вершины, в которых L = R. Рассмотрим теперь операцию суммы на некотором отрезке [L; R]. Мы встаём в корень дерева (i=1), и рекурсивно движемся вниз по этому дереву. Если в какой-то момент оказывается, что L и R совпадают с границами отрезка текущего элемента, то мы просто возвращаем значение текущего элемента T. Иначе, если отрезок [L; R] целиком попадает в отрезок левого или правого сына текущего элемента, то мы рекурсивно вызываем себя из этого сына и найденное значение возвращаем. Наконец, если отрезок [L; R] частично принадлежит и отрезку левого сына, и отрезку правого сына, то делим отрезок [L; R] на два отрезка [L; M] и [M+1; R] так, чтобы первый отрезок целиком принадлежал отрезку левого сына, а второй отрезок - отрезку правого сына, и рекурсивно вызываем себя и от первого, и от второго отрезков, возвращая сумму найденных сумм. Теперь рассмотрим операцию изменения значения некоторого элемента с индексом K. Будем спускаться по дереву от корня, ища тот лист, который содержит значение элемента A[K]. Когда мы найдём этот элемент, просто изменим соответствующее значение в массиве T и будем подниматься от текущего элемента обратно к корню, пересчитывая текущие значения T. Понятно, что таким образом мы изменим все значения в дереве, которые нужно изменить.
0
|
30.07.2012, 21:00 | |
Ответы с готовыми решениями:
4
Медленное дерево отрезков Дерево отрезков, проверьте код Дерево отрезков, редактирование куска и поиск суммы На прямой своими концами заданы N отрезков. Найти точку принадлежащую максимальному числу отрезков |
14 / 14 / 3
Регистрация: 28.07.2012
Сообщений: 57
|
|
31.07.2012, 00:07 | 2 |
Опять списал с емакса... Там дерево отрезков нормально объяснено.
0
|
6 / 6 / 0
Регистрация: 29.03.2011
Сообщений: 47
|
|
31.07.2012, 00:09 [ТС] | 3 |
я не спорю, все хорошо объяснено, мне не совсем понятно как считывать с файла и закидывать в функцию, какая структура данных должна быть
0
|
14 / 14 / 3
Регистрация: 28.07.2012
Сообщений: 57
|
||||||
31.07.2012, 00:16 | 4 | |||||
0
|
6 / 6 / 0
Регистрация: 29.03.2011
Сообщений: 47
|
||||||
31.07.2012, 01:23 [ТС] | 5 | |||||
то есть если напишу так:
0
|
31.07.2012, 01:23 | |
31.07.2012, 01:23 | |
Помогаю со студенческими работами здесь
5
Дерево отрезков. Поиск суммы чисел на отрезке массива. Изменение всех чисел на отрезке массива Есть ли у кого похожий алгоритм: распределения отрезков разной длины внутри отрезков фиксированной длины? Бинарное дерево. Удалить из дерева часть вершин так, чтобы оставшееся дерево стало пирамидой Дано дерево. Распечатать дерево по уровням Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |