Правильно ли я понимаю, что завтра в 11.00 (по москве) будет проходить раунд opencup (5 часов)?
№ | Пользователь | Рейтинг |
---|---|---|
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 |
Правильно ли я понимаю, что завтра в 11.00 (по москве) будет проходить раунд opencup (5 часов)?
Название |
---|
апну тему, ибо вопрос остался, и если это так — пусть этот посту будет небольшим напоминанием.
PS вопрос снят, уже появялся интерфейс Саратовского гран-при, предлагаю после раунда обсудить задачи тут.
А это контест с Петрозаводских сборов? Кто-нибудь знает точно?
да. это с петрозаводских сборов.
Надеюсь, не поздно: но не могли бы вы ссылку на контест оставить? Спасибо.
всем привет! Как решать задачу О? ("Yet another game")
И где можно будет дорешевать?
дорешивание уже открыто на сайте
Мы Гаусса сдали.
Понятно, что нам нужно оставить такое подножество, чтобы XOR любого его подмножества был не равен 0.
Ну окей, давайте каждое число в битовом представлении запишем в столбец, найдем максимальную по сумме (отсортируем их в обратном порядке перед построение матрицы) ЛНЗ систему столбцов и их будем оставлять второму игроку. Следовательно, первому нужно убрать все остальные.
Код: http://pastie.org/3413601
А кто-нибудь решение M не за K^2 знает?
Не понятно, а что такое ЛНЗ система столбцов? И почему отсортировав в обратном порядке, ответ будет минимален?
ЛНЗ: http://bit.ly/A7HqCW
А про жадного Гаусса Швед вот тут рассказывал: http://www.intuit.ru/department/algorithms/algoconstran/1/
как надо было решать dna-sequences(div.2)?
Я делал так: Представим, что каждая цепь — это вершина графа. Какая-то часть цепей будет сверху, а какая-то снизу. Цепи на одной стороне не пересекаются.
Выходит, что надо разделить граф на две доли, где ребра будут только из одной доли в другую. Делить вершины на двудольный граф можно дфс'ом, там же и проверить на возможность это сделать. Просто если есть цикл нечетной длины, то impossible.
надо ли явно строить граф? и это разве не K^2?
UPD. Можете код показать?
я строил не явно и прошло. После того как прошло, я забил на задачу. А как писать более умное решение?
код
ну вообще это решение тлится, вот ваш код (в него я вставил генератор теста) и он на сервере не успевает отработать
ok, а как надо было решать?
У нас было такое решение, но мы не успели додебажить: заметим, что если дуги расположить можно, то и набор дуг сверху и набор дуг снизу по отдельности образуют две "скобочные последовательности". Заведём под каждую стек, заведём массив, где по номеру отрезка можно найти его координаты и другой массив на 20000 элементов, где для координаты будет храниться пара — номер начинающегося/заканчивающегося отрезка и признак его начала/конца. Идём по этому массиву. Если встретили начало отрезка, пробуем пихнуть его сначала наверх, потом вниз. Если не получается — построить систему дуг невозможно. Пихнуть можно, если конец данного отрезка имеет координату меньшую, чем конец отрезка на вершине стека. Пока не знаю, правильно ли это решение.
У меня не зашло, WA#2. Впрочем, это писалось за 10 минут до конца, и я мог набажить.
Извините, ошибся, у меня было немного по другому
Как показывает дорешка, возиться с неявным графом не стоило.
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
if (i != j)
if (x[i] > x[j] && x[i] < y[j] && y[i] > y[j]) {
g[i].pb(j);
g[j].pb(i);
}
Круто, чо)
а жадно нельзя решить? запоминать в дереве отрезков концы верхних дуг и концы нижних?
Круто! 120 * 10000 ^ 2 — всего 12 миллиардов. Я даже специально написал вопрос жюри, нет ли каких дополнительных ограничений. Успех)
Главное — вера! ;)
Во, а как вы сдали? :)
Мы никак не сдали, в том-то и дело. А так бы выиграли.
А, тогда обидно. Вы быстрее решение писали или у вас квадрат не зашёл?
У меня даже в мыслях не было писать за квадрат.
У нас таких тестов не было ©
Да это стандартная, к сожалению, для див-2 задач ситуация, когда мульти-тесты крайне слабые.
Небольшое исследование показало, что k в тестах не больше 2000, суммарно по тестам — не больше 12000.
Без комментариев :D
Мы решали М так:
Отсортируем все отрезки по их началу. Заведем 2 стека — нижние и верхние дуги, для каждой дуги будем хранить ее конец.
Для каждого отрезка надо сначала доставать из стека те дуги, которые закончились раньше его начала. Затем пытаемся провести дугу с той стороны, где координата на вершине соответствующего стека меньше. Если так сделать не удается, то пытаемся провести дугу с другой стороны.
Если получается, то заносим в стек координату новой дуги (по нашему алгоритму она всегда будет наименьшей из всех координат в стеке). Если не получается ни с одной, ни с другой стороны, то провести дугу невозможно и надо выдать "impossible".
Для того, чтобы не обрабатывать отдельно случаи пустых стеков, я в каждый стек добавил по очень большому числу в конец.
Данное решение работает за один пробег по циклу, каждый отрезок 1 раз кладется в стек и достается из него, то есть асимптотика алгоритма O(K)
И зашло?
У нас первый АС по М =)
Это верно, так как каждый отрезок мы сравниваем лишь с двумя отрезками, начало у которых лежит раньше текущего. И если они кончаются раньше, чем текущий, то очевидно, что дугу без пересечения провести не получится.
-
Как программа определит в какой стек кидать вторую дугу (в порядке возрастания начал), в таких тестах: 3 0 4 1 3 2 5 Решение: (([))] и 4 0 6 1 3 2 5 4 7 Решение: ([(][))]
Мда, 2 тест валит мою программу... Что еще раз доказывает недотест в задаче М.
кто-нибудь покажите код задачи AZ, сделал за O(|S|*26), но ТЛ7 не уходит.
Значит сложность не O(|S|*26) (или константа неоправданно большая). Я тоже делал за O(|S|*26) -- и ВА49 как бы намекает, что такая сложность должна заходить по времени.
У нас на контесте было WA50 и WA52. Похоже, эти тесты связаны с неправильной обработкой больших ответов.
если кому интересно, вот код зашел с первого раза. Правда там некоторый изврат с определением переполнения, а так вполне понятно =)
да... переполнение это конечно беда, но log10 тащит!)
Как решать J?
Подвешиваем дерево за 0 вершину. Раздваиваем каждую вершину еще одной фиктивной с временем дохода до нее равным 0 и временем обработки di (чтобы обработку текущей вершины тоже считать как обход поддерева). Подсчитаем суммарные ki и суммарные времена обработки ti каждого из непосредственных поддеревьев. Пусть vi = ki / ti. Тогда нетрудно показать мы должны обходить деревья в порядке от больших vi к меньшим.
Странно, писали вчера этап в дополнительное время, сегодня в мониторе были видны, а сейчас ни в мониторе, ни в рейтинге нас нет)
как решать Е?
Пишем перебор для мелких n и k=b/a (с помощью
map<vector<int>, bool>
), распечатываем ответы, находим закономерность.Ну или тупая эмуляция.
я просто хотел узнать обоснованное решение...
Заметим, что конечное состояние всегда одинаковое. Тогда посчитаем сколько останется пустых стаканов: q = b div a; сколько стаканов можно перелить в один стакан Теперь посчитаем сколько всего будет непустых стаканов. w = n / q + (n%q ? 1 : 0) Ну и теперь проверим на четность n — w; Если нечетно, то победил первый.
конечное состояние всегда одинаковое?
n = 5, a = 1, b = 4, то 2 варината как минимум
1 1 1 1 1
1) 2 1 1 1
2) 2 1 2
1) 3 2
либо
1 1 1 1 1
1) 2 1 1 1
2) 3 1 1
1) 4 1
не?
Высота дерева игры всегда одинаковая.
важно понять, что они по сути эквивалентны.
А вот с этого момента пожалуйста поподробнее.
Пример: n = 6, a = 1, b = 3. Возможны два конечных состояния: 2 2 2 и 3 3. Соответственно будут и разные выигрывающие игроки.
Да, написал полный бред.
Во-первых, заметим, что если от b отнять остаток от деления на a, то ответ не изменится, т.к. этот остаток все равно нельзя ничем заполнить. теперь b делится на a, поделим b на a и заменим a на единицу. Понятно, что ответ все еще остался тем же. Теперь один из игроков может использовать следующую стратегию: каждым своим ходом делать так, что во всех стаканах, кроме полностью заполненных и возможно одного стакана будет налита 1 единица жидкости. Это можно делать следующим образом: после первого хода это верно. Дальше если на нашем ходу свойство выполняется, то возможно 2 варианта: 1) во всех стаканах по 1, тогда просто сливаем любые два стакана. Свойство не нарушилось. 2) в одном стакане не единица (заполненные мы не рассматриваем). Дольем в него из любого оставшегося стакана. Теперь противник может либо сделать аналогичный ход и не нарушит свойство, либо он может слить две единицы, тогда могут быть 2 варианта: 1) в недозаполненный стакан можно долить 2 единицы жидкости. Тогда просто доливаем и восстанавливаем свойство. 2) в недозаполненный стакан можно долить только 1 единицу жидкости. Тогда либо мы уже проиграли(тогда стратегией может воспользоваться другой игрок) либо остается еще одна единица, которой можно заполнить этот стакан и убрать его из рассмотрения, оставшиеся стаканы удовлетворяют описанному свойству. В итоге вся жидкость будет находиться в (n+b-1)/b стаканах, а значит всего в любом случае было сделано n-(n+b-1)/b ходов. Четность этого числа и определяет того, для какого игрока эта стратегия приводит к выигрышу.
хм... нетривиальное доказательство, куда проще было написать какое-либо быдло-решение... спасибо за объяснение
Помогите понять почему получает WA2 такое решение на задачу M:
Заведем массив размера 2 * N, где для каждого начала будем хранить его конец, допустим массив t. Также в булевском массиве used будем хранить в ячейке начала каждого отрезка false если еще не взят никуда и true иначе. Также все концы пометим true чтобы отдельно их не рассматривать. Решаем рекурсивно — сначала запускаемся от всего отрезка
calc(0, 2 * N - 1)
и бежим по нему циклом, если встретили начало отрезка и он не помечен и он полностью лежит в текущем, то помечаем его, что он взят и запускаемся от негоcalc(i, t[i])
, иначе если его конец лежит дальше конца текущего отрезка, то увеличиваем некий счетчик cnt. Запускаем данный алгоритм 2 раза, если после вторго раза счетчик cnt не равен нулю то мы не смогли взять некоторые отрезка — ответ impossible, иначе — possible.Если кому-то не лень, то расскажите в чем ошибка...
Это цикл из метода calc. Мне кажется, что здесь должно быть i = l.
нет, в l-ой позиции начинается текущая дуга поэтому надо начинать l + 1
спасибо за заметку, в решении такого не предпологалось просто скопировал в pastebin криво. пофиксил — for(int i = l + 1; i < r; i++). Но тем не менее, меня больше интересует корректен ли алгоритм впринципе или это все таки ошибки в реализации, кототорые я возможно перестал замечать?
I don't understand task N, so can you explain me what was task about? thanks.
Расскажите пожалуйста идею решения задачи I
Выложил видео разбора задач контеста Саратова в Петрозаводске на ютуб:
Ссылка
Мне кажется хорошо бы если выкладываешь в паблик адекватно называть ролик (например, "2011-2012 Зимние Петрозаводские сборы, контест Саратовского ГУ (открытый кубок), разбор задач") и расставить теги. Просто через годик-другой ссылка потеряется, наплодится еще роликов с похожими именами и трудно будет найти то, что нужно.
в разборе ссылкой выше есть такой момент: "нужно найти цикл минимального веса, это можно сделать Флоидом, так как вершин не очень много".
А как искать минимальный цикл Флоидом? Или как это делать вообще?
UPD: Ну, я знаю только так: удалим любое ребро (v,u), найдем Дийкстрой кратчайший путь в новом графе от v к u
для каждого ребра лучший ответ — это длина ребра плюс расстояние от конца ребра до начала
можете по подробней, и код если можно покажите
для каждого ребра a->b найдем длину цикла минимального веса, который через него проходит. В этом цикле после ребра a->b будет идти путь из b в a, который уже посчитан флойдом. Выберем лучший результат для каждого ребра. http://pastebin.com/VHJwdc3C
как я понимаю, в общем случае это работает только для ориентированного графа?
Да, этот алгоритм только для ориентированных графов. Но для неориентированных это тоже можно сделать за N^3. Для каждой вершины v делаем следующеее: запускаем из v алгоритм дейкстры, который формирует дерево кратчайших путей. теперь перебираем все ребра, которые не вошли в это дерево и для каждого ребра u->v считаем величину w(u->v)+d[u]+d[v] (w — вес ребра, d — массив кратчайших расстояний). Таким образом найдем цикл минимального веса.
либо я что то не понимаю, либо это не работает (скорее всего конечно 1е), но ведь путь до вершины u и вершины v может пересекаться и мы этот участок учтем дважды, например на графе:
1 2 1
2 3 1
2 4 1
4 5 1
3 5 4
после запуска дейкстры из первой вершины, например...
или фишка в том, что мы позже найдем ответ?
да, если пути пересеклись, значит это точно не оптимальный вариант, а хуже от этого не станет.
Инициализируем матрицу расстояний d следующим образом: вершина a видит вершину b, если отрезок их соединяющий не пересекает ничего плохого и b находится по часовой стрелке от a, тогда d[a][b] = dist(a,b), во всех остальных случаях (включая a = b) d[a][b] = inf. Запускаем обычного флойда. Величина наименьшего цикла — минимум среди значений d[i][i].
а вы сейчас написали общий алго или к конкретной задаче про ежи?
Если это общий, то что за плохое и хорошее?
Если это к задаче С, то получается в общем алгоритме нам нужно запустить флоида в матрице с ребрами и остальными значениями равными бесконечности и ответ будет минимум на глав.диагонале?
UPD: кажется я понял, это для задачи С. Если граф ориентированный, то ответ найдет правильно. А если граф неор., то цикл может найтись типа "1-2-1"
кто в задачи про палиндромы (Д) прошел 4 тест, подскажите, в чем его хитрость?
В архиве Петрозаводска четвёртый тест такой:
4
abcdef
edc
baxyzprq
pzyx
Да, только хотел написать, что понял как его пройти, но все равно спасибо