Только что закончился ГП Балтики. Как решать нормально задачи A, B и F? А то мы давно столько всякой фигни не пихали, как сегодня.
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 4009 |
2 | jiangly | 3823 |
3 | Benq | 3738 |
4 | Radewoosh | 3633 |
5 | jqdai0815 | 3620 |
6 | orzdevinwang | 3529 |
7 | ecnerwala | 3446 |
8 | Um_nik | 3396 |
9 | ksun48 | 3390 |
10 | gamegame | 3386 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 167 |
2 | Um_nik | 163 |
3 | maomao90 | 162 |
3 | atcoder_official | 162 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 157 |
8 | TheScrasse | 154 |
9 | Dominater069 | 153 |
9 | nor | 153 |
Название |
---|
Смотря что считать нормально по В. У нас поток со шафлом ребер если не куда надо все пришло
Забавно, у нас то же самое, только у вас +, а у нас +16 :)
Сид 239 рулит :)
А вы какое d выбрали?
У нас все тесты в квадратике 3 * 3 проходят максимум за 0.930 c
У нас тоже d = 3, работает за 1.6 с сидом 42424243.
UPD, ой я неправильно тебя прочитал. На всех тестах мы не запускали, тестировали только на сервере.
У кого-нибудь получилось запихать отжиг в F?
У нас быстро зашел перебор с отсечением по ответу и предварительной сортировкой массива.
В F у pashka довольно простое решение — динамика по подмаске, которая минимизирует число стопок, а при равенстве — сколько в последней стопке
Да, мы уже поняли, действительно очень просто. Мы что-то затупили и запихали что в этой задаче, что в A, решение за 3n с кучей разных хаков.
Can you give me the code of the solution?
Можно даже просто для маски минимизировать сколько всего набрано. Этим однозначно определяется сколько стопок и сколько осталось в последней стопке, и соответственно добавим ли мы новый в эту же стопку или уже перейдем в следующую.
F: Dynamic programming d[mask] = (minimal number of subsets one can split mask into, minimal sum in the last subset).
A: Define convolution conv(d)[mask] = sum {d[x] | x is submask of mask}. One can calculate conv and conv^-1 in O(n2^n). Let clique[mask] = 1 if mask is clique, 0 otherwise. One need to check conv^-1(conv(clique)^a * conv(antilclique)^b)[full mask] != 0 -- then one can split graph in no more than a cliques and b anticliques. This can be done in O(n2^n) overall.
Can you explain in detail, why "conv^-1(conv(clique)^a * conv(antilclique)^b)[full mask] != 0"?
"conv^-1(conv(clique)^a * conv(antilclique)^b)[full mask]" is a number of ways to choose (not necessarily distinct, possible intersecting) a cliques and b anticliques covering entire graph (i.e. all vertices).
For the fixed a and b, I can calculate conv^-1(conv(clique)^a * conv(antilclique)^b) in O(n2^n) easily. But how to make it O(n2^n) overall?
You can use two properties of the problem to speed it up: 1. in a row (or a column) ones will form an interval 2. you only need last element of conv^-1(...), not the entire result
Minor addition to ikatanic answer: last element (in fact, any single element) of conv and conv^-1 can be calculated in O(2^n).
Could you please give some more details or your code for F.
Как адекватно решать I? Глупое решение вроде как экспоненциально работает. У меня была лишь идея, что для подпрограммы запустим X рандомных входных стэков и посмотрим как на них воздействует подпрограмма (на какой глубине произойдет последнее изменение, маска как на этот элемент повлияют верхние, константа и какие сверху еще добавятся). Такую ересь не успели написать. Подозреваю, что есть решения намного проще
Подпрограмма сводится к листу булов (снимаем последний элемент со стека и добавляем или вычитаем из предпоследнего), delta (добавляется к последнему после выполнения листа булов) и листу интов (кладутся на стек)
I solved I using matrix multiplication. I took a 11x11 matrix (10 stack variables and 1 constant). Then, putting a digit on stack, +, — every thing can be represented as a 11x11 matrix.
Also each of the sub-routine is a matrix.
It made my solution simpler.
Давай для каждой каждой подпрограммы посчитаем, как она повлияет на стек. В общем случае, каждая подпрограмма берёт стек величины k и возвращает стек величины l, в котором элементы являются какими-то линейными комбинациями элементов исходного стека, возможно с некоторыми прибавленными константами. Будем для каждого k прямо хранить коэффициенты всех этих линейных комбинаций; тогда последовательное применение двух подпрограмм выражается в таком же виде с помощью чего-то сродни перемножению матриц (на самом деле, можно явно выписать матрицы, которые перемножаются).
Сделаем ветор-столбец, в котором будем хранить 6 вариантов стека для каждого размера (от 0 до 5), размер текущего стека и единичку (пригодится потом). Тогда операции можно выразить в матричном виде: при запихивании матрица будет из стека размера (i — 1) перекидывать элементы в размер (i), а последний элемент получить умножением нашей единички на добавляемый элемент, а ещё прибавляем единицу к размеру. Операции сложения и вычитания делаются аналогично. Тогда каждая программа будет матрицей и можно применять ее за 17^3. Итого асимптотика O(|s|*17^3).
Есть альтернативное решение. Обозначим за d числа на стэке, s – знаки.
Тогда d1 d2 s заменяется на d3 = (d1 s d2).
d1 s1 d2 s2 заменяются на d3 s3, которые легко считаются для разных s1 s2.
Будем просто раскрывать программу и делать замены. Если в какой-то момент длина стала больше > 20 (хватает с запасом), то говорим, что эта программа невалидная и все, кто ее используют тоже невалидные и больше их не анализируем.
В результате итоговая программа будет содержать просто d1 .. dn
Наивное решение делается в два этапа. На первом этапе вычисляем простой текст всех подпрограмм во всех контекстах и просто сохраняем как строки. На втором этапе выполняем простой текст полученной программы. Действительно, это решение построит экспоненциально длинный простой текст для программы вида
[9+]a[aaaa]a[aaaa]a...[aaaa]a9a
. При длине строки до 160 ответ ещё помещается вint64
, но такое решение не выполняет ограничения по времени и памяти.Для быстрого решения заметим, что все операции со стеком можно представить в виде матриц 6 × 6:
Здесь (s0, s1, s2, s3, s4) — исходный стек, начиная с верха, (t0, t1, t2, t3, t4) — результирующий стек, начиная с верха, а шестая строка служит для прибавления и вычитания константы. Примеры:
Видно, что для константы пропадает старый пятый сверху элемент стека, а для арифметической операции заводится новый пятый сверху элемент стека, тождественно равный нулю. Так что такое представление, конечно, работает только для ограниченного по размеру стека.
Последовательное применение операций X и Y соответствует матрице X, умноженной слева на матрицу Y. Решение состоит в том, чтобы вместо простого текста подпрограмм хранить матрицы, соответствующие этим подпрограммам. В конце можно просто взять последний столбец матрицы, чтобы получить вектор, а текущую глубину стека отслеживать вместе с матрицами.
What is the 5th sample for problem I, I try hard on problem I for the last half of contest, but only get WA on test #5. thanks.
It's
[1]b[b[2]bb]ccc
. The resulting stack is (from top)2 1 2 1
. Here, the subprogram isc = "12"
, as per the rules in the statement.Как решать H?
при помощи теоремы Виета расписать и получить, что
где x1,x2 — корни. После этого нужно найти все делители числа n + 1 (и отрицательные тоже) и взять их как x1-1, восстановить коэффициенты p,q и положить их в сет. И не забыть, что для -1 ответ infinity
Ну збс, опять задача на одноразовую теорему, о которой в курсе только задроты-математики.
Я бы рад поддержать, так как математику сам не знаю, но уж теорему Виета не знать, вы серьезно? :D
Еще задроты-математики иногда знают формулу решения квадратного уравнения, которое в данном случае будет целым тогда и только тогда, когда дискриминант (что-то около
Unable to parse markup [type=CF_TEX]
, не помню точно) есть полный квадрат. Дальше дело техники: раскрываем разность квадратов и смотрим делители оставшейся части.
Школьнику Васе из шестого "Б" сейчас очень обидно :(
По A выдумали такое, чтобы считать для каждой маски минимальное покрытие кликами:
Если клики размера три не существует, то нужно покрыть маску только лишь ребрами — такое можно посчитать динамикой по маскам, откусывая младший взведенный и любой другой биты, между которыми существует ребро за O(n2n).
В случае существования клики размера 3 (зафиксируем любые из таких трех вершин) посчитаем сначала динамику на остальных 17 вершинах за 317 с помощью перебора подмасок, выбирая те, что являются кликами. Очевидно, для масок, не содержащих наши 3 вершины, все посчитано верно. А для любой маски, в которой какие то из наших трех вершин содержатся, мощность минимального покрытия либо равна ответу для той же маски без зафиксированных вершин, либо превышает его ровно на 1.
Чтобы проверить, что из этого правда, просто расширим динамику на 17 вершинах, храня дополнительно всевозможные подмножества из 3-х остальных вершин, которые можно покрыть кликами при сохранении минимальности ответа (например, в 23-битовом числе). Теперь для любой маски достаточно посмотреть на расширенную динамику для той же маски, но без 3-х фиксированных вершин, и посмотрев на возможность покрытия нужных вершин, сделать ответ либо равным, либо на единицу большим ответа, посчитанного в динамике.
Can some1 describe a solution for C in details more or less?
Is it possible to see solutions or editorial of this contest ?
If yes, please share link.
I want to see solution of 'F'. problem link is here. Thanks in advance