Задать вопрос
  • Как найти решение для задачи?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Геометрически здесь задача проверки, что заданный в координатах X(distance) - Y(light) прямоугольник полностью покрывается набором других прямоугольников.
    Как вариант, формируем общий список левых и правых границ всех покрывающих прямоугольников по X, сортируем его, слева и справа ограничиваем целевым прямоугольником, затем для каждого интервала проверяем, что он полностью покрывается по Y.
    Например:
    Целевой прямоугольник (1, 1)-(6, 6)
    Покрывающие прямоугольники: (0, 0)-(3, 4), (2, 1)-(7, 5), (0, 3)-(6, 7)
    Составляем список границ по X: 0, 3, 2, 7, 0, 6
    Удаляем дубли, сортируем и ограничиваем по [1, 6]: 1, 2, 3, 6
    Для каждого интервала составляем список интервалов по Y и объединяем интервалы:
    [1, 2]: [0, 4] + [3, 7] = [0, 7], что перекрывает целевой [1, 6]
    [2, 3]: [0, 4] + [1, 5] + [3, 7] = [0, 7], что перекрывает целевой [1, 6]
    [3, 6]: [1, 5] + [3, 7] = [1, 7], что перекрывает целевой [1, 6]
    На всех интервалах полное покрытие, значит целевой прямоугольник покрывается полностью.
    Сложность, правда, высокая - n2.
    Ответ написан
    Комментировать
  • Как найти решение для задачи?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Rsa97 правильно написал про геометрический смысл. Но есть более быстрое решение за O(n log n), использующее метод заметающей прямой.

    Пересеките все прямоугольники с тем, который надо покрыть, отрезав от них торчащую наружу часть.

    Если числа в задаче большие или нецелые, то сначала через бинпоиск или хешмап замените все координаты по X и по Y на их порядковый номер в отсортированном массиве (отдельно по каждой оси). Эта операция называется "сжатие координат". Теперь у вас все координаты целые числа от 0 до 2*n.

    Потом примените алгоритм "заметающей прямой". Представьте, что вертикальная линия двигается слева-направо и "заметает" картинку. Вам надо отслеживать, какие прямоугольники ее пересекают в каждый момент времени и проверить, что вся прямая покрыта в каждый момент.

    Для этого каждый прямоугольник (X1, Y1, X2, Y2) создаст 2 события "открылся отрезок с Y1 до Y2 во время X1" и "закрылся отрезок с Y1 до Y2 во время X2". Эти все события вы сортируете по X и в таком порядке обрабатываете.

    Для отслеживания состояния прямой используйте дерево отрезков на минимум с отложенной суммой. Эта структура данных потребует массив на примерно 4n элементов для дерева с 2n листами. Каждая вершина будет хранить минимум на соответсвующем ей отрезке. При открытии прямоугольника вы должны добавить +1 на его отрезок. При закрытии - вычесть 1. Сначала открывайте прямоугольники, если время у событий одинаковое. Учитывайте это при сортировке. Так касающиеся по вертикали прямоугольники не создадут пустых мест.
    Если после обработки какого-либо события вы получили минимум в дереве отрезков 0 и следующее событие имеет большую координату по X - то какая-то часть оказалась не покрыта. Еще есть случай, если первое событие не X1=левая граница покрываемого прямоугольника, или последнее событие - не X2=правая граница всего прямоугольника. Тут тоже покрытия нет.

    Еще, аккуратно с целыми числами, чтобы если у вас 2 прямоугольника касаются горизонтальными сторонами - там пустое место не подсчиталось. Например, каждый лист дерева отвечает за единичный отрезок координат. Тогда изменяйте в дереве всегда отрезок от Y1 до Y2-1 для события с координатам Y1..Y2.
    Ответ написан
    7 комментариев
  • Не могу получить заказ на бирже?

    customtema
    @customtema
    arint.ru
    Закат.

    Я убил свой профиль. В итоге только выиграл от этого. Давно надо было сделать.

    Фриланс был интересный лет 5-10 назад. Сейчас пустышки как подавляющая часть исполнителей, так и заказчиков. С обеих сторон преимущественно бесперспективная школота, вне зависимости от возраста, по сути школота.

    Где брать работу? Или наняться, или "Бизнес-молодость". Оба подхода хороши.
    Ответ написан
    2 комментария
  • Не могу получить заказ на бирже?

    @Barido
    Спасибо скажите тем, кто статейки пишет на хабре про то, как они начали работать на фрилансе, сначала было сложно, но они поднатужились и теперь деньги льются рекой. Сами же себе яму роют рассказывая про это.

    Или как они в 80 лет за одну ночь переучились на программиста. Зачем - непонятно -- народа больше, конкуренция больше, денег меньше, индусов больше.

    И среди заказчиков тоже теперь соотвествующие ожидания по оплате -- клон фейсбука за $100 и толпа желающих.

    Так что думаю, что дальше будет ещё дешевле и хуже.
    Ответ написан
    1 комментарий
  • Хотели бы вы иметь сервис для быстрого хостинга node.js приложений?

    Ptolemy_master
    @Ptolemy_master
    А меня вполне устраивает heroku. Там почти все так же просто.
    Только вместо ftp git, плюс множество всяких плюшек, включая редиректы на свой домен. И бесплатный эккаунт есть.
    Ответ написан
    Комментировать
  • Как сделать левые отзывы на Upwork и не попаться?

    opium
    @opium
    Просто люблю качественно работать
    работать пробовали?
    Ответ написан
    Комментировать