Закончилась интернет-олимпиада. Скажите, пожалуйста, как решалась в базовой номинации А и 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 | 156 |
8 | TheScrasse | 154 |
9 | Dominater069 | 153 |
9 | nor | 153 |
Закончилась интернет-олимпиада. Скажите, пожалуйста, как решалась в базовой номинации А и F. Мы видимо неправильно поняли условие.
Название |
---|
Я так понимаю, имеется ввиду базовая категория? Обсуждать задачу F еще нельзя, так как она участвует в задачах усложнённой категории (H).
А задача A решается за линейное время: перебираем k сверху вниз. Заметим, что оно подходит тогда и только тогда, когда все элементы ≥ k занимают позиции ≥ k. Будем поддерживать минимальную позицию среди элементов ≥ k, на каждом шаге один раз проверили, что она = k и прорелаксировали.
Да, еще надо, конечно, предподсчитать за линию для каждого элемента его позицию.
Также есть другое решение: скажем, что k подходит, если первые n - k элементов имеют номера ≤ n - k. Делаем всё то же самое, но в другом порядке и не нужен предподсчёт.
Мы бежали с начала массива и поддерживали максимум, если встречали число большее текущего максимума, то выводили. Я до сих пор не понимаю в чем ошибка нашего решения.
По смыслу надо выводить те и только те позиции, максимум в которых совпал с номер позиции. Ваше решение выводит что-то непонятное (точнее, непонятно, какое это отношение имеет к решаемой задаче).
Тест:
спасибо
Как все решали E? Мы писали совсем тупой перебор с передачей вектора состояний мечей и уровня их зарядки и еще текущего времени. На локальной машине это довольно долго работало, но мы решили заслать и получили AC. Это и предполагалось или было что-то более оптимальное?
Мы писали декартово дерево по неявному ключу.
UPD. извините, перепутал задачу
Это в задаче с Mum!???
Да, в ней. Кстати, интересно, как же она решалась без этой структуры?
UPD. Уже прочитал про списки.
Ну да, там ведь сложность будет O(3^(1+2+...+n)).
Задача F решалась так:
Ну емае. Нам это решение давало WA 5.
http://pastebin.com/zLVNaHEj — код.
Я тоже получил WA... Пока не сменил тип на long long ;)
У меня long long все-таки.
kk1 и kk2 тоже должны быть long long. Все-таки C++ сначала компилирует значение справа от '=', а потом только заносит в переменную слева
(._.) epic fail
Подскажите кто-нибудь, как решалась задача "Парад победы" (она была в обоих номинациях)? Верно ли, что при всех n, дающих остаток 2 или 3 при делении на 4, ответ 0? Верно ли, что во всех перестановках, удовлетворяющих условию, количество инверсий равно n * (n - 1) / 4? Заранее спасибо.
Да. Верно. Всего пар n*(n-1)/2. Если сложить инверсии перестановки слева направо, и наоборот, то получим n*(n-1)/2. Значит, количество инверсий в данной перестановке должно быть n*(n-1)/4. Дальше F(i,j) — количество перестановок длины i с количеством инверсий j.
F(1,0)=1 F(i,k)=f(i-1,k)+f(i-1,k-1)+...+f(i-1,k-i+1)
Это выводится, если мы будем перебирать куда ставить 1.
Точно, спасибо.
Как Б решалась? Мне почему-то кажется, что там должно быть что-то проще, чем декартово дерево. Ведь можно как-то использовать, что там будут меняться лишь циклический сдвиг при операции "мум!"?
Мне кажется списки, но очень неприятно писать!
Мы решали двумя связными списками. Первый — первая половина (с округлением вниз), второй — вторая. При добавлении/удалении иногда нужно было перекинуть один элемент в другой список. При операции "мум!" просто меняем списки (указатели на начало/конец) местами..
Этот неловкий момент...
Зато довольно красиво получается)
Решал одним списком. При добавлении/удалении элемента считал средний за O(1). При mum! менял начало и конец списка также за O(1), зная средний элемент.
Один связный список + сохранение первого меча и центрального
Мы писали просто два deque`а, также перекидывали 1 элемент в другой список. Была еще переменная bool, которая отвечала за то, какой список из двух левый, а какой правый. Вот код http://pastebin.com/q4gJSuXy
Как решалась Е? Очень долго думал, но так и не придумал...
Надо было аккуратно написать перебор, разве нет?
Объясни более обширно
Код. Например можно делать так. Храним массив "сколько осталось времени работать i-му мечу", а также массив времен, которое мы могли измерить. На каждом этапе мы можем с каждым из мечей совершить три действия. Перебираем все возможности. Для каждой из них находим время, через которое разрядится какой-нибудь меч. Рекурсивно вызываемся для новых "оставшихся времен работы", и добавив новое время.
Если ни одного мяча не осталось, то время, которое мы можем измерить это разность каких-нибудь из времен, которые есть у нас в массиве. И еще понятно, что если назначить начальное время работы каждому мечу 2^N, то оно всегда останется целым.
Эти контесты в Codeforces::Тренировках:
Я не собираюсь наезжать на жюри (а может просто на кф в тренировках не тот компаратор поставили, или я кривой), тем более описанная ниже проблема все равно бы ничего не изменила (т.к. во время контеста до этого теста решение еще не доходило), но все же хочется спросить.
В задаче С в формате вывода сказано, что ответы должны быть даны с точностью не менее 3 знаков после запятой. Соответственно с этим я подумал, что можно просто все на 10^5 домножать (что в худшем 10^19 — влезает в unsigned long long), чтобы не писать мультисет с даблами. Как раз получится точность 1e-4. Отправив решение сюда, получаю WA на 23 тесте.
Немного помучавшись, скачиваю тест и сраниваю ответы таким вот кодом. Локально он ничего не выдает. Поставив же точность 1e-5, такие отрезки находятся. Переписываю сет на даблы, ставлю вывод 6 знаков — решение заходит.
UPD
Порадовала строчка в чекере официальном
if (diff > 1e-5) return new Outcome(Type.WA, "Participant's answer differ more than 1e-3");
Бывает, жюри тоже люди. Олимпиада все-таки была скорее тренировочная.
Во время олимпиады чекер был правильный, а в архив олимпиады, по-видимому, случайно залили старый чекер с этой неправильной строчкой. Извините за неудобства.
Расскажите как решать Покраску забора. Вот такое решение дает TL 23 http://pastebin.com/GUbLcHnd
А у тебя решение за O(n^2)? Решение жюри за O(n*log n). Используем любую структуру данных, которая позволяет добавлять/искать/удалять элементы за логарифм. В ней храним "отрезки". Для каждого отрезка храним его "цвет" (в даблах) и кол-во отрезков, из которых он был получен. При добавлении нового отрезка, смотрим с кем он пересекается, удаляем их, и пересчитываем цвет и размер нового отрезка (можно доказать что в сумме все выполнится за N*logN).
Ну и еще храним отрезки каких цветов сейчас есть в структуре, которая позволяет получать максимум "за быстро".
А как при добавлении отрезка смотреть, какие он пересекает?
можно добавить концы отрезка — то что между ними, то и пересекает.
А как найти те, что между ними?
ну я делал так: в сете отрезки храню, потом концы добавляю в сет, нахожу их в сете, иду по сету от одного конца до другого.
В Java, например, в TreeSet'e (где мы храним уже добавленные отрезки) есть стандартные функции higher/lower. Если у нас компаратор сортирует отрезки по левому краю, нужно проверить, что "самый большой отрезок, меньший текущего" пересекает / не пересекает наш. А потом, пока есть отрезок, больший нашего, но пересекающийся с текущим, объединять их.
Как делать первую и третью?
А: снм. разрушение стены означает соединение двух клеток, между которыми она была. в снм будут находиться только те вершины, которые встречались в каких-либо запросах.
будем поддерживать количество площадей и обновлять после каждого разрушения стены, изначально nm. количество новых площадей будет зависеть от того, принадлежали ли соединяемые клетки корректным площадям, и образовалась ли в результате разрушения новая площадь. т.е. если мы соединили две "неплощади" и образовалось площадь — количество площадей+1.
как узнавать, корректная ли площадь? будем знать минимальную/максимальную x/у — координату лежащую в данной компоненте снм, чтобы проверить хорошая ли площадь, нужно проверить, равно ли количество операций проделанных над данной площадью количеству стен в компоненте — (maxx - minx + 1)(maxy - miny) + (maxy - miny + 1)(maxx - minx). код
Может кто-нибудь растолковать, почему не проходит java_solution (time limit test 19) Но проходит C_solution
PS Задача A
Попробуй заменить:
Integer n, cnt; Integer[] place, answer;
наint n, cnt; int[] place, answer;
Integer.decode
наInteger.parseInt
out.printf("%d ", answer[i] + 1);
наout.print(answer[i] + 1);out.print(' ');