#include <deque>
#include <iostream>
#include <map>
#include <queue>
struct Connection {
uint32_t start;
uint32_t end;
} ; // struct Connection
struct OrderByEnd {
bool operator( ) ( Connection const & left, Connection const & right) const {
if ( left.end > right.end ) { return true ; }
if ( left.end < right.end ) { return false ; }
return left.start > right.start ;
}
} ; // struct OrderByEnd
using CurrentlyOverlappingType = std:: priority_queue < Connection, std:: deque < Connection> , OrderByEnd> ;
size_t countMaxNumberOfOverlaps( std:: map < uint32_t , uint32_t > const & connections) {
if ( connections.empty ( ) ) { return 0 ; }
size_t max = 0 ;
CurrentlyOverlappingType currentlyOverlapping;
for ( auto const & con: connections) {
// Purge no longer overlapping connections
while ( not currentlyOverlapping.empty ( ) and currentlyOverlapping.top ( ) .end < con.first ) {
currentlyOverlapping.pop ( ) ;
}
// Debug:
if ( not currentlyOverlapping.empty ( ) ) {
std:: cout << "[" << con.first << ", " << con.second <<
"] is overlapping with: " << currentlyOverlapping.size ( ) << " connections\n " ;
}
// The current connection is necessarily overlapping with itself
currentlyOverlapping.push ( Connection{ con.first , con.second } ) ;
max = std:: max ( max, currentlyOverlapping.size ( ) ) ;
}
return max;
} // countMaxNumberOfOverlaps
int main( ) {
std:: map < uint32_t , uint32_t > const connections = { { 100 , 1000 } ,
{ 120 , 200 } ,
{ 250 , 400 } ,
{ 600 , 800 } } ;
size_t const max = countMaxNumberOfOverlaps( connections) ;
std:: cout << "Max number of overlaps: " << max << "\n " ;
return 0 ;
}
I2luY2x1ZGUgPGRlcXVlPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxxdWV1ZT4KCnN0cnVjdCBDb25uZWN0aW9uIHsKCXVpbnQzMl90IHN0YXJ0OwoJdWludDMyX3QgZW5kOwp9OyAvLyBzdHJ1Y3QgQ29ubmVjdGlvbgoKc3RydWN0IE9yZGVyQnlFbmQgewoJYm9vbCBvcGVyYXRvcigpKENvbm5lY3Rpb24gY29uc3QmIGxlZnQsIENvbm5lY3Rpb24gY29uc3QmIHJpZ2h0KSBjb25zdCB7CgkJaWYgKGxlZnQuZW5kID4gcmlnaHQuZW5kKSB7IHJldHVybiB0cnVlOyB9CgkJaWYgKGxlZnQuZW5kIDwgcmlnaHQuZW5kKSB7IHJldHVybiBmYWxzZTsgfQoJCXJldHVybiBsZWZ0LnN0YXJ0ID4gcmlnaHQuc3RhcnQ7Cgl9Cn07IC8vIHN0cnVjdCBPcmRlckJ5RW5kCgp1c2luZyBDdXJyZW50bHlPdmVybGFwcGluZ1R5cGUgPSBzdGQ6OnByaW9yaXR5X3F1ZXVlPENvbm5lY3Rpb24sIHN0ZDo6ZGVxdWU8Q29ubmVjdGlvbj4sIE9yZGVyQnlFbmQ+OwoKc2l6ZV90IGNvdW50TWF4TnVtYmVyT2ZPdmVybGFwcyhzdGQ6Om1hcDx1aW50MzJfdCwgdWludDMyX3Q+IGNvbnN0JiBjb25uZWN0aW9ucykgewoJaWYgKGNvbm5lY3Rpb25zLmVtcHR5KCkpIHsgcmV0dXJuIDA7IH0KCQoJc2l6ZV90IG1heCA9IDA7CglDdXJyZW50bHlPdmVybGFwcGluZ1R5cGUgY3VycmVudGx5T3ZlcmxhcHBpbmc7CgoJZm9yIChhdXRvIGNvbnN0JiBjb246IGNvbm5lY3Rpb25zKSB7CgkJLy8gUHVyZ2Ugbm8gbG9uZ2VyIG92ZXJsYXBwaW5nIGNvbm5lY3Rpb25zCgkJd2hpbGUgKG5vdCBjdXJyZW50bHlPdmVybGFwcGluZy5lbXB0eSgpIGFuZCBjdXJyZW50bHlPdmVybGFwcGluZy50b3AoKS5lbmQgPCBjb24uZmlyc3QpIHsKCQkJY3VycmVudGx5T3ZlcmxhcHBpbmcucG9wKCk7CgkJfQoJCQoJCS8vIERlYnVnOgoJCWlmIChub3QgY3VycmVudGx5T3ZlcmxhcHBpbmcuZW1wdHkoKSkgewoJCQlzdGQ6OmNvdXQgPDwgIlsiIDw8IGNvbi5maXJzdCA8PCAiLCAiIDw8IGNvbi5zZWNvbmQgPDwKCQkJICAgICJdIGlzIG92ZXJsYXBwaW5nIHdpdGg6ICIgPDwgY3VycmVudGx5T3ZlcmxhcHBpbmcuc2l6ZSgpIDw8ICIgY29ubmVjdGlvbnNcbiI7CgkJfQoJCQoJCS8vIFRoZSBjdXJyZW50IGNvbm5lY3Rpb24gaXMgbmVjZXNzYXJpbHkgb3ZlcmxhcHBpbmcgd2l0aCBpdHNlbGYKCQljdXJyZW50bHlPdmVybGFwcGluZy5wdXNoKENvbm5lY3Rpb257Y29uLmZpcnN0LCBjb24uc2Vjb25kfSk7CgkJCgkJbWF4ID0gc3RkOjptYXgobWF4LCBjdXJyZW50bHlPdmVybGFwcGluZy5zaXplKCkpOwoJfQoJCglyZXR1cm4gbWF4Owp9IC8vIGNvdW50TWF4TnVtYmVyT2ZPdmVybGFwcwoKaW50IG1haW4oKSB7CglzdGQ6Om1hcDx1aW50MzJfdCwgdWludDMyX3Q+IGNvbnN0IGNvbm5lY3Rpb25zID0geyB7IDEwMCwgMTAwMCB9LAoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAxMjAsICAyMDAgfSwKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMjUwLCAgNDAwIH0sCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDYwMCwgIDgwMCB9IH07CgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIHNpemVfdCBjb25zdCBtYXggPSBjb3VudE1heE51bWJlck9mT3ZlcmxhcHMoY29ubmVjdGlvbnMpOwogICAgCiAgICBzdGQ6OmNvdXQgPDwgIk1heCBudW1iZXIgb2Ygb3ZlcmxhcHM6ICIgPDwgbWF4IDw8ICJcbiI7CglyZXR1cm4gMDsKfQ==