Editorial for Marsovci
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Analiza
Opišimo ključne korake u rešavanju svakog podzadatka.
Podzadatak
U prvom podzadatku, dovoljno dobro je i bruteforce rešenje. Prolaskom kroz svaki mogući podniz uzastopnih Marsovaca određujemo maksimalnu i minimalnu visinu u njemu, njihovu razliku, i brojimo podnizove gde je ta razlika maksimalna. Ovaj pristup ima vremensku složenost .
Podzadatak
Mala modifikacija prethodnog pristupa može dovesti do vremenske složenosti . Ako prolazak kroz sve podnizove vršimo tako što fiksiramo levu granicu , a zatim pomeramo desnu granicu , možemo u naći maksimum i minimum u svakom podnizu na osnovu prethodno izračunatih rešenja. Konkretno, imamo da je . Slično važi i za minimum.
Podzadatak
U ovom momentu, neophodno je napraviti par bitnih opservacija koje predstavljaju prvi korak ka kompletnom rešenju zadatka.
Označimo sa i visinu najnižeg, odnosno najvišeg Marsovca. Sada primećujemo da je najveća moguća razlika najvišeg i najnižeg Marsovca u nekom podnizu uzastopnih Marsovaca jednaka . Veću razliku nije moguće dobiti, a upravo ova razlika se dobija u bilo kom podnizu u kom je maksimum a minimum - npr. ceo niz. Takođe, važi da je maksimum u nekom podnizu jednak ako i samo ako se u njemu nalazi bar jedna vrednost (slično važi i za minimum). Sada se zadatak može svesti na brojanje podnizova koji sadrže barem jednog Marsovca visine i barem jednog Marsovca visine .
Dodatni uslov koji ovaj podzadatak unosi je da se vrednosti i pojavljuju tačno jednom u nizu visina. Označimo indeks (jedinstvenog) najvišeg Marsovca sa a najnižeg sa i uzmimo da je (ne umanjujući opštost) . Sada do rešenja dolazimo u konstantnom vremenu, uz malo računa. Kako leva granica podniza ne sme biti veća od (inače se ne nalazi u tom podnizu), a desna manja od (inače se ne nalazi u tom podnizu) broj podnizova koji sadrže i i je jednak . Vremenska složenost ovog pristupa je .
Podzadatak
Ovde je potrebno malo komplikovanije rešenje, budući da dodatni uslov iz prethodnog podzadatka ne važi, pa najviši (tj. najniži) Marsovac ne mora biti jedinstven. Brojanju podnizova pristupamo tako što pomeramo brojač od početka do kraja niza i u svakom koraku računamo koliko ima podnizova čija je leva granica a da sadrže barem jednog Marsovca visine i barem jednog Marsovca visine . Kako bismo ovo efikasno izračunali u toku cele procedure održavamo dva pokazivača i koji, za trenutno , pokazuju na prvo pojavljivanje Marsovca visine (odnosno ) od pozicije pa do kraja niza (uključujući i ). Kako je leva granica podniza fiksirana na , a desna granica ne sme biti manja od , u svakom koraky na konačno rešenje dodajemo .
Ostalo je još da prodiskutujemo kako se ovi pokazivači efikasno održavaju: ako nakon inkrementovanja važi nije potrebna korekcija, a u suprotnom uvećavamo za jedan sve do prvog narednog pojavljivanja (ako naredno pojavljivanje ne postoji, možemo odmah prestati sa brojanjem i ispisati trenutno rešenje). Analogno održavamo i drugi pokazivač.
Iako se u jednom koraku uvećanje pomenutih pokazivača može dogoditi i do puta, u toku cele procedure će oni, kao i , preći put od početka do kraja niza, pa je ukupna vremenska složenost rešenja .
Comments