Блог пользователя nerd

Автор nerd, 13 лет назад, По-русски

http://acmp.ru/index.asp?main=task&id_task=467


Всем привет!

Как решается эта задача?!
Вроде как-то сделать сортировку и мудрить дальше... Но что-то идей нет.
Или дерево отрезков с сжатием координат...

Можете написать, кто как решил?!

Спасибо...

UPDhttp://acm.timus.ru/problem.aspx?space=1&num=1019 А можно сразу одним методом и эту задачу решить?!
  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

13 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Переименовали. получили не более 1000+/-5 интервалов. Далее можно тупо за квадрат перекрашивать (500*1000 то есть). Ну и проверить в конце тоже вроде бы не слишком сложно
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
По-моему, просто сканирующая прямая. Разбиваем отрезок на два события - начало и конец отрезка. Сортируем события по координате. Бежим по ним, поддерживая количество открытых отрезков на данный момент. Понятно, что мы можем определить цвет отрезка от текущего события до предыдущего, исходя из четности количества открытых отрезков. И понятно, что после каждого события четность и, соответственно, цвет отрезка меняется. Поэтому задача сводится просто к пробегу по отсортированным событиям и нахождению максимального расстояния между текущим событием и предыдущим тогда, когда кол-во открытых отрезков четно. Не знаю, может я что и напутал.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Вторую задачу я бы решал так: перенумеруем, далее используем дерево отрезков. (изменение на отрезке+ смотреть результат в точке, храним время изменения). В конце для каждой точки смотрим результат: проходим по всей высоте дерева и выбираем для каждой вершины результат последнего перекрашивания. Ну вывести максимальный отрезок это уже  опять же несложно
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Вторую я сегодня вообще за квадрат как раз писал. 

    Т.е. храним события "новый цвет в такой-то точке". При добавлении отрезка просто правим нужные нам события (те, которые внутри нового отрезка, надо все перекрасить в его цвет), добавление левого конца - очевидно, новое событие с цветом "цвет отрезка". Добавление правого конца - на первый взгляд проблемы с цветом, но на самом деле цветом события будет прежний цвет в этой точке, т.е. цвет последнего события слева от этой точки.

    Ну еще с дублями точек аккуратно разобраться... Вроде все. И пишется коротко:) Поиск ответа за O(N), перекрашивание отрезка за O(N).