301

(6 ответов, оставленных в Feedback)

В общем, предлагаю сюда выписывать эти ссылки на задачи, я буду добавлять это в конец статей. cmd, у тебя же кажется на твоём сайте были подобные классификации, если не жалко, кинь их сюда smile

Формат предлагаю такой: <алгоритм (возможно, группа алгоритмов - например, максимальные потоки)>: <ссылка на задачу на одном из online judges>: <краткое описание (например: "построить по заданному полю граф и найти в нём кратчайший путь")>. Можно ещё указывать сложность (хотя бы простая/средняя/сложная). Элементарные задачи, где всё сводится к самому алгоритму очевидным образом, - не думаю, что стоит кидать много таких задач, это будет просто засорять список (а простых задач в judge'ах, понятно, как раз большинство).

Можно обсудить формат таких добавлений. Ведь многие ключевые для решения вещи не объяснишь в двух словах. И к тому же момент, что многие статьи (как разные алгоритмы макс. потока) фактически об одном и том же. Поэтому может создать отдельный подраздел на сайте, и в конец статей добавлять ссылки на эти блоки задач?

302

(17 ответов, оставленных в Problems)

denton
а, это пожалуй всё объясняет smile

KADR
вроде всё учитывается. но там такие странные вещи происходят: 11-классникам предпочитают 10-классников, и далеко не только при равенстве очков. аналогичный "странный" компаратор использовался и год назад, и раньше...

303

(17 ответов, оставленных в Problems)

AlexFetisov
Там идут сборы студентов, на задачи белорусов(?), а я про сборы школьников (фактически, это был их отбор на межнар). Так что секретность непонятна - эти задачи на офиц. соревнования школьников уже не дашь, студентов - тоже (аналогично, некоторые студенты участвовали в этой школе). Всякие китайцы тоже не смогут воспользоваться этими наборами (все задачи на русском). Так что непонятно, что с этими контестами можно ещё сделать smile Материалы прошлого года, кстати, тоже не были выложены, а вот за предыдущие года - ещё были (см. http://neerc.ifmo.ru/school)

Кстати, поздравляю саратовских школьников с тем, что опять наши составляют половину сборной России smile

304

(5 ответов, оставленных в Problems)

Интересно, а такую идею если попробовать.
Там же сказано, что длина любого пути <= 2*10^5? Что, если мы вместо кучи сделаем такую вещь: для каждого расстояния i сохраним список (вектор) vs[i ] вершин, имеющих такое расстояние. При релаксации будет добавлять вершину в список для нового расстояния (а из старого списка удалять не будем - это долго, O(1) здесь никак не получится). А в начале каждой итерации будем выбирать текущую вершину следующим образом: сделаем глобальный указатель cur_d = 0, а в начале каждой итерации будем извлекать (и удалять) из списка vs[cur_d] какую-то вершину v, смотреть - если она поюзана, то взять следующую вершину из списка (когда список опустеет, сделать ++cur_d), иначе эта v и есть нужная нам ближайшая из непоюзанных вершин.

Асимптотика получается: O(M) на все релаксации, и, т.к. суммарный размер списков есть O(MAXLEN+M), то на выбор текущей вершины тоже асимптотика O(MAXLEN+M). Итого: O(MAXLEN+M), хорошая асимптотика, близкая к оптимальной (оптимальная, когда M>=MAXLEN).

305

(17 ответов, оставленных в Problems)

mastersobg
Как ни странно, выложить эти задачи нельзя. Я не знаю, по какой причине такая секретность...

306

(5 ответов, оставленных в Problems)

Ещё можно попробовать вместо пар в очереди хранить только номера вершин (но с другим компаратором). Я это описал в недавно переписанной статье Алгоритм Дейкстры для разреженного графа.

P.S. Посмотрел задачу, там же даже не сказано, сколько рёбер. А если их там 10000 из каждой вершины будет? Тогда выгодней даже будет обычную Дейкстру написать, за N^2+M.

307

(3 ответов, оставленных в Algo)

Пусть дана функция f(x), унимодальная на некотором отрезке [l;r] (т.е. сначала строго возрастает, потом достигает максимума (в одной точке или целом отрезке), потом строго убывает; или наоборот: убывает, достигает минимума, возрастает). Будем рассматривать первый вариант, с максимумом, второй будет симметричен ему.

Итак, требуется найти максимум функции на отрезке [l;r]. Тогда возьмём любые две точки в этом отрезке: l < m1 < m2 < r. Посчитаем значения функции f(m1) и f(m2).

  • Если окажется, что f(m1) < f(m2), то искомый максимум не может находиться в левой части, т.е. в части [l;m1].

  • Если наоборот f(m1) > f(m2), то искомый максимум не может находиться в правой части, т.е. в части [m2;r].

  • Ну если f(m1) = f(m2), то по определению унимодальности это будет означать, что и m1, и m2 - точки максимума, поэтому этот случай можно произвольно отнести к первому или второму случаю.

В первом случае мы получаем, что дальше искать максимум есть смысл только в отрезке [m1;r], а во втором случае - в [l;m2]. Вот мы и нашли итерационный переход: как от отрезка [l;r] перейти к новому отрезку [l';r']. Всё, берём этот новый отрезок, в нём всё повторяем, переходим к следующему отрезку, и т.д. Рано или поздно длина отрезка станет маленькой (< заранее определённого EPS), и процесс можно останавливать - считать, например, что левый конец найденного отрезка и есть искомый максимум.

(если аргумент функции f целочисленный, то отрезок [l;r] тоже дискретный, но на корректность метода это не влияет; просто процесс надо будет останавливать, когда r-l < 3)

Наконец, осталось сказать, что точки m1 и m2 мы брали произвольными. На практике часто берут их так, чтобы [l;r] делилось на 3 равные части (потому что это проще всего написать), хотя никто не мешает брать точки m1 и m2 поближе друг к другу, чтобы ускорить сходимость.

Код:

double f (double x) {
...
}

double l = ..., r = ...;
while (r - l > EPS) { // или: for (int i=0; i<200; ++i) - задав большое количество итераций, нужная точность уж наверняка достигнется
   double m1 = l + (r - l) / 3,
      m2 = r - (r - l) / 3;
   if (f (m1) < f (m2))
      l = m1;
   else
      r = m2;
}

Можно говорить, что тернарный поиск - это обобщение бинарного поиска.

308

(10 ответов, оставленных в Offtopic)

  • Windows only

  • Microsoft Visual Studio (2008 дома, на контестах в универе 2005)

  • Microsoft C++ Compiler соответственной версии

Не знаю почему, но меня не тянет ни на vim, не вижу и никакого толка от Far.

+ ещё желательно уметь работать с Eclipse (т.к. на некоторых официальных соревнованиях, например Финале wink, другого выбора нет), но у меня с этим пока слабо

309

(6 ответов, оставленных в Problems)

Сделать стандартный (за N log N) препроцессинг, который находит LCP для двух соседних в порядке сортировки суффиксов (т.е. если p[0..n-1] - перестановка суффиксов, сам суффиксный массив, то построим ещё массив lcp[0..n-2], lcp[i ] = lcp(p[i ], p[i+1])).

Тогда количество различных подстрок будет равно СУММЕ (n-p[i ]) - СУММА lcp[i ]. Действительно, будем рассматривать все суффиксы строки в порядке сортировки. Для каждого суффикса будем смотреть те его префиксы, которые дают новые подстроки. Суффикс p[0] даёт n-p[0] новых подстрок. Суффикс p[1] даёт n-p[1]-lcp[0] новых, потому что среди всех префиксов n-p[1] первые lcp[0] будут одинаковыми с нулевым шагом. И т.д.

310

(17 ответов, оставленных в Problems)

mastersobg

В общий доступ?

Неа. Ну если мне дадут материалы, я, конечно, выложу их здесь на сайте.

311

(6 ответов, оставленных в Problems)

Массивом тоже есть решение, но оно не самое простое. Щас попробую вспомнить smile Но, пожалуй, получится даже сложней, чем автомат написать )

312

(6 ответов, оставленных в Problems)

или автомату )

313

(18 ответов, оставленных в OlympNews)

На сборах я тоже буду присутствовать в качестве помощника Михаила Мирзаянова smile
Кстати, будут и 2 наши команды, но не SU1 и не SU2 (ну я-то буду, но не участником smile )

314

(17 ответов, оставленных в Problems)

mastersobg

Какие сборы ты имеешь в виду? В Минске? Или школьников?

Школьников, в Малоярославце.

Есть ли возможность поделиться материалами? smile

У меня лично нет материалов, их выкладывают нам в виде контестов на нашем сервере smile Я думаю, после сборов архив с задачами и тестами где-нибудь выложат.

315

(5 ответов, оставленных в Algo)

Ну в общем я не стал реализовывать этот изврат, в виде текста только упомянул smile

316

(2 ответов, оставленных в Algo)

Ок, но я решил вообще переписать с нуля эту статью smile Не было ни определений, ни доказательств, код какой-то странный... smile

317

(21 ответов, оставленных в Problems)

Ну в принципе это решение нетрудно довести до чистого квадрата хеш-таблицами (вместо сортировки считать количество точек с нужным углом, а вместо дабловых углов рассматривать целочисленные радиус-вектора, нормированные по gcd), правда, у меня всё равно сомнения, что это уложится

318

(17 ответов, оставленных в Problems)

Надеюсь, это не с идущих сейчас сборов задача? Потому что эти задачи я потом в виде контестов буду прорешивать

319

(21 ответов, оставленных в Problems)

Ясн ) Забыл, что с этого года на область задачи присылаются одинаковые для всех

320

(21 ответов, оставленных в Problems)

Саратов что ле? )))

321

(15 ответов, оставленных в Algo)

chum
Ага, на сях-то конечно легко smile Чтоб на Паскале написать, надо брать Кормена и реализовывать кучу, это несложный алгоритм. Ну или погуглить и найти готовый, но это не дзенно smile

322

(21 ответов, оставленных в Problems)

Не, я имею в виду, область какая? smile

323

(21 ответов, оставленных в Problems)

chum
Ну для 1500 с логарифмом точно пройдёт.
А что за область? smile

324

(21 ответов, оставленных в Problems)

Alexey
Точно smile Пусть первая вершина в (0;0), вторая - в (x;y), тогда третья должна получаться поворотом вектора (x;y) на 60 градусов, и в результате неизбежно появится sqrt(3).

325

(6 ответов, оставленных в Feedback)

AlexErofeev
Исправил. Вообще этот алгоритм висит у меня "under investigation". Конечно, за линейное время он точно не работает. Но есть подозрение, что и за время N M тоже, т.е., возможно, есть тесты, на которых он работает экспоненциально. Как найду время, постараюсь решить этот вопрос.

Правда, это не отменяет того, как хорошо он отрабатывает на практике, особенно в задаче максимального потока минимальной стоимости.