Здесь интервалы такие же, как у линии. Хотя я нашел правильное решение для двух целей:
1) интервалы сортировки;
2) отклонить при добавлении интервалов, перекрывающихся с существующими.
struct Line {
int down;
int up;
Line(int down, int up) {
this->down = down;
this->up = up;
}
};
int main() {
auto cmp = [] (const Line& a, const Line& b) {//NOTE: this can even detect the intersection, as well as sort the interval!!
if (a.up <= b.down) return true;
else return false;
};
set<Line, decltype(cmp)> s(cmp);
Line l1{2, 3};
Line l2{3, 5};
Line l3{1, 2}; //success for insertion
Line l4{4, 6}; //fail for insertion b/c of insersection
auto ret = s.insert(l2);
cout << "insert 3->5 ";
if (ret.second) cout << "success " << endl;
else cout << "fail " << endl;
ret = s.insert(l3);
cout << "insert 1->2 ";
if (ret.second) cout << "success " << endl;
else cout << "fail " << endl;
ret = s.insert(l1);
cout << "insert 2->3 ";
if (ret.second) cout << "success " << endl;
else cout << "fail " << endl;
ret = s.insert(l4);
cout << "insert 4->6 ";
if (ret.second) cout << "success " << endl;
else cout << "fail " << endl;
return 0;
}
Output:
insert 3->5 success
insert 1->2 success
insert 2->3 success
insert 4->6 fail
set finally contains: 1->2, 2->3, 3->5,
Что-то меня все еще удивляет:
1) Почему простого сравнения a.up <= b.down
достаточно для обнаружения перекрывающихся интервалов?
Разве мы не должны делать что-то вроде стандартного подхода к обнаружению перекрытия интервалов?
max(a.down, b.down) < min(a.up, b.up)
2) 3-й шаг мне не понятен
insert 3->5 success
insert 1->2 success //OK, b/c 2 <= 3, a.up <= b.down return true
insert 2->3 success //Why success? 3 > 1, i.e., a.up > b.down, return false; does it only compare with interval 3->5?
3) Почему приведенный ниже код не работает для удаления перекрывающихся интервалов?
auto cmp_set = [](const Line& a, const Line& b) {
if (max(a.down, b.down) < min(a.up, b.up)) return 0; //standard way to detect overlapping of intervals
else { //sort the two intervals
if(a.up <= b.down) return -1;
else return 1;
}
};