Доброе время суток!
Как за О(1) выкинуть какую-то вершину из множества в СНМ-е?
Задача "А" с Rujia Liu's Present 3 contest.
Кто решил, скиньте код если можно.
Заранее спасибо!
Upd:
Итак, проблема решена. Всем спасибо!
Решение:
- Каждую вершину i подвесить саму к себе
- Для каждой вершины i создать фиктивную вершину i'
- Подвесить каждую i' к i
- Теперь, во всех операциях(union, get_set, move) использовать только фиктивные вершины
Почему нужно работать только с фиктивными вершинами?
Потому, что к ним никогда ничто не подвешивается, из-за чего нам не надо перевешивать все ссылки потомков, когда если бы делали без фиктивных вершин, надо было бы перевешивать, а это долго.
Думаю объяснил более-менее понятно.
Материал выложен на сайте школы в соответствующем разделе (http://olimp.sc170.kharkov.ua/videoday4_2011 ) - выберите "Лекция" - "Скачать".
Надеюсь, что после этого задачка станет понятной и реализуемой.
Тогда добавление и удаление элемента можно делать за константу. Просто разорвать список в нужном месте и склеить потом правильно, а потом в другой список дописывать просто в конец.
Понял о чем речь уже после открытия темы :)