3975 - Intervale AB

From Bitnami MediaWiki

Cerinţa[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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

Exemplu[edit | edit source]

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


Exemplu 2[edit | edit source]

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


Rezolvare[edit | edit source]

<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>