1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
| c-ch |
5.04.2009 10:25
Сообщение
#1
|
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Мужской Репутация: 1 |
Точки и отрезки
(Время: 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 |
5.04.2009 19:59
Сообщение
#2
|
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Мужской Репутация: 1 |
ещё один вариант сделал: разводим начала и концы отрезков в разные массивы, оба упорядичиваем и для каждой точки бинарным поиском ищем сколько начал отрезков левее её (не строго) и сколько правее (строго). Их разность является ответом.
Вроде и сортировка и поиск достаточно быстрые, но всё равно по времени не укладывается program Project1; |
| Lapp |
6.04.2009 1:36
Сообщение
#3
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Вроде и сортировка и поиск достаточно быстрые, но всё равно по времени не укладывается Я бы на твоем месте больше заботился о качестве самого кода. Например, вот тут:l[i]:=min(t1,t2);- ты транжиришь время как будто у тебя есть вечность -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
| c-ch |
6.04.2009 6:53
Сообщение
#4
|
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Мужской Репутация: 1 |
конкретно этот кусок я исправил ветвлением, спасибо
но толку-то никакого либо есть что-то ещё, что я не вижу, либо одно из двух, как в анекдоте... |
| volvo |
6.04.2009 10:37
Сообщение
#5
|
|
Гость |
c-ch
Насколько я вижу, у тебя вся проблема - в реализации бинарного поиска. Ты выбрал, наверное, самый неэффективный способ. Попробуй вот так: function FindIt(x:longint):longint;Казалось бы, ничего не изменилось, ан нет... |
| c-ch |
6.04.2009 16:22
Сообщение
#6
|
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Мужской Репутация: 1 |
время улучшилось на пару сотых секунды
но этого мало я уже начинаю подозревать систему проверки хотя, люди как-то сдают...то ли лыжи не едут... |
| volvo |
6.04.2009 16:33
Сообщение
#7
|
|
Гость |
Цитата время улучшилось на пару сотых секунды Да? У меня время уменьшилось с 8 секунд изначальных (n = m = 105, случайные данные) до 0.06 сек после внесения изменений... Что-то у тебя не то происходит... |
| c-ch |
6.04.2009 16:43
Сообщение
#8
|
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Мужской Репутация: 1 |
я лишь привёл цифры, которые дала система проверки...
буду дальше думать |
| passat |
6.04.2009 16:54
Сообщение
#9
|
|
Новичок ![]() Группа: Пользователи Сообщений: 32 Пол: Мужской Репутация: 0 |
Координаты отрезков записываем в массив. Держим вспомогательный признак: начало отрезка +1, конец -1. Сортируем массив. Сортируем массив точек. Дольше идем от наименьшего в двух массивах. Сумма +1 будет давать количетво отрезков, которым принадлежит точка.
Такой алгоритм подойдет? |
| passat |
6.04.2009 17:34
Сообщение
#10
|
|
Новичок ![]() Группа: Пользователи Сообщений: 32 Пол: Мужской Репутация: 0 |
Точнее, даже так. Все сливаем в один массив. ВВодим признаки: +1 - начало отрезка, 0 - точка, -1 - конец отрезка. Сортируем массив. Далее идем от начала к концу и подсчитываем суммы +1, -1, и 0. На каждом нуле запоминаем сумму.
Работать должно за время сортировки плюс полного прохода по массиву, т.е. O((2*N+M)*(1+log(2*N+M))) Несколько ускорить может внутренняя проверка на исчерпанность точек и отрезков. Сработает? |
| c-ch |
6.04.2009 17:46
Сообщение
#11
|
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Мужской Репутация: 1 |
конечно
в первом посте именно такой вариант кстати, оба варианта показывают одинаковое время может таки это не мой косяк? |
| volvo |
6.04.2009 17:55
Сообщение
#12
|
|
Гость |
Цитата может таки это не мой косяк? Может, ты все-таки дашь ссылку на сервер, на котором проверяешь код? А то борьба, похоже, идет с ветряными мельницами...Ну, сгенерируй файл данных для макс. значений M, N и запусти у себя на машине твой второй и мой исправленный варианты решения. Сколько времени выполняется исправленный? Как может сервер выдавать тебе овертайм при разрешенном времени = 2 секунды (если он, конечно, вменяемый сервер)? |
| c-ch |
6.04.2009 17:57
Сообщение
#13
|
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Мужской Репутация: 1 |
пожалуйста: http://acmp.ru/index.asp?main=task&id_task=396
Сообщение отредактировано: c-ch - 6.04.2009 17:58 |
| volvo |
7.04.2009 16:13
Сообщение
#14
|
|
Гость |
Я ничего с этим сервером не понимаю
{$r-}
, 5 тестов отработало "влёт", на шестом с какого-то перепуга "неверный ответ", хотя что там может быть неверного? Может, ты найдешь ошибку в алгоритме? |
| volvo |
7.04.2009 20:43
Сообщение
#15
|
|
Гость |
Бррр... Да, сам виноват, посчитал, что в паре координат, образующих отрезок, всегда первой идет левая граница, а второй - правая. В условии этого не было указано, так что надо проверять, что меньше, а что - больше. С проверкой программа проходит все тесты, еще и с запасом...
c-ch, в алгоритме разобрался? |
| c-ch |
9.04.2009 14:08
Сообщение
#16
|
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Мужской Репутация: 1 |
да, спасибо :смайлик_с_пивом:
|
![]() ![]() |
|
Текстовая версия | 8.12.2025 10:12 |