3729 - Exclusiv

From Bitnami MediaWiki
Revision as of 16:31, 3 June 2024 by AjM (talk | contribs) (Pagină nouă: == Enunt == Se consideră doi vectori care conțin numere naturale: s cu M elemente și v cu N elemente. Numim secvență i-exclusivă o secvență a vectorului s care nu conține niciuna dintre valorile v[1], v[2], …, v[i]. == Cerinţa == Scrieți un program care să determine, pentru orice 1 ≤ i ≤ N, lungimea maximă a unei secvențe i-exclusive. == Date de intrare == Fișierul de intrare exclusiv.in conține pe prima linie numerele naturale M și N. Pe linia a doua s...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Enunt[edit | edit source]

Se consideră doi vectori care conțin numere naturale: s cu M elemente și v cu N elemente. Numim secvență i-exclusivă o secvență a vectorului s care nu conține niciuna dintre valorile v[1], v[2], …, v[i].

Cerinţa[edit | edit source]

Scrieți un program care să determine, pentru orice 1 ≤ i ≤ N, lungimea maximă a unei secvențe i-exclusive.

Date de intrare[edit | edit source]

Fișierul de intrare exclusiv.in conține pe prima linie numerele naturale M și N. Pe linia a doua se află M numere naturale reprezentând elementele vectorului s, iar pe linia a treia N numere naturale reprezentând elementele vectorului v. Valorile scrise pe aceeași linie sunt separate prin câte un spațiu.

Date de ieșire[edit | edit source]

Fișierul de ieșire exclusiv.out va conține N linii. Pe linia i (1 ≤ i ≤ N) va fi scris un număr natural care reprezintă lungimea maximă a unei secvențe i-exclusive.

Restricţii şi precizări[edit | edit source]

  • 1 ≤ N ≤ 2.000
  • 3 ≤ M ≤ 100.000
  • Vectorii s și v conțin numere naturale mai mici sau egale cu 2.000.000.000, memorate începând cu poziția 1
  • Valorile din fiecare vector nu sunt obligatoriu distincte două câte două.
  • O subsecvență nevidă în s este formată din elemente situate pe poziții consecutive (s[i], s[i + 1], …, s[j]), i ≤ j. O subsecvență i-exclusivă poate fi și vidă, lungimea ei fiind 0.

Exemplu[edit | edit source]

exclusiv.in
20 6
11 5 11 7 2 10 11 9 2 77 88 88 88 2 7 2 2 77 2 11 
11 5 7 9 5 2
exclusiv.out
12
12
7
6
6
4


Explicație[edit | edit source]

Cea mai lungă secvență 1-exclusivă (care nu conține valoarea 11) este 9 2 77 88 88 88 2 7 2 2 77 2 și are lungimea 12. Cea mai lungă secvență 2-exclusivă (care nu conține valorile 11 și 5) este 9 2 77 88 88 88 2 7 2 2 77 2 și are lungimea 12. Cea mai lungă secvență 3-exclusivă (care nu conține valorile 11, 5 și 7) este 9 2 77 88 88 88 2 și are lungimea 7. Cea mai lungă secvență 4-exclusivă (care nu conține valorile 11, 5, 7 și 9) este 2 77 88 88 88 2 și are lungimea 6. Cea mai lungă secvență 5-exclusivă (care nu conține valorile 11, 5 7, 9 și 5) este 2 77 88 88 88 2 și are lungimea 6. Cea mai lungă secvență 6-exclusivă (care nu conține valorile 11, 5, 7, 9, 5 și 2) este 77 88 88 88 și are lungimea 4.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def longest_exclusive_sequence(s, v):

   last_position = {value: -1 for value in v}
   longest_sequence = 0
   current_sequence = 0
   for value in s:
       if value in last_position:
           current_sequence = min(current_sequence + 1, 1 + last_position[value])
       else:
           current_sequence += 1
       last_position[value] = current_sequence
       longest_sequence = max(longest_sequence, current_sequence)
   return longest_sequence

def main():

   M, N = map(int, input().split())
   s = list(map(int, input().split()))
   v = list(map(int, input().split()))
   result = []
   for i in range(N):
       result.append(longest_exclusive_sequence(s, v[:i+1]))
   for length in result:
       print(length)

if __name__ == "__main__":

   main()

</syntaxhighlight>