Лимит времени 2000/4000/4000/4000 мс. Лимит памяти 65000/65000/65000/65000 Кб.
C. Шаги сортировки слиянием
Используйте стандартную сортировку слиянием, но перед выходом из рекурсии выводите все элементы от a[l] до a[r].
F. Сорок миллионов
Вы, разумеется, помните, что массив такой длины не успеют отсортировать не только алгоритмы со сложностью O(N2), но и даже алгоритмы со срожностью O(NlogN).
Значит, нужно искать в условии задачи что-то, что всё-таки позволит вам её решить. Обратите внимание, какими числами заполняется массив.
Программа будет работать быстрее, если не хранить весь массив в памяти.
G. Порядковая статистика
Размер массива в этой задаче очень велик. Если в быстрой сортировке мы выбираем опорный элемент следующим образом:
swap(a[l], a[rand() % (r - l + 1)]);
то из-за того, что константа RAND_MAX на сервере равна 32767, обмен будет неравномерным (опорный элемент случайно выбирается не из всего диапазона [l; r], а только из его первых 32 тысяч элементов), и решение будет получать TL.
Следует использовать другой способ выбора случайного опорного элемента, например, такой (этот способ также не идеален, но в данном случае лучше):
int random(int l, int r) { return l + (double)rand() / RAND_MAX * (r - l); }
swap(a[l], a[random(l, r)]);
Кроме того, у этой задачи есть очень короткое стандартное решение, но его предлагается отыскать самостоятельно.
Обратите внимание, что при вычислении элементов массива может произойти переполнение.
H. Сортировка асимптотик
В этой задаче всего один тест. Вам нужно написать программу, выводящую ответ в консоль.
Помните, что алгоритм, имеющий сложность f(N), более эффективен по сравнению с алгоритмом, имеющим сложность g(N), если при неограниченном увеличении N предел отношения f(N)/g(N) равен нулю.
В решении этой задачи вам может оказать большую помощь Wolfram Alpha.
Похоже, больше всего затруднений вызывает пункт #6. Нужно вспомнить школьную алгебру и придать этой формуле более знакомый вид.
Для отправки решений необходимо выполнить вход.
|