У меня есть проблема, которая имеет довольно ограниченное временное ограничение и хотела бы увидеть, могу ли я подтолкнуть в правильном направлении.
Вот проблема:
Вам представлена стена с колоннами разной высоты. Каждая высота столбца представлена в виде ненулевых целых чисел.
Состояние ввода определяется с помощью массива
HдлиныN, содержащего высоты каждого столбцовNна экране, например:
Нарезка моментального снимка на заданной высоте оставляет несколько твердых фигур выше эта высота. Например. срезание на уровне 2 разрезало бы 3 сплошные части:
Нарезка на уровне 1 также разрежет 3 сплошные части:
Аналогично, нарезка на уровне 0 вернет единую (одну) сплошную фигуру, а срезание на уровне 3 не будет вырезать какие-либо фигуры.
Требование:. Учитывая массив высот срезов
SдлиныM, содержащий все Уровни, на которых должен выполняться "срез", возвращают массив длинойM, содержащий числа разрезанных кусков для каждого соответствующего разреза.Например, учитывая ввод
H = {2, 1, 3, 2, 3, 1, 1, 2}иS = { 0, 1, 2, 3 }, программа должна возвращать величины{1, 3, 3, 0}, согласно приведенным выше примерам.Оба
NиMнаходятся в диапазоне около20,000, но высоты в каждом массиве могут достигать1,000,000.И время и пространство в худшем случае сложность решения не может превышать
O(N + M + max(M) + max(N)).
Последнее ограничение - это то, что меня озадачивает: это в основном означает, что я не могу иметь вложенные for -loops, и я не могу избежать этого.
Очевидно, что существует некоторая умная препроцессия, которая должна быть выполнена для получения конечных результатов в O(1) за один срез, но я не смог его найти.
Я продолжал создавать массив сокращенных номеров для каждого уровня среза, а затем обновлял их все, как итерацию через H, но это оказывается O(N*M), так как мне нужно обновить всю нижнюю высоту уровни.
Существует ли структура данных, подходящая для этой задачи?


