#include <bits/stdc++.h>
using namespace std;
// part of question
class Booking {
public :
int bookingId;
int start;
int end;
Booking( int id, int s, int e) {
bookingId = id;
start = s;
end = e;
}
} ;
// part of question
class Court {
public :
int courtId;
vector< int > bookingIds;
Court( int courtId, vector< int > bookingIds) {
this- > courtId = courtId;
this- > bookingIds = bookingIds;
}
} ;
// our logic
class Event {
public :
int time ;
int bookingId;
string eventType; // either start or end
Event( int time , int bookingId, string eventType) {
this- > time = time ;
this- > bookingId = bookingId;
this- > eventType = eventType;
}
} ;
struct myCmp {
bool operator( ) ( Event a, Event b) {
if ( a.time == b.time ) {
return a.eventType < b.eventType ;
}
return a.time < b.time ;
}
} ;
vector< Court> assignCourts( vector< Booking> bookings) {
vector< Event> events;
for ( int i= 0 ; i< bookings.size ( ) ; i++ ) {
Event start( bookings[ i] .start , bookings[ i] .bookingId , "start" ) ;
Event end( bookings[ i] .end , bookings[ i] .bookingId , "end" ) ;
events.push_back ( start) ;
events.push_back ( end) ;
}
sort( events.begin ( ) , events.end ( ) , myCmp( ) ) ;
int totalNumberOfCourts = 0 ;
map< int , vector< int >> courtIdBookingIdList;
for ( int i= 0 ; i< events.size ( ) ; i++ ) {
if ( events[ i] .eventType == "start" ) {
totalNumberOfCourts++ ;
int courtId = totalNumberOfCourts;
courtIdBookingIdList[ courtId] .push_back ( events[ i] .bookingId ) ;
} else {
totalNumberOfCourts-- ;
}
}
vector< Court> answer;
for ( auto it = courtIdBookingIdList.begin ( ) ; it! = courtIdBookingIdList.end ( ) ; it++ ) {
Court court( it- > first, it- > second) ;
answer.push_back ( court) ;
}
return answer;
}
int main( ) {
vector< Booking> bookings;
bookings.push_back ( Booking( 101 , 1 , 4 ) ) ;
bookings.push_back ( Booking( 102 , 2 , 5 ) ) ;
bookings.push_back ( Booking( 103 , 6 , 8 ) ) ;
bookings.push_back ( Booking( 104 , 3 , 7 ) ) ;
bookings.push_back ( Booking( 105 , 9 , 10 ) ) ;
vector< Court> answer = assignCourts( bookings) ;
cout << "Total Courts Used = " << answer.size ( ) << endl;
for ( int i= 0 ; i< answer.size ( ) ; i++ ) {
int courtId = answer[ i] .courtId ;
vector< int > bookingIds = answer[ i] .bookingIds ;
for ( int i= 0 ; i< bookingIds.size ( ) ; i++ ) {
cout << "Court Id = " << courtId<< " BookingId " << bookingIds[ i] << endl;
}
}
return 0 ;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBwYXJ0IG9mIHF1ZXN0aW9uCmNsYXNzIEJvb2tpbmcgewogICAgcHVibGljIDogCiAgICAgICAgaW50IGJvb2tpbmdJZDsKICAgICAgICBpbnQgc3RhcnQ7CiAgICAgICAgaW50IGVuZDsKCiAgICAgICAgQm9va2luZyhpbnQgaWQsIGludCBzLCBpbnQgZSl7CiAgICAgICAgICAgIGJvb2tpbmdJZCA9IGlkOwogICAgICAgICAgICBzdGFydCA9IHM7CiAgICAgICAgICAgIGVuZCA9IGU7CiAgICAgICAgfQp9OwoKLy8gcGFydCBvZiBxdWVzdGlvbgpjbGFzcyBDb3VydCB7CiAgICBwdWJsaWM6CiAgICAgICAgaW50IGNvdXJ0SWQ7CiAgICAgICAgdmVjdG9yPGludD4gYm9va2luZ0lkczsKICAgICAgICAKICAgICAgICBDb3VydChpbnQgY291cnRJZCwgIHZlY3RvcjxpbnQ+IGJvb2tpbmdJZHMpIHsKICAgICAgICAgICAgdGhpcy0+Y291cnRJZCA9IGNvdXJ0SWQ7CiAgICAgICAgICAgIHRoaXMtPmJvb2tpbmdJZHMgPSBib29raW5nSWRzOwogICAgICAgIH0KfTsKCi8vIG91ciBsb2dpYwpjbGFzcyBFdmVudCB7CiAgICBwdWJsaWMgOiAKICAgICAgICBpbnQgdGltZTsKICAgICAgICBpbnQgYm9va2luZ0lkOwogICAgICAgIHN0cmluZyBldmVudFR5cGU7ICAgLy8gZWl0aGVyIHN0YXJ0IG9yIGVuZAoKICAgICAgICBFdmVudChpbnQgdGltZSwgaW50IGJvb2tpbmdJZCwgc3RyaW5nIGV2ZW50VHlwZSkgewogICAgICAgICAgICB0aGlzLT50aW1lID0gdGltZTsKICAgICAgICAgICAgdGhpcy0+Ym9va2luZ0lkID0gYm9va2luZ0lkOwogICAgICAgICAgICB0aGlzLT5ldmVudFR5cGUgPSBldmVudFR5cGU7CiAgICAgICAgfQp9OwoKc3RydWN0IG15Q21wIHsKICAgIGJvb2wgb3BlcmF0b3IoKShFdmVudCBhLCBFdmVudCBiKSB7CiAgICAgICAgaWYgKGEudGltZSA9PSBiLnRpbWUpIHsKICAgICAgICAgICAgcmV0dXJuIGEuZXZlbnRUeXBlIDwgYi5ldmVudFR5cGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhLnRpbWUgPCBiLnRpbWU7CiAgICB9Cn07CgoKCnZlY3RvcjxDb3VydD4gYXNzaWduQ291cnRzKHZlY3RvcjxCb29raW5nPiBib29raW5ncykgewoKICAgIHZlY3RvcjxFdmVudD4gZXZlbnRzOwogICAgZm9yIChpbnQgaT0wO2k8Ym9va2luZ3Muc2l6ZSgpOyBpKyspIHsKCiAgICAgICAgRXZlbnQgc3RhcnQoYm9va2luZ3NbaV0uc3RhcnQsIGJvb2tpbmdzW2ldLmJvb2tpbmdJZCwgInN0YXJ0Iik7CiAgICAgICAgRXZlbnQgZW5kKGJvb2tpbmdzW2ldLmVuZCwgYm9va2luZ3NbaV0uYm9va2luZ0lkLCAiZW5kIik7CgogICAgICAgIGV2ZW50cy5wdXNoX2JhY2soc3RhcnQpOwogICAgICAgIGV2ZW50cy5wdXNoX2JhY2soZW5kKTsKICAgIH0KCiAgICBzb3J0KGV2ZW50cy5iZWdpbigpLCBldmVudHMuZW5kKCksIG15Q21wKCkpOwoKCiAgICBpbnQgdG90YWxOdW1iZXJPZkNvdXJ0cyA9IDA7CiAgICBtYXA8aW50LCB2ZWN0b3I8aW50Pj4gY291cnRJZEJvb2tpbmdJZExpc3Q7CgogICAgZm9yIChpbnQgaT0wOyBpPGV2ZW50cy5zaXplKCk7IGkrKykgewoKICAgICAgICBpZiAoZXZlbnRzW2ldLmV2ZW50VHlwZSA9PSAic3RhcnQiKSB7CiAgICAgICAgICAgICAgdG90YWxOdW1iZXJPZkNvdXJ0cysrOwogICAgICAgICAgICAgIGludCBjb3VydElkID0gdG90YWxOdW1iZXJPZkNvdXJ0czsKICAgICAgICAgICAgICBjb3VydElkQm9va2luZ0lkTGlzdFtjb3VydElkXS5wdXNoX2JhY2soZXZlbnRzW2ldLmJvb2tpbmdJZCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdG90YWxOdW1iZXJPZkNvdXJ0cy0tOwogICAgICAgIH0KICAgIH0KCgogICAgdmVjdG9yPENvdXJ0PiBhbnN3ZXI7CiAgICBmb3IoYXV0byBpdCA9IGNvdXJ0SWRCb29raW5nSWRMaXN0LmJlZ2luKCk7IGl0IT1jb3VydElkQm9va2luZ0lkTGlzdC5lbmQoKTsgaXQrKyl7CiAgICAgICAgQ291cnQgY291cnQoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKICAgICAgICBhbnN3ZXIucHVzaF9iYWNrKGNvdXJ0KTsKICAgIH0KCiAgICByZXR1cm4gYW5zd2VyOwp9CgppbnQgbWFpbigpIHsKICAgIAogICAgdmVjdG9yPEJvb2tpbmc+IGJvb2tpbmdzOwogICAgYm9va2luZ3MucHVzaF9iYWNrKEJvb2tpbmcoMTAxLCAxLCA0KSk7CiAgICBib29raW5ncy5wdXNoX2JhY2soQm9va2luZygxMDIsIDIsIDUpKTsKICAgIGJvb2tpbmdzLnB1c2hfYmFjayhCb29raW5nKDEwMywgNiwgOCkpOwogICAgYm9va2luZ3MucHVzaF9iYWNrKEJvb2tpbmcoMTA0LCAzLCA3KSk7ICAgCiAgICBib29raW5ncy5wdXNoX2JhY2soQm9va2luZygxMDUsIDksIDEwKSk7ICAKCiAgICB2ZWN0b3I8Q291cnQ+IGFuc3dlciA9IGFzc2lnbkNvdXJ0cyhib29raW5ncyk7CgogICAgY291dDw8IlRvdGFsIENvdXJ0cyBVc2VkID0gIjw8YW5zd2VyLnNpemUoKTw8ZW5kbDsKCiAgICBmb3IoaW50IGk9MDtpPGFuc3dlci5zaXplKCk7aSsrKXsKICAgICAgICBpbnQgY291cnRJZCA9IGFuc3dlcltpXS5jb3VydElkOwogICAgICAgIHZlY3RvcjxpbnQ+IGJvb2tpbmdJZHMgPSBhbnN3ZXJbaV0uYm9va2luZ0lkczsKCiAgICAgICAgZm9yKGludCBpPTA7aTxib29raW5nSWRzLnNpemUoKTtpKyspIHsKICAgICAgICAgICAgY291dDw8IkNvdXJ0IElkID0gIjw8Y291cnRJZDw8IiBCb29raW5nSWQgIjw8Ym9va2luZ0lkc1tpXTw8ZW5kbDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDA7Cn0=