3003 - Intersectie: Difference between revisions

From Bitnami MediaWiki
No edit summary
 
Line 1: Line 1:
== Cerința ==
== Cerința ==
Se dau doi vectori de numere întregi. se determine vectorul care conține elementele comune celor doi vectori, sortat în ordine crescătoare.
Pe un cerc sunt așezate echidistant N puncte, etichetate în sensul acelor de ceas cu 1, 2, 3, …, N.
Se dau M intervale de forma [a, b] și T interogări de forma P Q.
 
Pentru fiecare interogare [P, Q] să se verifice dacă este adevărat sau fals că intersecția tuturor intervalelor care au puncte comune cu [P, Q] include intervalul [P, Q].
== Date de intrare ==
== Date de intrare ==
Programul citește de la tastatură doi vectori de numere întregi.
Fișierul de intrare intersectie.in conține pe primul rând numerele N, M și T. Pe următoarele M rânduri sunt scrise câte două numere naturale a b, separate prin spațiu, reprezentând capetele celor M intervale date. Pe următoarele T rânduri sunt scrise câte două numere naturale P Q, separate prin spațiu, reprezentând capetele celor T intervale de interogare date.
== Date de ieșire ==
== Date de ieșire ==
Pe ecran se va afișa mesajul: "Datele de intrare corespund restricțiilor impuse."
În fișierul de ieșire intersectie.out pe primele T rânduri este scris un număr natural: 1 dacă răspunsul la interogare este adevărat, respectiv 0 dacă răspunsul este fals.
În următorul rând se va afișa pe ecran vectorul cu elementele comune celor doi vectori, sortat în ordine crescătoare. Dacă nu există elemente comune, se va afișa un vector gol.
 
În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu corespund restricțiilor impuse."
În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu corespund restricțiilor impuse."
== Restricții și precizări ==
== Restricții și precizări ==
* Vectorii pot conține până la 100.000 de elemente fiecare.
*2 ≤ N ≤ 1.000.000.000
* 1 ⩽ '''numar_elemente_vector1''', '''numar_elemente_vector2''' ⩽ 100000
*1 ≤ M ≤ 100.000
*1 ≤ T ≤ 100.000
*1 ≤ P ≤ N, 1 ≤ Q ≤ N, P și Q sunt etichete date în sensul acelor de ceas
*1 ≤ a ≤ N, 1 ≤ b ≤ N, a și b sunt etichete date în sensul acelor de ceas
Dacă x = y, atunci [x, y] este un interval care conține doar numărul x
Pentru 30% din teste 1 ≤ M ≤ 1000 și 1 ≤ T ≤ 10.000
Pentru 30% din teste 1 ≤ N ≤ 1.000.000
== Exemplu 1 ==
== Exemplu 1 ==
;Intrare
;Intrare
1 2 3 4 5 <br>
intersectie.in<br>
3 4 5 6 7
5 3 3<br>
2 3<br>
5 1<br>
5 5<br>
4 4<br>
3 5<br>
1 1


;Iesire
;Iesire
Datele de intrare corespund restricțiilor impuse.
intersectie.out<br>
[3, 4, 5]
0<br>
 
0<br>
== Exemplu 2 ==
1
;Intrare
1 1 2 2 <br>
3 3 4 4


;Iesire
Datele de intrare corespund restricțiilor impuse.
[]


== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
def citeste_vectori():
def citeste_date():
     try:
     with open("intersectie.in", "r") as fin:
         vector_1 = list(map(int, input("Introduceți elementele primului vector: ").split()))
         N, M, T = map(int, fin.readline().strip().split())
         vector_2 = list(map(int, input("Introduceți elementele celui de-al doilea vector: ").split()))
        intervale = []
        return vector_1, vector_2
        for _ in range(M):
     except ValueError:
            a, b = map(int, fin.readline().strip().split()))
        return None, None
            intervale.append((a, b))
         interogari = []
        for _ in range(T):
            P, Q = map(int, fin.readline().strip().split()))
            interogari.append((P, Q))
     return N, M, T, intervale, interogari


def include_intervalul(P, Q, start_min, end_max, N):
    if P <= Q:
        if start_min <= P and Q <= end_max:
            return 1
        else:
            return 0
    else:
        if (start_min <= P or Q <= end_max):
            return 1
        else:
            return 0


def valideaza_date(vector_1, vector_2):
def verifica_interogari(N, M, T, intervale, interogari):
     if len(vector_1) <= 100000 and len(vector_2) <= 100000:
     rezultate = []
        if all(-10 ** 9 <= elem <= 10 ** 9 for elem in vector_1) and all(
    for P, Q in interogari:
                 -10 ** 9 <= elem <= 10 ** 9 for elem in vector_2):
        start_min, end_max = 1, N
            return True
        for a, b in intervale:
    return False
            if a <= b:
 
                if a <= Q and P <= b:
 
                    start_min = max(start_min, a)
def intersectie_sortata(vector_1, vector_2):
                    end_max = min(end_max, b)
    set_1 = set(vector_1)
            else:
    set_2 = set(vector_2)
                 if a <= Q or P <= b:
    intersectie = sorted(set_1 & set_2)
                    start_min = max(start_min, a)
     return intersectie
                    end_max = min(end_max, b)
        rezultate.append(include_intervalul(P, Q, start_min, end_max, N))
     return rezultate


def scrie_rezultate(rezultate):
    with open("intersectie.out", "w") as fout:
        for rezultat in rezultate:
            fout.write(f"{rezultat}\n")


def main():
def main():
     vector_1, vector_2 = citeste_vectori()
     N, M, T, intervale, interogari = citeste_date()
 
     if not (2 <= N <= 1_000_000_000 and 1 <= M <= 100_000 and 1 <= T <= 100_000):
     if vector_1 is None or vector_2 is None:
         print("Datele de intrare nu corespund restricțiilor impuse.")
         print("Datele de intrare nu corespund restricțiilor impuse.")
         return
         return


     if valideaza_date(vector_1, vector_2):
     rezultate = verifica_interogari(N, M, T, intervale, interogari)
        print("Datele de intrare corespund restricțiilor impuse.")
     scrie_rezultate(rezultate)
        rezultat = intersectie_sortata(vector_1, vector_2)
        print(rezultat)
     else:
        print("Datele de intrare nu corespund restricțiilor impuse.")
 


if __name__ == "__main__":
if __name__ == "__main__":

Latest revision as of 20:31, 2 June 2024

Cerința[edit | edit source]

Pe un cerc sunt așezate echidistant N puncte, etichetate în sensul acelor de ceas cu 1, 2, 3, …, N. Se dau M intervale de forma [a, b] și T interogări de forma P Q.

Pentru fiecare interogare [P, Q] să se verifice dacă este adevărat sau fals că intersecția tuturor intervalelor care au puncte comune cu [P, Q] include intervalul [P, Q].

Date de intrare[edit | edit source]

Fișierul de intrare intersectie.in conține pe primul rând numerele N, M și T. Pe următoarele M rânduri sunt scrise câte două numere naturale a b, separate prin spațiu, reprezentând capetele celor M intervale date. Pe următoarele T rânduri sunt scrise câte două numere naturale P Q, separate prin spațiu, reprezentând capetele celor T intervale de interogare date.

Date de ieșire[edit | edit source]

În fișierul de ieșire intersectie.out pe primele T rânduri este scris un număr natural: 1 dacă răspunsul la interogare este adevărat, respectiv 0 dacă răspunsul este fals. În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu corespund restricțiilor impuse."

Restricții și precizări[edit | edit source]

  • 2 ≤ N ≤ 1.000.000.000
  • 1 ≤ M ≤ 100.000
  • 1 ≤ T ≤ 100.000
  • 1 ≤ P ≤ N, 1 ≤ Q ≤ N, P și Q sunt etichete date în sensul acelor de ceas
  • 1 ≤ a ≤ N, 1 ≤ b ≤ N, a și b sunt etichete date în sensul acelor de ceas

Dacă x = y, atunci [x, y] este un interval care conține doar numărul x Pentru 30% din teste 1 ≤ M ≤ 1000 și 1 ≤ T ≤ 10.000 Pentru 30% din teste 1 ≤ N ≤ 1.000.000

Exemplu 1[edit | edit source]

Intrare

intersectie.in
5 3 3
2 3
5 1
5 5
4 4
3 5
1 1

Iesire

intersectie.out
0
0
1


Rezolvare[edit | edit source]

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

   with open("intersectie.in", "r") as fin:
       N, M, T = map(int, fin.readline().strip().split())
       intervale = []
       for _ in range(M):
           a, b = map(int, fin.readline().strip().split()))
           intervale.append((a, b))
       interogari = []
       for _ in range(T):
           P, Q = map(int, fin.readline().strip().split()))
           interogari.append((P, Q))
   return N, M, T, intervale, interogari

def include_intervalul(P, Q, start_min, end_max, N):

   if P <= Q:
       if start_min <= P and Q <= end_max:
           return 1
       else:
           return 0
   else:
       if (start_min <= P or Q <= end_max):
           return 1
       else:
           return 0

def verifica_interogari(N, M, T, intervale, interogari):

   rezultate = []
   for P, Q in interogari:
       start_min, end_max = 1, N
       for a, b in intervale:
           if a <= b:
               if a <= Q and P <= b:
                   start_min = max(start_min, a)
                   end_max = min(end_max, b)
           else:
               if a <= Q or P <= b:
                   start_min = max(start_min, a)
                   end_max = min(end_max, b)
       rezultate.append(include_intervalul(P, Q, start_min, end_max, N))
   return rezultate

def scrie_rezultate(rezultate):

   with open("intersectie.out", "w") as fout:
       for rezultat in rezultate:
           fout.write(f"{rezultat}\n")

def main():

   N, M, T, intervale, interogari = citeste_date()
   if not (2 <= N <= 1_000_000_000 and 1 <= M <= 100_000 and 1 <= T <= 100_000):
       print("Datele de intrare nu corespund restricțiilor impuse.")
       return
   rezultate = verifica_interogari(N, M, T, intervale, interogari)
   scrie_rezultate(rezultate)

if __name__ == "__main__":

   main()

</syntaxhighlight>