3975 - Intervale AB

From Bitnami MediaWiki

Cerinţa

Dându-se N intervale [a, b], calculați numărul maxim de astfel de intervale care se intersectează în cel puțin un punct.

Date de intrare

Fișierul de intrare intervalein.txt conține pe prima linie numărul N, iar pe următoarele N linii 2 numere naturale separate prin spații, reprezentând limitele intervalelor [a, b].

Date de ieșire

Fișierul de ieșire intervaleout.txt va conține pe prima linie numărul mx, reprezentând numărul maxim de intervale care se intersectează în cel puțin un punct.

Restricţii şi precizări

  • 1 ⩽ N ⩽ 100.000
  • -2.000.000.000 ⩽ a ⩽ b ⩽ 2.000.000.000

Exemplu

intervalein.txt
5
1 5
3 4
-10 10
-23 -20
100 200
intervaleout.txt
Datele de intrare corespund restrictiilor impuse.
3


Exemplu 2

intervalein.txt
-1
1 5
3 4
-10 10
-23 -20
100 200
intervaleout.txt
Datele de intrare nu corespund restrictiilor impuse.


Rezolvare

<syntaxhighlight lang="python" line> def max_intersecting(intervals):

   # Sortăm intervalele după capătul drept
   intervals.sort(key=lambda x: x[1])
   # Inițializăm o listă pentru a stoca intervalele în curs de procesare
   current_intervals = []
   # Inițializăm numărul maxim de intervale care se intersectează
   max_inter = 0
   for interval in intervals:
       # Adăugăm intervalul curent la lista de intervale în curs de procesare
       current_intervals.append(interval)
       # Eliminăm intervalele care s-au terminat
       while current_intervals and current_intervals[0][1] < interval[0]:
           current_intervals.pop(0)
       # Actualizăm numărul maxim de intervale care se intersectează
       max_inter = max(max_inter, len(current_intervals))
   return max_inter


def main():

   # Deschidem fișierul de intrare și citim datele
   with open('intervalein.txt', 'r') as f:
       n = int(f.readline().strip())
       intervals = [list(map(int, f.readline().strip().split())) for _ in range(n)]
   # Verificăm dacă numărul de intervale respectă restricțiile
   if 1 <= n <= 100000 and all(-2000000000 <= a <= b <= 2000000000 for a, b in intervals):
       # Dacă da, calculăm numărul maxim de intervale care se intersectează
       result = max_intersecting(intervals)
       status = "Datele de intrare corespund restrictiilor impuse."
   else:
       # Dacă nu, afișăm un mesaj de eroare
       result = ""
       status = "Datele de intrare nu corespund restrictiilor impuse."
   # Scriem rezultatul în fișierul de ieșire
   with open('intervaleout.txt', 'w') as f:
       f.write(status + '\n' + str(result))


if __name__ == "__main__":

   main()

</syntaxhighlight>