Два сортированных вектора сделают это.
- Нажать все линии в вектор v1.
- Сортировка v1 по постоянной c. После этого v1 [0] - это линия с наименьшим c.
- Обход v1 от начала до конца. Для каждого элемента e в v1 мы должны рассматривать только те элементы, которые были раньше (c1> c2). Теперь задача состоит в том, чтобы найти среди всего посещенного элемента элемент с m2> m1.
- Таким образом, мы просто нажимаем элемент, который был посещен, в вектор v2.Мы должны держать его отсортированным по наклону m после каждой вставки (самобалансировка BST будет выполнять эту задачу). Поскольку v2 сортируется по m, бинарный поиск расскажет вам, сколько элементов удовлетворяют m2> m1.
Сортировка n log n.
Вставить в v2 log n (Это может быть достигнуто с помощью самобалансировки BST, и он будет вызывать n раз).
Двоичный поиск - log n (invoke n раз).
Так что O (Nlog п)
Если вы пишете это в C++, это будет похоже, что (я не определяю v2, потому что вы будете реализовывать себя баланс BST):
struct line
{
int c,m;
line(int a,int b):c(a),m(b){}
bool operator <(const line &a) const
{
return m>a.m;
}
};
bool cmp(const line &v1,const line &v2)
{
return v1.c<v2.c;
}
int main()
{
vector<line> v1;
v1.push_back(line(1,3));
v1.push_back(line(4,1));
v1.push_back(line(3,1));
v1.push_back(line(2,2));
sort(v1.begin(),v1.end(),cmp);
int ans=0;
for(int i=0;i<v1.size();i++)
{
int num=v2.find(v1[i]);//return the number of element whose m is larger than v1[i].
ans+=num;
v2.insert(v1[i]);// in every step, the element e in v2 will satisfy e.c<v1[i].c
}
cout << ans;
}
Это все. Если у вас есть какие-либо вопросы, оставьте мне комментарий.
Какое пересечение вы имеете в виду? Между строкой 1 и строкой 2? Или между линией и осью X? –
Мне нужно найти число точек пересечения между линиями в заданном множестве, которое находится справа от x = 0. – Malice
Что произойдет, если вы создадите список строк, отсортированных по вашему критерию? Затем вы можете перебирать список и суммировать количество записей в списке. Сложность O (n log (n)) –