2015-03-19 2 views
1

Я дал массив размера N. У меня есть Q-запросы. Мне нужно рассчитать gcd между L и R, где LR, где 1 ≤ L ≤ R ≤ N.

Как правильно рассчитать его как грубую силу подход не удастся.GCD между диапазонами

+0

Что вы делаете со значениями массива? – fjardon

+0

На самом деле GCD достаточно быстр. Можете ли вы дать некоторые недочеты? То есть каковы ожидаемые значения N и Q? –

+0

N = Q = 10^5 ........ – user4447943

ответ

1

GCD является аддитивным и коммутативным. Это означает, что дерево сегментов может решить эту проблему с использованием log (N) времени для каждого запроса GCD диапазона.

Wikipedia has a nice article about segment trees

+0

Что вы подразумеваете под 'additive'? – fjardon

+1

@fjardon gcd (a, b, c) = gcd (gcd (a, b), c) – Kribesk

1

Сегмент дерево может быть использовано для предварительной обработки и запроса в умеренное время. С деревом сегментов время предварительной обработки - O (n), а время для запроса GCD - O (Logn). Требуемое дополнительное пространство - это O (n) для хранения дерева сегментов.

Представление сегментов деревьев

  • листьев узлы являются элементы входного массива.
  • Каждый внутренний узел представляет собой GCD всех листов под ним.

Массив представление дерева используется для представления сегментов деревьев т.е. для каждого узла с индексом I,

  • Левый ребенок имеет индекс 2 * я + 1
  • Право ребенка на 2 * я +2, а родительский элемент находится на этаже ((i-1)/2).

Осуществлению можно найти здесь http://www.geeksforgeeks.org/gcds-of-a-given-index-ranges-in-an-array/

Смежные вопросы