Сегодня, в 14.00, состоялась шестая командная олимпиада на neerc. Предлагаю здесь обсудить задачи.
№ | Пользователь | Рейтинг |
---|---|---|
1 | jiangly | 3976 |
2 | tourist | 3815 |
3 | jqdai0815 | 3682 |
4 | ksun48 | 3614 |
5 | orzdevinwang | 3526 |
6 | ecnerwala | 3514 |
7 | Benq | 3482 |
8 | hos.lyric | 3382 |
9 | gamegame | 3374 |
10 | heuristica | 3357 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 168 |
2 | -is-this-fft- | 165 |
3 | atcoder_official | 161 |
3 | Um_nik | 161 |
5 | djm03178 | 157 |
6 | Dominater069 | 156 |
7 | adamant | 154 |
8 | luogu_official | 152 |
9 | awoo | 151 |
10 | TheScrasse | 147 |
Сегодня, в 14.00, состоялась шестая командная олимпиада на neerc. Предлагаю здесь обсудить задачи.
Название |
---|
Кто-то знает как делать H без переборов и пропихов?
Сделаем двоичный поиск.
Теперь нужно проверить, можно ли взять k человек из двудольного графа, чтобы между взятыми не было ребер. Это независимое множество. Известно, что независимое множество это дополнение вершинного покрытия. Нужно найти максимальное независимое множество -> минимальное вершинное покрытие. Мощность минимального вершинного покрытия в двудольном графе, как известно, равна максимальному паросочетанию.
Нужно еще уметь восстанавливать ответ.
Это делается, наподобие такого:
Будем удалять по точке, и проверять что функция от оставшихся изменилась на нужную величину?
Что именно? Поиск минимального вершинного покрытия?
Ой, восстановление ответа.
Например, можно так:
Рассмотрим все вершины, в каждой доле вершины поделим на два типа: у которых есть пара и у которых нет.
Теперь возьмем все вершины из левой доли, у которых нет пары. Узнаем, какие вершины достижимы из этих. Из правой доли возьмем вершины, которые достижимы, а из левой те, которые не достижимы. Можно понять, что их будет сколько надо.
Ну а ответ — это просто все вершины, которые не входят в минимальное вершинное покрытие.
Спасибо.
кто-нибудь может рассказать нормальное решение Д?
Думаю, тут наиболее понятно будет, хотя у меня зашло и более простое(но не могу доказать, почему верное):
делаем ленивую ДП(Х,У,кто ходит): — при входе ставим что еще считаем ее
— если есть ход в проигрышную позицию, то ответ выигрышная
— если есть ход в ничью, то ответ ничья, при отсутствии хода в выигрышную
— ход в позицию которая еще не до конца обработана = ничейная позиция(то место, которое меня смущает)
не очень понятен последний пункт, куда ход?
наврал
А вдруг та позиция выйгрышна, а мы того еще не знаем?
Как решалась задача І?
там формула выводится. можно заметить что искомая площадь будет площадью n-угольника минус суммарная площадь лишних маленьких треугольников. если сделать рисунок — будет сразу видно. То есть через данный радиус описанной окружности (R = 10 м)найдем сторону n-угольника, а дальше все несложно находится(так как многоугольник правильный) . ну и формула площади треугольника через 2 стороны и и синус угла между ними
а как решались A и J?
В А:
будем перебирать 2 числа 1е и 2е, потом перебирать с конца середину палиндрома и искать перевернутое начало, откинув середину. Аналогично потом делаем с 2м и 3м числом, так-как нужно зафиксить большую часть палиндрома, эти случаи все покрывают, выходит что-то типа О(N*N*Len*Log(N)) с маленькой константой.
В J:
Тут нужно для кажого И — найти А(и) так что-бы отрезок А(И)..И не содержал в себе равных чисел. А дальше будем бин поиском искать отрезки которые нам подходят и лежать полностью, и те которые частично перекрываются с началом и концом: главное что нужно не забыть, что если i A[i]<=A[j].
J: посчитаем массив p[i] — максимальный индекс, такой что на отрезке [i..p[i]] нет повторяющихся, понятно, что при увеличении i p[i] не уменьшается.
посчитать p[i] можно поддерживая левый указатель — i, правый — r и сет отрзезка [i..r], при переходе из i в i+1 удалять из сета a[i]. когда стоим в каком-то i, двигаем r пока можем — пока в отрезке не встречаются повторяющие (проверяем с помощью сета).
построим теперь дерево отрезков для максимума: в ячейке i храним p[i] — i + 1, т.е длину
ответ на запрос [Lq;Rq] делаем так: так как p[i] <= p[i + 1] <= p[i + 2]... найдем бинпоиском такое r, что p[r] <= Rq, а p[r + 1] > Rq на отрезке [Lq, r] найдем максимум.
теперь надо обработать отрезки, которые частично пересекаются, очевидно, что проверять элементы с индексами j (j < Lq), нет смысла, т.к. p[Lq] >= p[j] (опять же), и [Lq..p[Lq]] имеет не меньшее пересечение с отрезком запроса, чем [j..p[j]]. стоит проверить только отрезок [r + 1..p[r + 1]], отрезки [r+2;p[r + 2]], [r+3;p[r+3]]... нет смысла проверять (по той же причине p[r + 1] <= p[r + 2]), отрезок [r + 1..p[r + 1]] будет наибольшее пересечение с запросом