![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
c-ch |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Мужской Репутация: ![]() ![]() ![]() |
Точки и отрезки
(Время: 2 сек. Память: 16 Мб Сложность: 62%) Дано N отрезков на числовой прямой и M точек на этой же прямой. Для каждой из данных точек определите, скольким отрезкам она принадлежит. Точка x считается принадлежащей отрезку с концами a и b, если выполняется двойное неравенство min(a, b) <= x <= max(a, b). Входные данные Первая строка входного файла INPUT.TXT содержит два целых числа N – число отрезков и M – число точек (1 <= N, M <= 10^5). В следующих N строках по два целых числа ai и bi – координаты концов соответствующего отрезка. В последней строке M целых чисел – координаты точек. Все числа во входном файле не превосходят по модулю 10^9. Выходные данные В выходной файл OUTPUT.TXT выведите M чисел – для каждой точки количество отрезков, в которых она содержится. ПРИМЕРЫ 3 2 0 5 -3 2 7 10 1 6 ответ 2 0 1 3 -10 10 -100 100 0 ответ 0 0 1 Моя идея проста: сначала сортируем точки по координате, затем точки с одинаковой координатой сортируем по типу К сожалению, этот вариант не проходит автоматическую систему проверки по времени (~+0,5сек) ![]() Самого теста у меня нет Вероятно, надо прикрутить упорядочивание по типу точки в процедуру сортировки по координате, но я не представляю, как это сделать... А может ещё какой-то вариант есть? Времени у меня как всегда впритык ![]()
Заранее спасибо Сообщение отредактировано: c-ch - 5.04.2009 20:18 |
c-ch |
![]()
Сообщение
#2
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Мужской Репутация: ![]() ![]() ![]() |
ещё один вариант сделал: разводим начала и концы отрезков в разные массивы, оба упорядичиваем и для каждой точки бинарным поиском ищем сколько начал отрезков левее её (не строго) и сколько правее (строго). Их разность является ответом.
Вроде и сортировка и поиск достаточно быстрые, но всё равно по времени не укладывается ![]() program Project1; |
Lapp |
![]()
Сообщение
#3
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Вроде и сортировка и поиск достаточно быстрые, но всё равно по времени не укладывается Я бы на твоем месте больше заботился о качестве самого кода. Например, вот тут:l[i]:=min(t1,t2);- ты транжиришь время как будто у тебя есть вечность ![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
c-ch |
![]()
Сообщение
#4
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Мужской Репутация: ![]() ![]() ![]() |
конкретно этот кусок я исправил ветвлением, спасибо
![]() но толку-то никакого либо есть что-то ещё, что я не вижу, либо одно из двух, как в анекдоте... ![]() |
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
c-ch
Насколько я вижу, у тебя вся проблема - в реализации бинарного поиска. Ты выбрал, наверное, самый неэффективный способ. Попробуй вот так: function FindIt(x:longint):longint;Казалось бы, ничего не изменилось, ан нет... ![]() |
c-ch |
![]()
Сообщение
#6
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Мужской Репутация: ![]() ![]() ![]() |
время улучшилось на пару сотых секунды
![]() но этого мало ![]() я уже начинаю подозревать систему проверки ![]() хотя, люди как-то сдают...то ли лыжи не едут... |
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Цитата время улучшилось на пару сотых секунды Да? У меня время уменьшилось с 8 секунд изначальных (n = m = 105, случайные данные) до 0.06 сек после внесения изменений... Что-то у тебя не то происходит... |
c-ch |
![]()
Сообщение
#8
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Мужской Репутация: ![]() ![]() ![]() |
я лишь привёл цифры, которые дала система проверки...
буду дальше думать |
passat |
![]()
Сообщение
#9
|
Новичок ![]() Группа: Пользователи Сообщений: 32 Пол: Мужской Репутация: ![]() ![]() ![]() |
Координаты отрезков записываем в массив. Держим вспомогательный признак: начало отрезка +1, конец -1. Сортируем массив. Сортируем массив точек. Дольше идем от наименьшего в двух массивах. Сумма +1 будет давать количетво отрезков, которым принадлежит точка.
Такой алгоритм подойдет? |
passat |
![]()
Сообщение
#10
|
Новичок ![]() Группа: Пользователи Сообщений: 32 Пол: Мужской Репутация: ![]() ![]() ![]() |
Точнее, даже так. Все сливаем в один массив. ВВодим признаки: +1 - начало отрезка, 0 - точка, -1 - конец отрезка. Сортируем массив. Далее идем от начала к концу и подсчитываем суммы +1, -1, и 0. На каждом нуле запоминаем сумму.
Работать должно за время сортировки плюс полного прохода по массиву, т.е. O((2*N+M)*(1+log(2*N+M))) Несколько ускорить может внутренняя проверка на исчерпанность точек и отрезков. Сработает? |
c-ch |
![]()
Сообщение
#11
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Мужской Репутация: ![]() ![]() ![]() |
конечно
![]() в первом посте именно такой вариант ![]() кстати, оба варианта показывают одинаковое время может таки это не мой косяк? |
volvo |
![]()
Сообщение
#12
|
Гость ![]() |
Цитата может таки это не мой косяк? Может, ты все-таки дашь ссылку на сервер, на котором проверяешь код? А то борьба, похоже, идет с ветряными мельницами...Ну, сгенерируй файл данных для макс. значений M, N и запусти у себя на машине твой второй и мой исправленный варианты решения. Сколько времени выполняется исправленный? Как может сервер выдавать тебе овертайм при разрешенном времени = 2 секунды (если он, конечно, вменяемый сервер)? |
c-ch |
![]()
Сообщение
#13
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Мужской Репутация: ![]() ![]() ![]() |
пожалуйста: http://acmp.ru/index.asp?main=task&id_task=396
Сообщение отредактировано: c-ch - 6.04.2009 17:58 |
volvo |
![]()
Сообщение
#14
|
Гость ![]() |
Я ничего с этим сервером не понимаю
![]() {$r-}, 5 тестов отработало "влёт", на шестом с какого-то перепуга "неверный ответ", хотя что там может быть неверного? Может, ты найдешь ошибку в алгоритме? |
volvo |
![]()
Сообщение
#15
|
Гость ![]() |
Бррр... Да, сам виноват, посчитал, что в паре координат, образующих отрезок, всегда первой идет левая граница, а второй - правая. В условии этого не было указано, так что надо проверять, что меньше, а что - больше. С проверкой программа проходит все тесты, еще и с запасом...
c-ch, в алгоритме разобрался? |
c-ch |
![]()
Сообщение
#16
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Мужской Репутация: ![]() ![]() ![]() |
да, спасибо :смайлик_с_пивом:
|
![]() ![]() |
![]() |
Текстовая версия | 12.08.2025 2:33 |