CSES - Varaukset

Annettuna on lista, jossa on varauksia päiväväleinä. Jokainen väli on pari (a,b)(a,b), missä 1ab1 \le a \le b: varaus alkaa päivänä aa ja päättyy päivänä bb.

Tehtäväsi on tutkia, onko listassa kahta varausta, jotka menevät päällekkäin eli niissä on yksi tai useampi yhteinen päivä.

Esimerkiksi lista [(4,7),(1,2)][(4,7),(1,2)] tarkoittaa, että ensimmäinen varaus on päivästä 44 päivään 77 ja toinen varaus on päivästä 11 päivään 22. Nämä varaukset eivät mene päällekkäin. Listassa [(4,7),(1,5)][(4,7),(1,5)] varaukset sen sijaan menevät päällekkäin, koska molemmat varaukset sisältävät päivät 44 ja 55.

Toteuta tiedostoon reservations.py funktio check_overlapping, jolle annetaan varaukset listana. Funktion tulee palauttaa True, jos jotkin kaksi varausta menevät päällekkäin, ja False muuten.

Sinun tulee toteuttaa funktio niin, että se käsittelee tehokkaasti myös suuren määrän varauksia. Funktion tulee antaa vastaus välittömästi myös tehtäväpohjan kahdessa viimeisessä testissä.

import random

def check_overlapping(reservations):
    # TODO

if __name__ == "__main__":
    print(check_overlapping([])) # False
    print(check_overlapping([(1, 3)])) # False
    print(check_overlapping([(4, 7), (1, 2)])) # False
    print(check_overlapping([(4, 7), (1, 5)])) # True
    print(check_overlapping([(1, 1), (2, 2)])) # False
    print(check_overlapping([(1, 1), (1, 1)])) # True
    print(check_overlapping([(2, 3), (5, 5), (3, 4)])) # True
    print(check_overlapping([(2, 3), (5, 5), (1, 4)])) # True
    print(check_overlapping([(2, 3), (5, 5), (1, 5)])) # True

    reservations = [(day, day) for day in range(1, 10**5+1)]
    random.shuffle(reservations)
    print(check_overlapping(reservations)) # False

    reservations.append((42, 1337))
    random.shuffle(reservations)
    print(check_overlapping(reservations)) # True