CSES - Kierrosten määrä

Tarkastellaan samaa prosessia kuin edellisessä tehtävässä, mutta nyt tulee laskea tehokkaasti, montako kierrosta prosessissa on yhteensä.

Esimerkiksi kun lista on [2,1,4,7,5,3,6,8], kierrokset ovat [1], [2,3], [4,5,6] ja [7,8]. Tässä tapauksessa prosessissa on yhteensä neljä kierrosta.

Toteuta tiedostoon fastrounds.py funktio count_rounds, jolle annetaan parametrina listan sisältö. Funktion tulee palauttaa kierrosten määrä.

Tässä tehtävässä lista voi olla suuri, minkä takia olisi liian hidasta käydä läpi lista vasemmalta oikealle joka kierroksella. Sinun tulee löytää tehokas tapa laskea kierrosten määrä ilman koko prosessin simulointia.

Seuraavassa koodipohjassa viimeisessä testissä lista sisältää luvut 1,2,\dots,10^5 käänteisessä järjestyksessä ja kierrosten määrä on 10^5. Funktiosi tulee pystyä laskemaan tämäkin tulos tehokkaasti.

def count_rounds(numbers):
    # TODO

if __name__ == "__main__":
    print(count_rounds([1, 2, 3, 4])) # 1
    print(count_rounds([1, 3, 2, 4])) # 2
    print(count_rounds([4, 3, 2, 1])) # 4
    print(count_rounds([1])) # 1
    print(count_rounds([2, 1, 4, 7, 5, 3, 6, 8])) # 4

    n = 10**5
    numbers = list(reversed(range(1, n+1)))
    print(count_rounds(numbers)) # 100000