Подскажите, правильно ли мыслю? Даны N точек на плоскости, координаты

которых положительные. Нужно уметь определять, можно ли покрыть все заданные точки плоскости тремя прямыми, каждая из которых параллельна одной из осей Х или У? Да, и каждая прямая должна проходить через, как минимум, две точки.
Моя идея состоит в том, чтобы сначала разбить точки на группы из как минимум двух точек с одинаковой координатой по х. Если таких групп три, то выигрыш. Иначе сделать аналогичное по другой координате. Если все ещё не выигрыш, то нужно найти точку, которая лежит в двух группах (совпадение по х, совпадение по у), удалить все точки этих групп. Если оставшиеся точки можно распределить в группу по совпавшим х или по у, то это победа, иначе нельзя

10 ответов

3 просмотра

А на тесте: 0 0 0 2 1 1 3 1 2 3 4 3 работает?

Так это ж vertex cover?

Дон-Кинг Автор вопроса
Seagull Novikov
А на тесте: 0 0 0 2 1 1 3 1 2 3 4 3 работает?

Да, тут не точек, которые принадлежат обеим группам, но при удалении всех точек одной группы, останется две группы, на которых хватит двух прямых.

Дон-Кинг Автор вопроса
Evgenii Zheltonozhskii🇮🇱
Так это ж vertex cover?

Непонятно, не вижу граф.

Дон Кинг
Непонятно, не вижу граф.

Вершины -- координаты по Х и Y, ребра между X и Y если есть точка (X,Y)

Можно решить за O(n log n) следующим образом. Для начала, как Вы и сказали, проверим, можно ли просто провести 3 прямые одного типа. Если не получилось, то понятно, что у нас всегда будет одна прямая одного типа и две другого. Научимся решать задачу для случаев, когда проводим одну вертикальную прямую (для горизонтальных аналогично). Для этого пройдёмся по всем уникальным значениям x, поддерживая также мапу вида {y-координата: кол-во точек с такой y-координатой}. Для каждой из перебираемых линий сначала удалим все точки с такой x-координатой из мапы, отдельно поддерживая количество y-координат с ненулевым кол-вом точек на ней. После за O(1) проверим, можно ли провести две горизонтальные прямые или нет, ну и вернём удалённые точки в мапу. Поскольку каждая точка будет удалена ровно 1 раз, получим O(n log n) (там ещё возможно нужно будет где-то сортировку делать, так что лог не только от мапы). Аналогично сделаем для случая одной горизонтальной прямой.

Дон-Кинг Автор вопроса
tiom4eg 🇷🇺
Можно решить за O(n log n) следующим образом. Для ...

То есть нужно в случае одной вертикальной прямой, нужно из мапы удалить все Х, шагая по уникальным Х, такие что они гарантированно не могут попасть на горизонтальную прямую, то есть те, с которыми по У никакая точка не совпадает?

tiom4eg 🇷🇺
Можно решить за O(n log n) следующим образом. Для ...

Можно для экономии памяти сделать 2 прохода на одной мапе

Похожие вопросы

Обсуждают сегодня

Всем привет Есть достаточно базовая задача: Дан неориентированный граф. Требуется определить, есть ли в нем цикл, и, если есть, вывести его. Входные данные подаются в виде ма...
Αλeksandr
10
Привет всем. Подскажите, как можно данную задачу более менее эффективно решить? В столовой одного известного Завода вот-вот начнётся обед. На обеде есть три гарнира — макарош...
Vitaliy
6
Всем привет Пытаюсь решить следующую задачу: https://informatics.msk.ru/mod/statements/view.php?id=6992&chapterid=101#1 Строка S была записана много раз подряд, после чего из ...
Αλeksandr
10
всем привет. У меня есть неупорядоченный массив точек(в моем случае в трёхмерном пространстве). Есть критерий связанности точек: если евклидово расстояние между ними меньше за...
Павлик Ливаткин
31
Доброе утро. Такой вопрос: есть ли какие-то практически полезные меры вычислительной мощности (в смысле computational complexity) для реальных машин, с ограниченными ресурсам...
Yaroslav Schekin
15
Друзья, практический вопрос надо счиать скользящую медиану в последовательности по заданному окну (длины N) тупой вариант - взять значения в окне, отсортировать, взять элеме...
Стас Выщепан
17
Здравствуйте. Есть задача нужно найти наименшое число P где фактриал P делиться на 10^N. Ограничения 10^9. Знаю что нужно найти такой P в конце как минимум N нулей. Решение с ...
. Azmiddin
20
#pragma once #include <iostream> #include <vector> template <typename T, typename Comp = std::less<T>> class Heap { public: Heap() = default; Heap(const std::vector<T>&...
Степан
1
Должна-ли работать такая стратегия: Мы каждую секунду бросаем монетку - орел или решка. Если орел - покупаем акцию на все деньги, если у нас есть деньги, или продаем все акци...
George Polevoy
13
Как можно сжимать временные ряды в памяти? У меня есть исторические стоимости ценных бумаг. Данные для каждой минуты в истории OHLC (Open, High, Low, Close). Соответственно, O...
George Polevoy
10
Карта сайта