Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 27.01.2022
Сообщений: 2
1

Точки и отрезки

27.01.2022, 23:16. Показов 3966. Ответов 5

Author24 — интернет-сервис помощи студентам
Всем привет, первый раз на форуме, если сообщение будет плохо отображаться, прошу простить.
Вот задачка:
Дано n отрезков на числовой прямой и m точек на этой же прямой. Для каждой из данных точек определите, скольким отрезкам она принадлежит. Точка x считается принадлежащей отрезку с концами a и b, если выполняется двойное неравенство min(a,b) <= x <= max(a,b).

Входные данные
Первая строка содержит два целых числа n (1 <= n <= 30000) — число отрезков и m (1 <= m <= 30000) — число точек. В следующих n строках записаны по два целых числа ai и bi — координаты концов соответствующего отрезка. В последней строке записаны m целых чисел — координаты точек.
Все числа во входном файле не превосходят по модулю 109.

Выходные данные
Программа должна вывести m чисел — для каждой точки выведите количество отрезков, в которых она содержится.
ПРИМЕР
Ввод:
2 2
0 5
10 7
1 6
Вывод:
1 0
--------------------------------------
Ввод:
1 3
-10 10
-100 100 0
Вывод:
0 0 1
Моё решение проходит только первые несколько тестов. Помогите, пожалуйста понять, что не так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
 
using namespace std;
 
typedef long long ll;
 
struct Event {
    ll x, type, num;    // 0 - open, 1 - point, 2 - close
    Event(ll x, ll type, ll num) : x(x), type(type), num(num) {};
};
 
bool operator <(const Event& a, const Event& b) {   // В одной координате
    return make_pair(a.x, a.type) < make_pair(b.x, b.type); // Сначала обрабатывается открытие отрезка, потом точка, потом закрытие отрезка
}
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n, m;
    cin >> n >> m;
    vector<Event> ev;
    ev.reserve(n + m);
    int l, r;
    for (int i = 0; i < n; ++i) {
        cin >> l >> r;
        ev.push_back(Event(l, 0, -1));
        ev.push_back(Event(r, 2, -1));
    }
    for (int i = 0; i < m; ++i) {
        cin >> l;
        ev.push_back(Event(l, 1, i));
    }
    sort(ev.begin(), ev.end());
    int bal = 0;        // Кол-во "активных отрезков"
    vector<int> ans(m);
    for (auto& e : ev) {
        if (e.type == 0) ++bal;
        else if (e.type == 1) ans[e.num] = bal;
        else --bal;
    }
    for (auto i : ans) {
        cout << i << ' ';
    }
    cout << '\n';
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.01.2022, 23:16
Ответы с готовыми решениями:

Определить, имеют ли отрезки общие точки
Здравствуйте, очень далек от программирование, требуется помощь в данном вопросе: Два отрезка на...

Точки плоскости, Вектора, Отрезки
Для четырех точке плоскости A, D, F и N выполняется соотношение AN=4AD-3AF(вектора). Докажите, что...

Определить, имеют ли отрезки общие точки.
1я задача: Общая точка. Два отрезка на плоскости заданы координатами своих концов. Определить,...

Определить, имеют ли отрезки общие точки
Условие: Посмотрите все ли я предусмотрел? Может, что-то можно изменить /*Два отрезка на...

5
57 / 33 / 30
Регистрация: 15.04.2017
Сообщений: 141
28.01.2022, 11:47 2
Когда-то писал решение этой задачи
Попробуйте:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include<ios>
#include<algorithm>
#include<limits>
#include<vector>
using namespace std;
bool cmp1(pair<pair<int,int>,int>&val1,pair<pair<int,int>,int>&val2){
    if(val1.first.first<val2.first.first)
        return true;
    else{
        if(val1.first.first==val2.first.first){
            if(val1.first.second==1&&val2.first.second!=1)
                return true;
            if(val1.first.second==0&&val2.first.second==-1)
                return true;
            if(val1.first.second==0&&val2.first.second==1)
                return false;
        }
    }
    return false;
}
bool cmp2(pair<pair<int,int>,int>&val1,pair<pair<int,int>,int>&val2){
    return val1.second<val2.second;
}
int main()
{
    std::ios_base::sync_with_stdio(false);
    int  n, m;
    int input;
    cin>>n>>m;
    vector<pair<pair<int,int>,int>>A;
    for(int i = 0;i<n;i++){
       cin>>input;
       A.push_back(make_pair(make_pair(input,1),INT32_MAX));
       cin>>input;
       A.push_back(make_pair(make_pair(input,-1),INT32_MAX));
    }
    for(int i = 0; i<m;i++){
        cin>>input;
        A.push_back(make_pair(make_pair(input,0),i));
    }
    sort(A.begin(),A.end(),cmp1);
    /*for(unsigned int i = 0; i<A.size();i++){
        cout<<A[i].first.first<<" "<<A[i].first.second<<endl;
    }*/
    int sum=0;
    int N = 2*n+m;
    for(int i = 0; i<N;i++){
        if(A[i].first.second==1){
           sum++;
        }else if(A[i].first.second==-1){
            sum--;
        }
        else{
            A[i].first.second=sum;
        }
    }
    sort(A.begin(),A.end(),cmp2);
    for(int i = 0; i<m;i++){
        cout<<A[i].first.second<<" ";
    }
    return 0;
}
Тут подразумевается, что координаты концов прямой вводятся в правильном порядке. Можете добавить дополнительную проверку, если тесты подразумевают возможность неправильного ввода
0
0 / 0 / 0
Регистрация: 27.01.2022
Сообщений: 2
28.01.2022, 15:42  [ТС] 3
Проходит такие же тесты как и моё

Добавлено через 11 минут
Я понял в чём дело! Дело чисто в невнимательности. В моём условии сказано, "если выполняется двойное неравенство min(a,b) <= x <= max(a,b)", то есть координаты начала и конца необязательно отрезка задаются по возрастанию. Поэтому начало отрезка это min(из двух точек), а конец - это max(из двух точек)!!!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
 
using namespace std;
 
typedef long long ll;
 
struct Event {
    ll x, type, num;    // 0 - open, 1 - point, 2 - close
    Event(ll x, ll type, ll num) : x(x), type(type), num(num) {};
};
 
bool operator <(const Event& a, const Event& b) {   // В одной координате
    return make_pair(a.x, a.type) < make_pair(b.x, b.type); // Сначала обраюатывается открытие отрезка, потом точка, потом закрытие отрезка
}
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n, m;
    cin >> n >> m;
    vector<Event> ev;
    ev.reserve(n + m);
    int l, r;
    for (int i = 0; i < n; ++i) {
        cin >> l >> r;
        ev.push_back(Event(min(l, r), 0, -1));      // !!!!
        ev.push_back(Event(max(l, r), 2, -1));  // !!!!
    }
    for (int i = 0; i < m; ++i) {
        cin >> l;
        ev.push_back(Event(l, 1, i));
    }
    sort(ev.begin(), ev.end());
    int bal = 0;        // Кол-во "активных отрезков"
    vector<int> ans(m);
    for (auto& e : ev) {
        if (e.type == 0) ++bal;
        else if (e.type == 1) ans[e.num] = bal;
        else --bal;
    }
    for (int i = 0; i < m; ++i) {
        cout << ans[i] << ' ';
    }
    return 0;
}
Теперь заходит на 100
0
0 / 0 / 0
Регистрация: 27.09.2021
Сообщений: 9
23.09.2023, 23:25 4
ахаха, то же самое было, а я сижу голову ломаю над событиями)
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
24.09.2023, 21:44 5
Иван228282, вы из одной школы?
0
KSergey9
25.09.2023, 12:03     Точки и отрезки
  #6

Не по теме:

Цитата Сообщение от H4msterid Посмотреть сообщение
то есть координаты начала и конца необязательно отрезка задаются по возрастанию.
Но ведь такой вариант есть даже в приведенном здесь примере входных.
Выходит, вы даже не проверили на известных данных корректность работы программы, а сразу запустили тесты? Грустно, товарищи!

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.09.2023, 12:03

Найти точки, делящие данные отрезки
M(2;4;-2) M2(-2:4;2) нужно найти M делящий отрезок M1,M2 как 1:3 помогите решить...пожалуйста ...

Как брать точки на polyline через равные отрезки?
Я использую движок leafletjs. Есть polyline, мне нужно нарисовать на ней n объектов (например...

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

Составить уравнение плоскости, проходящей через точки M1,M2 и отсекающей равные отрезки на осях Ox и Oy
Составить уравнение плоскости, проходящей через точки M1,M2 и отсекающей равные отрезки на осях Ox...

На плоскости два отрезка задаются координатами. Определить, имеют ли эти отрезки общие точки
Условие: На плоскости два отрезка задаются координатами. Определить, имеют ли эти отрезки общие...

На плоскости два отрезка задаются координатами. Определить, имеют ли эти отрезки общие точки
кто сможет решить?

Два отрезка на плоскости заданы координатами своих концов. Определить, имеют ли эти отрезки общие точки
Два отрезка на плоскости заданы координатами своих концов. Определить, имеют ли эти отрезки общие...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru