Блог пользователя m8.pie

Автор m8.pie, история, 5 лет назад, По-русски
Предисловие

Давайте посмотрим на эту задачу. (она пока не появилась в архиве.)

А также посмотрим на это её решение.

Первый вопрос, который возник у меня в голове — почему это работает по времени?

Доказательство почему это корректный алгоритм

Если мы посмотрим на $$$dfs$$$, то заметим, что он перебирает вершины из сета и, если ребра между текущей вершиной и вершиной из сета нет, то переходит в вершину из сета.

Первое что приходит в голову: казалось бы, контрпример строится достаточно просто, т.е. пусть не будет ребра между текущей вершиной и последней сете и так далее, тогда на каждом этапе $$$dfs$$$ мы перебираем в среднем $$$V$$$ вершин и всего заходов в dfs у нас $$$V$$$ => $$$V^2 \cdot $$$ (сложность извлечения и удаления вершин)

Но давайте посмотрим на это с другой стороны: а сколько раз мы НЕ зайдём в наш if и не перейдём дальше? То, что мы не перешли означает, что ребро существует, а каждое ребро мы рассмотрим, очевидно, не более двух раз, из $$$u$$$ и из $$$v$$$, если ребро $$$(u, v)$$$, получается, что мы только $$$2E$$$ раз не перейдём, а также каждый состоявшийся переход сокращает число вершин, которые надо посетить на 1 $$$\Rightarrow$$$ переходов потребуется не более $$$V$$$ $$$\Rightarrow$$$ суммарная сложность не более $$$(V + E) \cdot $$$ (сложность извлечения и удаления вершин), что, в данной, например, реализации $$$(V + E) \cdot log(V)$$$

Заключение

Полный текст и комментарии »

  • Проголосовать: нравится
  • +43
  • Проголосовать: не нравится

Автор m8.pie, 5 лет назад, перевод, По-русски

Представьте ситуацию, где мы хотим найти такое $$$a_j$$$, для любого $$$a_i$$$, что оно удовлетворяло бы:

$$$a_i > a_j$$$
$$$i < j$$$

Насколько эффективный способ Вы знаете?

Как подсказал shufl999dka, эту задачу можно решить за $$$O(n)$$$.

Решение:

Представим теперь несколько более сложную ситуацию, где мы хотим найти такое $$$a_j$$$ для любого $$$x$$$ и полуинтервала $$$[l; r)$$$, который бы удовлетворял теперь таким условиям:

$$$a_j < x$$$
$$$l \leq j < r$$$
$$$j\;минимально\;возможное$$$

Первое решение, которое пришло мне в голову было за $$$O(n\log^2{n}):$$$

Решение

Благодаря MrDindows и bicsi мы знаем решение за $$$O(n\log{n})$$$:

Решение

Также можно посмотреть демонстрацию обоих решений в конкретной задаче: 1237D - Сбалансированный плейлист

Решение за $$$O(n\log^2{n})$$$ — 732 мс 62741630

Решение за $$$O(n\log{n})$$$ — 77 мс 62881402

Если вы умеете решать это эффективнее, то я с удовольствием этому научусь из комментариев.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +18
  • Проголосовать: не нравится