Professional Documents
Culture Documents
Neka je rezultat u prvoj utakmici bio A:B, a u drugoj C:D. Tada je broj
pogodaka NK Maslina jednak A+D, a broj pogodaka NK Drača je B+C.
1)a xor b = b xor a
2)a xor a = 0
3)a xor 0 = a
Kombiniranjem ovih svojstava lagano je zaključiti kako je dovoljno, za svaki
indeks, ispisati xor svih slova iz ulaza koja se pojavljuju na tom indeksu.
Formalni dokaz, po običaju, ostavljamo čitateljici za vježbu.
2 1 1 3 4 3 4 2
Ante može uzeti bilo koji broj iz niza i premjestiti ga na drugo mjesto. Tim
operacijama, u najmanjem broju koraka, mora dobiti niz:
1 1 2 2 3 3 4 4
Pronađimo najdulji podniz elemenata koji su relativno u dobrom poretku u
nizu:
2 1 1 3 4 3 4 2
Zadatak nas traži broj pravokutnika kojima su sva polja jednaka. Pokušajmo
prvo riješiti jednostavniju verziju zadatka; postoje samo dva tipa polja: 0 i 1 i
potrebno je prebrojiti broj pravokutnika koji nemaju nula tj. ispunjeni su samo
jedinicama.
Pokušajmo prebrojiti te pravokutnike na način da im fiksiramo donji desni kut.
Također, pokušajmo prebrojavati s lijeva na desno, spustajući se po retcima.
Dodatno, definirajmo a[x][y] kao broj jedinica do prve nule prema vrhu
matrice. (x je vertikalna komponente, y je horizontalna)
Ostaje nam još prebrojiti broj pravokutnika koji imaju lijevi kraj desnije od z-a.
Takvih pravokutnika ima (y - z)*a[x][y] iz razloga što su svi stupci do z-a viši
ili jednaki stupcu na a[x][y], što znači da je svaka visina pravokutnika, bilo
koje širine do širine y-z moguća.
Potrebno je još nekako održavati strukturu koja nam odgovara na pitanje prvi
stupac lijevo, manji od trenutnog stupca. To možemo napraviti koristeći stog ili
neku od naprednijih struktura podataka poput logaritamske ili tournament
stabla.
Promatrajmo neka dva susjedna polja. Stabla u tim poljima mogu najviše u
jednom trenutku biti jednake visine. Trenutak u kojem stabla u neka dva
susjedna polja postanu jednake visine ćemo zvati događajem.
Događaja ima manje od 4N. Za svaki događaj možemo iskoristiti DFS (ili BFS)
za širenje iz polja u kojima su stabla postale iste visine i brojanje stabala u
komponenti pri tome pazeći da za određeni trenutak ne prođemo više od
jednom po nekom polju.
Taj algoritam ima složenost O(N2) jer ćemo kroz svako polje proći najviše 4
puta (jednom za svaki događaj u koji je uključeno to polje).
postavi niz T na 0
rješenje = 0
za B od 1 do N
podnizovi se proširuju s [A,B1] na [A,B] dodavanjem X[B]
stoga osvježi vrijednosti u nizu T na pozicijama 1 do B
dodaj na rješenje T[1] + T[2] + … + T[B]
len- duljina intervala članova niza koje čvor pokriva, npr. za listove vrijedi
len=1
sm- suma vrijednosti msvih članova intervala
sM- suma vrijednosti Msvih članova intervala
sL- suma vrijednosti Lsvih članova intervala
smM- suma vrijednosti m*Msvih članova intervala
smL- suma vrijednosti m*Lsvih članova intervala
sML- suma vrijednosti M*Lsvih članova intervala
smML- suma vrijednosti m*M*Lsvih članova intervala
Preostaje nam još efikasno pronalaziti najdesniji manji odnosno veći broj od
trenutnog X[B]. To se na jednostavan način ostvaruje korištenjem stoga,
objasnit ćemo ovdje pronalaženje najdesnije manje vrijednosti koja je lijevo od
X[B], a pronalaženje najdesnije veće se ostvaruje na sličan način.
Ako uzmemo u obzir da se Bpomiče s lijeva na desno, od 1 do N, onda zapravo
govorimo o zadnjem članu niza Xkojega smo prošli, a koji je manji od X[B].
Za svaki Bsa vrha stoga ćemo skinuti sve brojeve veće ili jednake X[B]budući
da oni više nikada ne mogu biti nečiji zadnji manji broj (X[B]je manji od njih i
nalazi se nakon njih). Nakon toga na vrhu stoga će biti upravo član niza X
kojega smo tražili, zadnji manji od X[B]. Prije povećanja Bi pomicanja u
desno, stavljamo X[B]na stog. Dani algoritam je linearne složenosti jer se
svaki član niza jednom stavlja i najviše jednom skida sa stoga.