35 KiB
35 KiB
| 1 | level | domain | question | answer | ref |
|---|---|---|---|---|---|
| 2 | base | algo | Во что превращается 3n + 100 в O-нотации | O(n) | урок D1_algo.md |
| 3 | base | algo | Сколько шагов у бинарного поиска в массиве из 10⁶ элементов | 20 (log₂ 10⁶ ≈ 20) | урок D1_algo.md |
| 4 | core | algo | Почему push_back в среднем O(1), а не O(n) | ёмкость растёт геометрически (удвоение), сумма реаллокаций на n вставок — геометрическая прогрессия ≈ n, а не n² | урок D1_algo.md |
| 5 | core | algo | Что ломает удвоение ёмкости у vector | указатели/итераторы/ссылки на старые элементы (реаллокация переносит блок памяти) | урок D1_algo.md |
| 6 | deep | algo | Что будет, если ёмкость vector растить на +1 за раз вместо удвоения | суммарная стоимость n вставок станет O(n²) | урок D1_algo.md |
| 7 | base | algo | Сложность построения кучи (heapify) из произвольного массива | O(n), не O(n log n) | урок D1_algo.md |
| 8 | base | algo | Какая сортировка всегда O(n log n) и устойчива | mergesort | урок D1_algo.md |
| 9 | core | algo | Худший случай quicksort и когда он достигается | O(n²), на уже отсортированном массиве при плохом выборе опорного | урок D1_algo.md |
| 10 | core | algo | Нижняя граница сортировки сравнениями | Ω(n log n) | урок D1_algo.md |
| 11 | core | algo | За счёт чего map держит высоту log n | инвариант красно-чёрного дерева: чередование цветов + равное число чёрных узлов на пути от корня до листа | урок D1_algo.md |
| 12 | deep | algo | Почему нельзя полагаться на порядок обхода unordered_map | порядок бакетов не гарантирован и может меняться при rehash | урок D1_algo.md |
| 13 | base | algo | Формула фактора загрузки | load = size / capacity | урок D1_algo.md |
| 14 | base | algo | Порог load factor при открытой адресации, после которого делают rehash | обычно ≤ 0.7 | урок D1_algo.md |
| 15 | core | algo | Зачем tombstone при открытой адресации | чтобы удаление не обрывало цепочку зондирования: поиск должен пройти сквозь помеченную ячейку до элемента, вставленного позже | урок D1_algo.md |
| 16 | core | algo | Почему ёмкость хеш-таблицы берут степенью двойки | idx = hash & (cap-1) вместо деления по модулю — дешевле на процессоре | урок D1_algo.md |
| 17 | core | algo | Что физически происходит при rehash | выделяется массив вдвое больше, каждый элемент переставляется по новому индексу (зависит от cap) | урок D1_algo.md |
| 18 | deep | algo | Почему rehash даёт амортизированное O(1), а не O(n) на вставку | та же геометрическая прогрессия, что у vector::push_back: суммарная стоимость n вставок ≈ n, а не n² | урок D1_algo.md |
| 19 | base | algo | Сложность has_pair (вложенный цикл по всем парам) | O(n²) | урок D1_algo.md |
| 20 | core | algo | Сложность has_pair_fast по времени и по памяти | O(n) по времени в среднем, O(n) дополнительной памяти под хеш-множество | урок D1_algo.md |
| 21 | base | algo | Какие константы использует FNV-1a в этом коде (offset basis / prime) | 1469598103934665603 / 1099511628211 | урок D1_algo.md |
| 22 | core | algo | Почему rehash пересчитывает индекс для каждого узла, а не переносит их как есть | индекс = hash % buckets.size(), а size() изменился (удвоился), старые индексы для нового размера в общем случае неверны | урок D1_algo.md |
| 23 | core | algo | Чем открытая адресация выигрывает у цепочек по производительности и почему | она кэш-дружелюбнее: элементы лежат подряд в массиве, а не разбросаны по куче отдельными узлами | урок D1_algo.md |
| 24 | deep | algo | Может ли load factor у цепочек быть больше 1 | да, цепочка просто станет длиннее (в отличие от открытой адресации, где load ≤ 1 всегда) | урок D1_algo.md |
| 25 | base | linux | Что возвращает `fork()` в родителе и в ребёнке | в родителе PID ребёнка (>0), в ребёнке 0, при ошибке −1 | урок D1_linux.md |
| 26 | core | linux | Что происходит со страницами памяти при `fork()` | ничего сразу: COW, физическая копия страницы создаётся при первой записи в неё (page fault) | урок D1_linux.md |
| 27 | core | linux | Почему `fork` дешёвый даже для процесса с гигабайтами памяти | копируются не данные, а только записи таблицы страниц; сами страницы данных не дублируются, пока их не изменят | урок D1_linux.md |
| 28 | base | linux | Что нужно сделать с `stdout` перед `fork`, если он не пуст | вызвать `fflush(stdout)`, иначе буфер продублируется в ребёнке | урок D1_linux.md |
| 29 | deep | linux | Какой размер страницы памяти на x86-64, о которой копия делается при COW | 4 КБ | урок D1_linux.md |
| 30 | base | linux | Чем `exec` отличается от `fork` | `fork` создаёт новый процесс, `exec` заменяет образ текущего процесса, не создавая нового | урок D1_linux.md |
| 31 | core | linux | Что сохраняется у процесса после успешного `exec` | PID и таблица открытых файловых дескрипторов, кроме помеченных `FD_CLOEXEC` | урок D1_linux.md |
| 32 | core | linux | Почему `exec` при успехе никогда не возвращает управление | старого кода, куда можно было бы вернуться, больше не существует — адресное пространство заменено новым образом | урок D1_linux.md |
| 33 | base | linux | Разница между `execlp`, `execv`, `execvp` | `execlp` ищет в `PATH`, `execv` — по полному пути, `execvp` — по имени в `PATH` | урок D1_linux.md |
| 34 | base | linux | Зачем нужен `waitpid` | забрать код возврата завершившегося ребёнка и позволить ядру освободить его запись в таблице процессов | урок D1_linux.md |
| 35 | core | linux | Что такое зомби и почему он не исчезает сам | процесс, завершивший `exit()`, чью запись ещё не забрал родитель через `wait`; ядру некуда передать код возврата, кроме как дождаться `wait` | урок D1_linux.md |
| 36 | core | linux | Чем зомби отличается от сироты | зомби: родитель жив, но не вызвал `wait`; сирота: родитель умер, процесс усыновлён init/systemd (PID 1) | урок D1_linux.md |
| 37 | base | linux | Откуда код возврата 137 и 139 | 137 = 128+9 (SIGKILL), 139 = 128+11 (SIGSEGV) — так оболочка кодирует завершение по сигналу | урок D1_linux.md |
| 38 | core | linux | Как правильно проверить, что ребёнок убит сигналом, а не завершился штатно | макросами `WIFSIGNALED(status)`/`WTERMSIG(status)`, не сравнением `status` напрямую | урок D1_linux.md |
| 39 | deep | linux | Что показывает `WCOREDUMP(status)` | что завершение по сигналу сопровождалось записью core-дампа на диск | урок D1_linux.md |
| 40 | base | linux | Номера сигналов SIGINT/SIGKILL/SIGTERM/SIGSEGV/SIGPIPE/SIGCHLD | 2/9/15/11/13/17 | урок D1_linux.md |
| 41 | core | linux | Чем SIGTERM отличается от SIGKILL | SIGTERM перехватывается и позволяет корректно завершиться, SIGKILL не перехватывается и не игнорируется, ядро снимает процесс с исполнения напрямую | урок D1_linux.md |
| 42 | core | linux | Что можно делать внутри обработчика сигнала | только менять `volatile sig_atomic_t`; `printf`/`malloc` небезопасны (не async-signal-safe) | урок D1_linux.md |
| 43 | base | linux | Чем `sigaction` лучше `signal` | поведение `signal` исторически различается между Unix-системами, `sigaction` даёт предсказуемую и переносимую семантику | урок D1_linux.md |
| 44 | deep | linux | Что происходит, если сервис игнорирует SIGTERM при `systemctl stop` | по истечении `TimeoutStopSec` (по умолчанию ~90 c) systemd посылает SIGKILL принудительно | урок D1_linux.md |
| 45 | base | linux | Что означает EINTR и как на него реагировать | вызов прерван доставкой сигнала; корректная реакция — повторить вызов | урок D1_linux.md |
| 46 | base | linux | Чем EAGAIN отличается от обычной ошибки чтения | данных сейчас нет на неблокирующем дескрипторе, это не сбой, а сигнал «попробуй позже» | урок D1_linux.md |
| 47 | core | linux | Когда безопасно читать `errno` | сразу после ошибки вызова, до любого другого вызова, способного его перезаписать | урок D1_linux.md |
| 48 | deep | linux | Какой errno сигнализирует об исчерпании лимита открытых дескрипторов процесса | EMFILE (лимит задаётся `ulimit -n`) | урок D1_linux.md |
| 49 | base | linux | Какой код возврата у шелла даст несуществующая команда | 127 | урок D1_linux.md |
| 50 | base | linux | Какие дескрипторы дочерний процесс получает от родителя при `fork` и почему вывод команды сразу виден в терминале | 0/1/2 (stdin/stdout/stderr) наследуются через копию таблицы дескрипторов при `fork` | урок D1_linux.md |
| 51 | core | linux | Каким флагом собрать бинарник для проверки на утечки и UB | `-fsanitize=address,undefined -fno-omit-frame-pointer` | урок D1_linux.md |
| 52 | base | algo | Сколько байт меняет местами `bswap32` | 4 | задача 01_bits |
| 53 | core | algo | Что делает `x & (x - 1)` | гасит младший единичный бит `x` | задача 01_bits |
| 54 | core | algo | Сколько итераций цикла `popcount32` на `x = 0xFFFFFFFF` | 32 (по числу единичных бит) | задача 01_bits |
| 55 | deep | algo | Почему `1u << 31` пишут с суффиксом `u`, а не как `int` | сдвиг знакового `int` в | задача 01_bits |
| 56 | base | algo | Какой порядок байт использует сеть для многобайтовых полей | network byte order | задача 01_bits |
| 57 | base | algo | Во сколько раз быстрее идёт `fast` относительно `slow` в паре двух указателей | в 2 раза | задача 02_list |
| 58 | core | algo | Почему рекурсивный разворот списка не годится под требование O(1) памяти | каждый | задача 02_list |
| 59 | core | algo | На чём основано доказательство, что `fast` догонит `slow` при цикле | внутри цикла | задача 02_list |
| 60 | base | algo | Сколько дополнительных указателей нужно для итеративного разворота списка | 3 | задача 02_list |
| 61 | base | algo | Сложность `push`/`pop` кольцевого буфера | O(1) | задача 03_ring |
| 62 | core | algo | Как отличить пустой буфер от полного при `head_ == tail_` | хранить отдельный | задача 03_ring |
| 63 | core | algo | Чем `delete[]` отличается от `delete` для массива, выделенного `new[]` | `delete` | задача 03_ring |
| 64 | base | algo | Какое условие делает `push` дешевле, чем `% capacity_` на каждый вызов | задача 03_ring | |
| 65 | base | net | Минимальная длина IPv4-заголовка без опций | 20 байт | задача 04_ipv4 |
| 66 | base | net | Код `protocol` для TCP / UDP / ICMP | 6 / 17 / 1 | задача 04_ipv4 |
| 67 | core | net | В каком порядке лежат `src_ip`/`dst_ip` в буфере согласно заданию | «как на проводе», | задача 04_ipv4 |
| 68 | core | net | Почему `reinterpret_cast` буфера в `Ipv4Header*` | UB? — нет гарантии выравнивания | задача 04_ipv4 |
| 69 | deep | net | Чему должна быть равна сумма в доп. коде по `ihl*4` байтам заголовка (вместе с полем | задача 04_ipv4 | |
| 70 | base | algo | Сложность наивного DP-решения LIS | O(n²) | задача 05_lis |
| 71 | core | algo | Сложность решения через `tails` + бинарный поиск | O(n log n) | задача 05_lis |
| 72 | core | algo | Что хранит `tails[k]` | минимально возможный последний элемент возрастающей | задача 05_lis |
| 73 | deep | algo | Почему для строгого возрастания нужен `lower_bound`, а не `upper_bound` | задача 05_lis | |
| 74 | base | threads | Каким флагом компилятора включается ThreadSanitizer | `-fsanitize=thread` | задача 06_threads |
| 75 | base | threads | Что бросает `push` после `close()` | `std::runtime_error` | задача 06_threads |
| 76 | core | threads | Должен ли `size()` быть потокобезопасным в этой задаче | да, его тоже вызывают из другого потока и он тоже под захватом мьютекса | задача 06_threads |
| 77 | core | threads | Что происходит с ждущими потоками при `close()` | все разблокируются (никакого вечного `wait`) | задача 06_threads |
| 78 | base | threads | Что атомарно делает `cv.wait(lock)` при входе | освобождает мьютекс и усыпляет поток одной неделимой операцией | задача 06_threads |
| 79 | core | threads | Почему `while` вокруг `wait`, а не `if` | из-за spurious wakeup: `wait` может вернуться без вызова notify | задача 06_threads |
| 80 | core | threads | Чем опасен один `condition_variable` на два разных предиката вместе с `notify_one` | можно разбудить не тот поток, а нужный останется ждать | задача 06_threads |
| 81 | deep | threads | На каком примитиве ОС реализован `condition_variable` на Linux | futex | задача 06_threads |
| 82 | base | threads | Какой командой запускается проверка задачи 06 | `python3 grade.py 06` | задача 06_threads |
| 83 | core | threads | Почему TSan может не показать гонку при одном прогоне, даже если она есть в коде | он ловит гонку по факту конкретной раскладки потоков в этом запуске, а не статическим анализом | задача 06_threads |
| 84 | base | linux | На каком адресе и с каким флагом сокета должен слушать сервер | 127.0.0.1, `SO_REUSEADDR` | задача 07_epoll |
| 85 | base | linux | Сколько одновременных соединений сервер должен держать минимум | 64 | задача 07_epoll |
| 86 | core | linux | По какому событию сервер закрывает соединение с клиентом | по EOF со стороны клиента | задача 07_epoll |
| 87 | base | linux | Что означает `EAGAIN` на неблокирующем сокете | не ошибка, сигнал «данных пока нет, попробуй позже» | задача 07_epoll |
| 88 | core | linux | В чём разница между LT и ET режимами epoll | LT сообщает о готовности, пока данные остаются в буфере; ET — один раз, при переходе «не готов → готов» | задача 07_epoll |
| 89 | core | linux | Почему ET требует неблокирующих дескрипторов | цикл чтения до EAGAIN на блокирующем сокете завис бы на последнем вызове, когда данных больше нет | задача 07_epoll |
| 90 | deep | linux | Какая асимптотика у `epoll_wait` относительно select/poll | O(1) на готовое событие против O(n) на весь набор у select/poll | задача 07_epoll |
| 91 | base | linux | Каким кодом возврата должен завершаться сервер по SIGTERM/SIGINT | 0 | задача 07_epoll |
| 92 | core | linux | Что возвращает `epoll_wait`, если его прервал сигнал | -1 с `errno == EINTR`, не ошибка выполнения | задача 07_epoll |
| 93 | base | linux | Сколько соединений открывает тест `grade.py 07` | 3 | задача 07_epoll |
| 94 | base | linux | Каким сигналом тест проверяет корректное завершение сервера | SIGTERM | задача 07_epoll |
| 95 | base | linux | Сколько строк TOP выводится, если уникальных IP меньше трёх | столько, сколько есть уникальных IP | задача 08_bash |
| 96 | base | linux | Что печатает скрипт для пустого файла | `TOTAL 0`, `5XX 0`, без строк TOP | задача 08_bash |
| 97 | core | linux | По какому полю строки лога определяется IP | по первому полю | задача 08_bash |
| 98 | core | linux | Почему `while read line` в bash медленный на миллионе строк | каждая итерация — это работа интерпретатора bash, а вызов внешних утилит из цикла — ещё и `fork+exec` на строку | задача 08_bash |
| 99 | core | linux | Что даёт связка awk + sort вместо построчного цикла | один проход по файлу целиком специализированным бинарником вместо миллиона запусков процессов | задача 08_bash |
| 100 | deep | linux | По какому полю сортируется список IP при равенстве числа запросов | по возрастанию строки IP (вторичный ключ сортировки) | задача 08_bash |
| 101 | base | linux | Что делает `set -e` | останавливает скрипт при первой команде с ненулевым кодом возврата | задача 08_bash |
| 102 | core | linux | В каких позициях `set -e` не останавливает скрипт при ошибке команды | в условиях `if`/`while`/`until`, слева/справа от `&&`/`||`, после `!` | задача 08_bash |
| 103 | core | linux | Почему `local var=$(cmd)` не ловится `set -e`, если `cmd` упал | итоговый код возврата строки — это код возврата `local`, а он 0 даже при упавшей подстановке внутри | задача 08_bash |
| 104 | core | linux | Зачем `set -o pipefail` отдельно от `set -e` | без него код возврата конвейера — это код возврата только последней команды, падение команды посередине конвейера остаётся незамеченным | задача 08_bash |
| 105 | base | linux | Каким кодом возврата должен завершаться `solution.sh` при успехе | 0 | задача 08_bash |
| 106 | core | linux | Что именно сверяет `grade.py 08` с эталоном | точное совпадение вывода (все четыре строки) на фикстуре и на большом логе | задача 08_bash |
| 107 | base | linux | Что печатает `./crash` без аргументов после починки | `len=5`, код возврата 0 | задача 09_gdb |
| 108 | core | linux | Какие два санитайзера должны не давать сообщений после починки | ASan и UBSan (`-fsanitize=address,undefined`) | задача 09_gdb |
| 109 | base | linux | Что даёт флаг `-g` при сборке для gdb | отладочную информацию (DWARF): соответствие адресов строкам, именам и типам переменных | задача 09_gdb |
| 110 | core | linux | Почему для отладки собирают с `-O0`, а не с `-O2` | оптимизатор переставляет/удаляет инструкции и переиспользует регистры, из-за чего строки и значения в отладчике перестают однозначно соответствовать исходнику | задача 09_gdb |
| 111 | core | linux | Что ловит ASan из перечисленного: выход за границы, use-after-free, двойное освобождение | все три, в момент обращения к памяти, а не постфактум | задача 09_gdb |
| 112 | deep | linux | Что именно ловит UBSan, в отличие от ASan | неопределённое поведение по стандарту C (знаковое переполнение, сдвиг за пределы разрядности), а не ошибки работы с памятью | задача 09_gdb |
| 113 | base | linux | Какая команда gdb показывает цепочку вызовов до краша | `bt` | задача 09_gdb |
| 114 | core | linux | Чем `watch var` отличается от обычного `break` | останавливает выполнение при каждом изменении значения переменной, а не в заданной точке кода | задача 09_gdb |
| 115 | core | linux | Зачем нужен `frame N` после `bt` | переключает контекст `print`/`info locals` на конкретный кадр стека, чтобы смотреть переменные не только текущей функции | задача 09_gdb |
| 116 | base | linux | Сколько входов прогоняет `grade.py 09` | 5 | задача 09_gdb |
| 117 | base | linux | Каким компилятором собирается `crash.c` на проверке | gcc (компилятор C) | задача 09_gdb |
| 118 | base | algo | Сколько времени закладывается на задачу 10 | 1,5–2,5 часа со ступенями | задача 10_hash |
| 119 | base | algo | Какой командой проверяется решение | `python3 grade.py 10` | задача 10_hash |
| 120 | deep | algo | Где в реальных устройствах используется похожая структура | таблицы MAC-адресов (FDB) коммутатора, кэши сессий — открытая адресация с жёсткими ограничениями по памяти | задача 10_hash |
| 121 | base | algo | Почему `hash & (cap-1)` эквивалентно `hash % cap` | только если `cap` — степень двойки: `cap-1` в двоичном виде — маска из всех младших бит, AND с ней даёт тот же результат, что остаток от деления | задача 10_hash |
| 122 | base | algo | Пример: `cap=8` (маска `0b111`), `hash=19` (`0b10011`). Индекс | `19 & 7 = 3` | задача 10_hash |
| 123 | core | algo | Среднее число проб при удачном поиске, load factor 0.7 | ≈2,2 (формула Кнута `0.5·(1+1/(1-0.7))`) | задача 10_hash |
| 124 | core | algo | То же при load factor 0.9 | ≈5,5 — рост почти в 2,5 раза от значения при 0.7 | задача 10_hash |
| 125 | deep | algo | Среднее число проб при НЕудачном поиске, load factor 0.9 | ≈50,5 (`0.5·(1+1/(1-0.9)²)`) — на порядок хуже удачного поиска | задача 10_hash |
| 126 | core | algo | Почему `EMPTY` вместо `TOMBSTONE` после удаления ломает поиск чужих ключей | поиск идёт по цепочке проб до первой `EMPTY`; если такая ячейка появляется раньше искомого ключа, элементы за ней в этой цепочке становятся ненаходимыми, хотя физически на месте | задача 10_hash |
| 127 | base | algo | Сколько ключей вставляет тест на кластеризацию и какие они | 512 ключей, кратных 16 | задача 10_hash |
| 128 | base | algo | За какое время должны пройти 100 000 вставок | быстрее 2 секунд | задача 10_hash |
| 129 | base | algo | Какой порог load factor держит таблица | ≤ 0.7 | задача 10_hash |
| 130 | base | algo | Минимальная ёмкость таблицы по умолчанию | 16, степень двойки | задача 10_hash |
| 131 | base | algo | Индексы детей и родителя в max-heap на массиве | дети `2i+1`, `2i+2`; родитель `(i-1)/2` | задача 11_heap |
| 132 | base | algo | Что за 2 секунды должны выполниться на 3 000 000 элементов | `heapify` и `kth_largest` с `k=1000` (по отдельности) | задача 11_heap |
| 133 | base | algo | Какой ключевой запрет на реализацию `heapify` | нельзя строить через `push` в цикле, только bottom-up за O(n) | задача 11_heap |
| 134 | base | algo | Сложность доступа к максимуму (`top`) | O(1), максимум всегда в корне по инварианту кучи | задача 11_heap |
| 135 | base | algo | Сложность одного `sift-up`/`sift-down` от произвольного узла | O(log n) — путь ограничен высотой дерева | задача 11_heap |
| 136 | core | algo | Что сравнивается на каждом шаге `sift-down` | узел с обоими детьми; меняется местами с бОльшим из них, если тот больше узла | задача 11_heap |
| 137 | core | algo | За какое время строится куча через n последовательных `push` | O(n log n): сумма `Σ log₂(i)` по всем вставкам ≈ `n log₂ n` | задача 11_heap |
| 138 | core | algo | За какое время строится куча через bottom-up heapify | O(n): работа в узле пропорциональна его высоте `h`, а ряд `Σ h/2^h` сходится к константе, а не растёт с `n` | задача 11_heap |
| 139 | deep | algo | С какого индекса начинается bottom-up heapify и в какую сторону идёт | с последнего нелистового узла `n/2 - 1`, к корню (индекс 0) | задача 11_heap |
| 140 | core | algo | Во сколько раз push-цикл медленнее bottom-up heapify по числу сравнений при n=3 000 000 | примерно на порядок (~10 раз): `log₂(3·10⁶) ≈ 21,5` против константы ~2 у bottom-up | задача 11_heap |
| 141 | base | algo | Сложность `kth_largest`/`top_k` через полную кучу | O(n + k log n): O(n) на heapify плюс k раз pop по O(log n) | задача 11_heap |
| 142 | core | algo | Когда используют min-heap размера k вместо полной кучи на весь массив | на потоке данных, который не помещается в память: min-heap размера k хранит только k текущих кандидатов, сложность O(n log k), память O(k) | задача 11_heap |
| 143 | core | algo | Чем `std::nth_element` отличается от кучи для top-K | в среднем O(n), даёт частичный порядок вокруг k-го элемента, но не отсортированный список и без гарантии худшего случая; куча всегда O(n + k log n) и отдаёт элементы по убыванию через pop | задача 11_heap |
| 144 | base | algo | Что возвращает функция при `src == dst` | 0 | задача 12_dijkstra |
| 145 | base | algo | Что возвращает функция при недостижимости `dst` | -1 | задача 12_dijkstra |
| 146 | base | algo | В каком типе суммируются веса и почему не `int` | `long long`; веса суммируются до 10^9, `int` может переполниться на длинном пути | задача 12_dijkstra |
| 147 | base | algo | Сложность наивной Дейкстры (перебор минимума по массиву) | O(V²) | задача 12_dijkstra |
| 148 | base | algo | Сложность Дейкстры с бинарной кучей | O((V+E) log V) | задача 12_dijkstra |
| 149 | core | algo | При V=100 000, E=200 000, почему наивный O(V²) не укладывается в 2 секунды | 100 000² = 10^10 операций против ≈5·10^6 у варианта с кучей — разница на 3–4 порядка | задача 12_dijkstra |
| 150 | core | algo | Что означает «ленивое удаление» устаревших записей в очереди | вместо decrease-key при каждом улучшении расстояния в кучу пушится новая пара (dist, v); при извлечении запись с `d != dist[v]` пропускается как устаревшая | задача 12_dijkstra |
| 151 | deep | algo | Почему `std::priority_queue` не используют с decrease-key напрямую | у контейнера-адаптера нет интерфейса для обновления произвольного элемента за O(log n); дешевле каждый раз пушить новую запись и лениво отбрасывать устаревшие при pop | задача 12_dijkstra |
| 152 | core | algo | Почему Дейкстра ломается на отрицательных рёбрах | алгоритм считает расстояние до извлечённой из очереди вершины окончательным; отрицательное ребро может позже уменьшить это расстояние, но вершина уже не пересматривается | задача 12_dijkstra |
| 153 | base | algo | Какой алгоритм нужен при отрицательных весах без отрицательных циклов | Беллман-Форд, O(V·E) | задача 12_dijkstra |
| 154 | core | algo | Как Беллман-Форд обнаруживает отрицательный цикл | если рёбра продолжают релаксироваться на V-м проходе (после V-1 гарантированно достаточных проходов), в графе есть отрицательный цикл | задача 12_dijkstra |
| 155 | base | algo | Почему self-loop с w≥0 не требует отдельной обработки | добавление неотрицательного веса к текущему расстоянию никогда не уменьшает его, значит такое ребро никогда не выигрывает релаксацию | задача 12_dijkstra |
| 156 | base | net | Сколько узлов даёт /24 | 254 | задача 13_subnet |
| 157 | base | net | Сколько узлов даёт /26 | 62 | задача 13_subnet |
| 158 | base | net | Сколько узлов даёт /30 | 2 | задача 13_subnet |
| 159 | base | net | Сеть, broadcast и диапазон узлов для `10.0.1.130/26` | сеть `10.0.1.128`, broadcast `10.0.1.191`, узлы `129..190` | задача 13_subnet |
| 160 | base | net | Формула маски для префикса p (0<p≤32) | `0xFFFFFFFF << (32-p)`; для p=0 маска = 0 отдельным случаем (сдвиг на 32 — UB) | задача 13_subnet |
| 161 | base | net | Как получить network и broadcast из ip и mask | `network = ip & mask`, `broadcast = network | ~mask` | задача 13_subnet |
| 162 | core | net | Формула host_count для prefix ≤ 30 | `2^(32-prefix) - 2` | задача 13_subnet |
| 163 | core | net | Почему /31 | исключение и даёт 2 узла вместо 0 по общей формуле? — RFC 3021: у канала точка-точка ровно 2 узла, broadcast не нужен, поэтому оба адреса 2-адресного блока отдаются под хосты вместо потери половины блока | задача 13_subnet |
| 164 | core | net | Что возвращает subnet_of для /32 | network=broadcast=first_host=last_host=ip, host_count=1 (host route/loopback) | задача 13_subnet |
| 165 | core | net | Формула `prefix_for_hosts(h)` | `32 - ceil(log2(h+2))`, из условия `2^(32-prefix) >= h+2` | задача 13_subnet |
| 166 | deep | net | Почему `prefix_for_hosts(63) = 25`, а не 26, хотя 62 меньше 63 всего на 1 | /26 даёт только 62 узла, этого не хватает даже на 1 хост меньше требуемых 63; нужно расширить хостовую часть на 1 бит — /25 с 126 узлами | задача 13_subnet |