1

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

В условие вроде немного по другому написано:
На i-м ходу надо не i камушков брать, а выбирать любую кучку с номером i, где Si >= i и взять оттуда i камушкев.
Т.е. получается: из i-й кучки можно взять ровно i камушков.
Тогда для каждой кучке можно посчитать сколько раз используя ее можно сделать ходов - cnt_i = [S_i / i] (целочисленное деление с округлением вниз).
Тогда очевидно, что если sum(cnt_i) четное, то выигрывает второй игрок, иначе первый.

2

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

Можно динамикой попробовать:
Состояние: dp(i) - минимальное количество символов, которое надо удалить, чтобы покрыть префикс строки длины i словами из словаря.
База: dp(0) = 0
Переходы: для i пробовать каждое слово из словаря j - удалять с конца минимум символов, чтобы это слово можно было вставить (жадно идя с конца): dp(i) = min(dp(k) + i - k - word(j).length(), j = 0 .. word.size() - 1)
Что-то такое.
Сложность получится N^2 * M.

3

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

nlast == cur

4

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

А по ограничениям нормально? Точно не больше 22 вершин?

5

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

Можно такую динамику:
f(n, last) = count - количество таких разложений в сумму степеней двоек, что последнее из слагаемых last. Тогда ответ сумма по last для n.
Рекуррентность такая: f(n, last) = sum(f(n - last, i), i <= last и i - степень двойки), база динамики: f(2^i, 2^i) = 1.
Можно ускорить ДП, если считать не количество разложений, что последнее из слагаемых last, а количество разложений, что последнее не больше last.


*Ну и вторым параметром можно просто степень двойки сохранять, а не само число. Сложность будет что-то типа O(N * log(N))

6

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

А итоговое бинарное дерево должно быть ориентированно от корня? или какую роль играет вообще ориентация этого графа? есть ли в нем циклы?

7

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

Тест:
Количество вершин = 7, количество ребер 6
Граф:
1 - 2
2 - 3

4 - 5
5 - 6
6 - 7
7 - 5

Вершин со степень 0 нет, количество ребер = количество вершин - 1.
Без проверки на связность видимо никак.

8

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

Можно заюзать Декартово дерево http://e-maxx.ru/algo/treap :
Можно представить например все числа так: сначала идут те, которые на четных позициях, а затем те которые на нечетных позициях.
И при запросе на своп элементов на отрезке l..r, считать индексы нечетных чисел oddL, oddR и четных evenL, evenR, затем разбивать весь массив на часть prefix evenPositions(evenL, evenR) middle oddPositions(oddL, oddR) suffix и затем мерджить это в нужном порядке prefix oddPositions(oddL, oddR) middle evenPositions(evenL, evenR) suffix.
А сумму считать за два запроса, sum(oddL, oddR) + sum(evenL, evenR).

9

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

Вот тут метод отжига касательно именно этой задачи http://rain.ifmo.ru/cat/data/theory/uns … rticle.pdf
Может поможет.

10

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

Для случая n = 3: http://www.e-olimp.com/problems/482

И две очень похожие (помимо 1х2 добавленно по одному элементу еще, но это не сложно модифицировать, чтобы сдать):
http://acm.sgu.ru/problem.php?contest=0&problem=131
http://contester.tsure.ru/index.php?pag … EditID=195

11

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

A = a * 10^X = 10^(lg(A) - floor(lg(A))) * 10^floor(lg(A))
a = 10^(lg(A) - floor(lg(A)))
вместо 123456 получиться 1.23456 * 10^5

Ответ соответственно будет floor(a * 10^(k - 1))

12

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

Если ничего не напутал, то:

1) В каждой строке, как и в каждом столбце может стоять только одна конеладья. (k в таком случае будет порядка min(n, m))
2) На то ставить ли нашу конеладью в очередную клетку влияют только:
   а) занятые столбцы
   b) занята ли строка
   c) где в в предыдущих двух строках расположены конеладьи (таких 2 штуки максимум из-за п. 1)

тогда можно сделать что-то типа такого:
dp[i][usedColumns][where1][where2][cnt]
количество способов расставить cnt конеладьей на первый i строках, с учетом того, что заняты столбцы соответствующие маске usedColumns и в предыдущей строке конеладья находится в столбце where1 (0 - если ее там нет, и 1..n есть), и where2 где находиться конеладья в предпредыдущей строке.
ответ будет sum(dp[n][mask][i][j][k] по всем mask, i, j)

Сложность получается порядка m * 2^n * k * n * n * n = m * 2^n * n^4. Думаю должно пройти.

13

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

http://www.cplusplus.com/reference/clib … rt/assert/
http://www.cplusplus.com/reference/clib … ib/malloc/

Задача №360 там: http://contester.tsure.ru/index.php?pag … EditID=606 (нужна регистрация)

char s[10];
while(scanf("%s", s) > 0)
{
}

16

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

Ну впринципе ниже написано, что:
Теорема Лившица-Кладова

Теорема Лившица-Кладова утверждает, что перестановочный приём применим для следующих функций штрафа и только для них:

    * Fi(t) = Ci t + Bi
    * Fi(t) = Ci eA t + Bi, где A > 0
    * Fi(t) - монотонно возрастающие функции
А какие функции получаются: Fi(t) = (t > Deadline_i) * штраф_i, то они монотонно возрастающие, что вроде бы подходит.

17

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

2mincer,
"В разборе написана вот такая формуала:":
Допустим надо посчитать матожидание E[x], количество шагов, что мы куда-то дойдем из вершины X, для простоты положим, что у нас ациклический граф. Пусть из нее исходит набор дуг, скажем в Y1, Y2, Y3 и вероятности переходов p1, p2, p3. И обозначим за P[X, steps] - вероятность дойти куда надо из X за steps шагов. Ну и для простоты положим, что пути максимум длины 2.
Тогда будет что-то такое:
E[x] = p1 * P[Y1, 0] * (1 + 0) + p1 * P[Y1, 1] * (1 + 1) + p1 * P[Y1, 2] * (1 + 2) +
p2 * P[Y2, 0] * (1 + 0) + p2 * P[Y2, 1] * (1 + 1) + p2 * P[Y2, 2] * (1 + 2) +
p3 * P[Y3, 0] * (1 + 0) + p3 * P[Y3, 1] * (1 + 1) + p3 * P[Y3, 2] * (1 + 2)
Теперь несколько упростим выражение (разделим его на части, где наш текущий щаг (1 + ), и ту часть которую мы прошли после того, как перешли по ребру)
E[x] = p1 * P[Y1, 0] * 1 + p1 * P[Y1, 1] * 1 + p1 * P[Y1, 2] * 1 +
p2 * P[Y2, 0] * 1 + p2 * P[Y2, 1] * 1 + p2 * P[Y2, 2] * 1 +
p3 * P[Y3, 0] * 1 + p3 * P[Y3, 1] * 1 + p3 * P[Y3, 2] * 1 +

p1 * P[Y1, 0] * 0 + p1 * P[Y1, 1] * 1 + p1 * P[Y1, 2] * 2 +
p2 * P[Y2, 0] * 0 + p2 * P[Y2, 1] * 1 + p2 * P[Y2, 2] * 2 +
p3 * P[Y3, 0] * 0 + p3 * P[Y3, 1] * 1 + p3 * P[Y3, 2] * 2;

Теперь во второй части, вынесем p1, p2, p3:

E[x] = p1 * P[Y1, 0] * 1 + p1 * P[Y1, 1] * 1 + p1 * P[Y1, 2] * 1 +
p2 * P[Y2, 0] * 1 + p2 * P[Y2, 1] * 1 + p2 * P[Y2, 2] * 1 +
p3 * P[Y3, 0] * 1 + p3 * P[Y3, 1] * 1 + p3 * P[Y3, 2] * 1 +

p1 * (P[Y1, 0] * 0 + P[Y1, 1] * 1 + P[Y1, 2] * 2) +
p2 * (P[Y2, 0] * 0 + P[Y2, 1] * 1 + P[Y2, 2] * 2) +
p3 * (P[Y3, 0] * 0 + P[Y3, 1] * 1 + P[Y3, 2] * 2);


P[Yi, 0] * 0 + P[Yi, 1] * 1 + P[Yi, 2] * 2 -- это мат-ожидание дойти куда надо из Yi. Перепишем выражение с учетом этого:


E[x] = p1 * P[Y1, 0] * 1 + p1 * P[Y1, 1] * 1 + p1 * P[Y1, 2] * 1 +
p2 * P[Y2, 0] * 1 + p2 * P[Y2, 1] * 1 + p2 * P[Y2, 2] * 1 +
p3 * P[Y3, 0] * 1 + p3 * P[Y3, 1] * 1 + p3 * P[Y3, 2] * 1 +

p1 * E[Y1] + p2 * E[Y2] + p3 * E[Y3];

Теперь посмотрим на первую часть -- там сумма вероятностей по _всем_ возможным путям из X до "куда надо дойти", а сумма вероятностей по всем путям = 1
Получаем:
E[x] = 1 + p1 * E[Y1] + p2 * E[Y2] + p3 * E[Y3];




"Еще одна задача, на этот раз с NEERC 2006": Там dp'шкой можно решить, состояния это набор связных компонент, если одна компонента, то E = 0, если несколько, то если добавлять ребро между компонентами, то понятно, как, просто по той формуле, что в картинке, а если ребро в самой компоненте, то получается петля, ее нужно разрешить: скажем у нас С ребер которые мы можем провести и они лежат в какой-то компоненте, а E' = sum(E[состояние после соединения вершин ребром, которые в разных компонентах]), тогда матожидание для всех ребер будет E = 1 + E' + E * p * C => E = (E' + 1) / (1 - C * p)
Вот как-то так.

18

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

http://e.imagehost.org/view/0381/algo вот иллюстрация небольшая.
*Смотреть сначала в первой колонке сверху вниз, а потом во второй сверху вниз.

19

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

Возможная идея решения:
1. Зафиксируем какой-то отрезок, тогда каждая параллельная прямая будут давать геометрическое место вершин, которые будут образовывать с отрезком треугольники одной и тойже площади (S = 0.5 * a * h_a). Видно что из таких параллельных прямых нас интересует ближайшая к нашему отрезку и любая точка на этой прямой.
2. Проведем через все точки вертикальные прямые и найдем их порядок, далее будем вращать прямые вокруг точек, их порядок поменяется в случае, когда две какие-то прямые совпадут (на этой прямой будет расположен какой-то отрезок) - эти две прямые просто поменяются местами после совпадения при вращении дальше.
3. Сделаем события -- отрезок, и упорядочим их по углу накланной прямой проведенной через этот отрезок и будем просматривать их в этом порядке. Будем обходить события, поддерживая текущий порядок прямых.
При событии - меняем две соответствующие прямые, а также смотрим первые несовпадающие по одну сторону от прямой и по другую сторону от прямой ((в текущем порядке), для каждого отрезка вершина с минимальной площадью будет лежать на одной из этих прямых - выберем из них минимум для этого отрезка, а затем и минимум по площадям для каждого из отрезков и получим ответ.

20

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

Необходимо посчитать площадь покрытия двумя кругами и сравнить с s (которое дано в условие, оно может отличаться от площади одного из кругов).

21

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

2 2rf, pair'ы сравниваются не только по первым элементам, а сначала по первым, а в случае равенства их - по вторым. make_pair(1, 2) < make_pair(1, 3)

22

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

Поток с ограничениями на нижнии пропускные способности нужен (http://e-maxx.ru/algo/flow_with_limits).

23

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

Число является полным квадратом, если каждый простой делитель его входит в него с четной степенью.
Разложим все числа Ai на простые делители, тогда нас будут удовлетворять те подмножества чисел, у которых по каждому из простых делителей суммарная степень - четная.
Тогда получаем систему уравнений по модулю 2:
Переменные это x1, .., xn -- используем число или нет, а уравнение это для каждого простого числа p_i сумма по j = 1 .. n: степень p_i в числе a_j * x_j = 0.

Количество решений этой системы минус 1 (это то что непустых множеств) будет ответом задачи.
Количество решений это 2^(n - rankA), где rankA - это ранг матрицы соответствующей системе.

24

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

http://en.wikipedia.org/wiki/K%C3%B6nig … _theory%29

25

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

Может имеется ввиду треугольник Паскаля? (подсчет чисел сочетаний)