2510 - vsecvente

De la Universitas MediaWiki

Cerința

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

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

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

  • 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

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