2510 - vsecvente

From Bitnami MediaWiki

Cerința[edit | edit source]

Considerăm un șir de numere naturale nenule a[1], a[2], …, a[n]. În acest șir o V-secvență este o secvență maximală de forma a[x], a[x+1], …, a[y] cu proprietatea că toate numerele din secvență au valori mai mici sau egale cu V. Este maximală pentru că nu poate fi extinsă spre stânga sau spre dreapta. De exemplu, șirul a = 2, 2, 6, 4, 3, 14, 7, 4, 3, 36 are două 7-secvențe: 2, 2, 6, 4, 3 și 7, 4, 3. De asemenea, șirul are trei 4-secvențe: 2,2; 4,3; 4,3. De notat că 2,6,4,3 nu este 7-secvență, deoarece poate fi extinsă la capătul său stâng cu numărul 2. Pentru un șir de numere dat, trebuie să răspundeți la Q întrebări notate V[1], V[2],…, V[Q]. Pentru fiecare întrebare i, dată prin numărul natural V[i], trebuie să aflați câte V[i]-secvențe sunt în șir.

Date de intrare[edit | edit source]

Fișierul de intrare vsecvente.in conține pe prima linie numărul natural N. Pe a doua linie, separate prin câte un spațiu, se află cele N elemente ale șirului. Pe a treia linie se află un singur număr natural Q reprezentând numărul de întrebări. Pe a patra linie, se află șirul de Q numere naturale V[1], V[2],…, V[Q], separate prin câte un spațiu.

Date de ieșire[edit | edit source]

Fișierul de ieșire vsecvente.out va conține Q linii. Linia a i-a va conține numărul de V[i]-secvențe aflate în șir.

Exemplu 1[edit | edit source]

  • 1 ≤ toate numerele din fișierul de intrare ≤ 1 100 000
  • Pentru teste totalizând 75 puncte, 1 ≤ toate numerele din fișierul de intrare ≤ 550 000
Intrare

10
2 2 6 4 3 14 7 4 3 36
3
7 1 4

Iesire

2
0
3

Rezolvare[edit | edit source]

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

   # Citirea datelor de intrare
   with open('vsecvente.in', 'r') as f:
       data = f.read().splitlines()
   # Prima linie conține numărul N
   N = int(data[0].strip())
   # Asigurăm că 1 ≤ N ≤ 100000
   assert 1 <= N <= 100000, "N trebuie să fie între 1 și 100000"
   # A doua linie conține N elemente ale șirului
   sir = list(map(int, data[1].strip().split()))
   # Verificăm că lungimea șirului este corectă
   assert len(sir) == N, "Lungimea șirului trebuie să fie N"
   # A treia linie conține numărul de întrebări Q
   Q = int(data[2].strip())
   # Asigurăm că 1 ≤ Q ≤ 100000
   assert 1 <= Q <= 100000, "Q trebuie să fie între 1 și 100000"
   # A patra linie conține Q valori pentru interogări
   interogari = list(map(int, data[3].strip().split()))
   # Verificăm că lungimea interogărilor este corectă
   assert len(interogari) == Q, "Numărul interogărilor trebuie să fie Q"
   # Asigurăm că toate elementele din șir sunt între 1 și 1,000,000,000
   for elem in sir:
       assert 1 <= elem <= 1000000000, "Elementele șirului trebuie să fie între 1 și 1,000,000,000"
   # Asigurăm că toate interogările sunt între 1 și 1,000,000,000
   for interogare in interogari:
       assert 1 <= interogare <= 1000000000, "Interogările trebuie să fie între 1 și 1,000,000,000"
   rezultate = []
   # Pentru fiecare interogare, calculăm numărul de secvențe maxime pentru valoarea V
   for V in interogari:
       count = 0
       in_sequence = False
       for num in sir:
           if num <= V:
               if not in_sequence:
                   in_sequence = True
                   count += 1
           else:
               in_sequence = False
       rezultate.append(count)
   # Scrierea rezultatelor în fișierul de ieșire
   with open('vsecvente.out', 'w') as f:
       for rezultat in rezultate:
           f.write(f"{rezultat}\n")

if __name__ == "__main__":

   main()

</syntaxhighlight>