Takmičarsko programiranje • Državno • SIO

Priprema za državno takmičenje i SIO iz informatike

Kompletan plan pripreme za učenike 8. razreda i 1. godine srednje škole. Fokus je na razvoju algoritamskog razmišljanja, dinamičkog programiranja, grafova, kombinatorike i naprednih takmičarskih tehnika.

□ Dinamičko programiranje
□ Graf algoritmi
⚡ SIO nivo
□ Takmičarski zadaci

11-nedeljni plan pripreme

Plan je namenjen učenicima koji već imaju osnovno iskustvo sa rekurzijom, kombinatorikom i osnovnim algoritmima, i žele da pređu na državni i SIO nivo takmičenja.

Fokus nije samo na učenju algoritama, već i na razvoju načina razmišljanja koji je potreban za rešavanje kompleksnih takmičarskih problema.

Osnovni nivo
Rekurzija i kombinatorika
Permutacije, kombinacije, memoizacija i prvi koraci ka DP-u.
Srednji nivo
Dinamičko programiranje i grafovi
Klasični DP problemi, BFS, DFS, Dijkstra i modelovanje stanja.
Napredni nivo
SIO i olimpijski zadaci
Interaktivni problemi, optimizacije i napredne strukture podataka.
Preporučeno predznanje:
  • rekurzija i backtracking
  • kombinatorika
  • sortiranje i binarna pretraga
  • osnovne strukture podataka
Kako koristiti ovaj plan?
  • ✔ Prvo pročitaj kompletan roadmap.
  • ✔ Fokusiraj se samo na trenutnu nedelju.
  • ✔ Vežbaj svakodnevno makar 1–2 zadatka.
  • ✔ Analiziraj kompleksnost svakog rešenja.

Nedelja 1 — Rekurzija i algoritamsko razmišljanje

Prva nedelja je posvećena razvijanju načina razmišljanja koji je neophodan za takmičarsko programiranje. Fokus nije samo na pisanju koda, već na tome kako se problem razlaže na manje podprobleme.

Rekurzija predstavlja osnovu za kasnije oblasti kao što su backtracking, dinamičko programiranje, DFS i napredne pretrage stanja.

Glavni cilj: naučiti kako da problem posmatraš kroz manje podprobleme i kako da pratiš tok izvršavanja rekurzivnih poziva.

Teme koje treba savladati

  • Osnovna rekurzija i povratak iz funkcije
  • Rekurzivno računanje sume, stepena i faktorijela
  • Rekurzivni obilazak nizova i stringova
  • Praćenje stabla rekurzivnih poziva
  • Razlika između iterativnog i rekurzivnog pristupa
  • Vremenska složenost jednostavne rekurzije
  • Memoizacija kao uvod u dinamičko programiranje
  • Hanojske kule i analiza rekurzivnog stabla
Početni nivo
Rekurzija — uvod i osnovni primeri
Osnove rekurzije, bazni slučaj i jednostavni primeri.
Otvori lekciju →
Početni nivo
Rekurzivni algoritmi
Detaljna objašnjenja rekurzivnog modela.
Otvori lekciju →
Srednji nivo
Fibonacci i faktorijel rekurzijom
Klasični primeri rekurzije i analiza broja poziva.
Otvori lekciju →
Napomena: Rekurzija mora uvek voditi ka manjem problemu i imati ispravan bazni slučaj.

Predloženi zadaci za vežbu

Nedelja 2 — Backtracking i generisanje kombinacija

Nakon osnova rekurzije prelazi se na backtracking — sistematsko pretraživanje prostora rešenja uz vraćanje na prethodno stanje.

Glavna ideja: izbor → dublje → povratak → sledeća opcija

Backtracking se može posmatrati kao rekurzija + provera uslova. Za razliku od obične grube sile (brute-force), kod backtracking pristupa ne ispitujemo bespotrebno sva moguća rešenja, već rano odbacujemo grane koje sigurno ne mogu dovesti do validnog rezultata.

Teme koje treba savladati

  • Permutacije i kombinacije
  • Podskupovi
  • Backtracking stablo
  • Pruning (odsecanje grana)
  • DFS u prostoru rešenja
  • Razlika između brute-force i backtracking pristupa
  • Generisanje rešenja sa ograničenjima
Početni nivo
Backtracking algoritmi
Osnovni princip pretrage prostora rešenja.
Otvori lekciju →
Početni nivo
Permutacije i kombinacije
Generisanje svih kombinatornih struktura.
Otvori lekciju →
Srednji nivo
Kombinatorika za takmičenja
Povezivanje rekurzije i kombinatorike.
Otvori lekciju →
Srednji nivo
Backtracking i gruba sila
Poređenje brute-force i backtracking pristupa uz praktične primere.
Otvori lekciju →
Važno: Backtracking ima eksponencijalnu složenost, pa je pravilno odsecanje grana (pruning) često presudno za prolazak zadatka u zadatom vremenu.

Predloženi zadaci za vežbu

Univerzalna šema za backtracking

Kod svakog zadatka pokušaj da identifikuješ:
  • Stanje — šta trenutno znaš?
  • Izbor — koje opcije možeš da probaš?
  • Validnost — da li je parcijalno rešenje dozvoljeno?
  • Prekid — kada je rešenje kompletno?
Ova četiri koraka predstavljaju osnovu gotovo svih backtracking problema na školskim, okružnim i državnim takmičenjima.

Nedelja 3 — Sortiranje, binarna pretraga i složenost

Fokus ove nedelje je na algoritmima koji se veoma često pojavljuju na školskim, okružnim i državnim takmičenjima. Dobro poznavanje sortiranja, binarne pretrage i vremenske složenosti često omogućava da se zadatak reši višestruko brže od naivnog pristupa.

Cilj: razumeti kada koristiti O(n log n) algoritme i kako optimizovati pretragu korišćenjem sortiranja i binarne pretrage.

Teme koje treba savladati

  • Merge Sort
  • Quick Sort
  • STL sort i comparator funkcije
  • Binarna pretraga
  • Lower Bound i Upper Bound
  • Sortiranje po više kriterijuma
  • Analiza vremenske složenosti
  • Binary Search on Answer
Početni nivo
Merge Sort
Podeli-pa-vladaj pristup i sortiranje u O(n log n).
Otvori lekciju →
Srednji nivo
Binarna pretraga
Pronalaženje rešenja u logaritamskom vremenu.
Otvori lekciju →
Srednji nivo
Sortiranje nizova
Analiza i poređenje najvažnijih algoritama sortiranja.
Otvori lekciju →
Srednji nivo
Efikasni algoritmi sortiranja
Upoređivanje složenosti i primena u takmičarskim zadacima.
Otvori lekciju →
Napomena: Binarna pretraga nije ograničena samo na pretragu u nizu. Veoma često se koristi za pronalaženje najmanjeg ili najvećeg rešenja koje zadovoljava određeni uslov (binary search on answer).

Predloženi zadaci za vežbu

Srednji nivo
Efikasni algoritmi pretraživanja
Linearna, binarna i napredne tehnike pretrage.
Otvori lekciju →
Takmičarski savet:
Kada primetiš da zadatak traži najmanju ili najveću vrednost koja zadovoljava određeni uslov, proveri da li se odgovor može pronaći binarnom pretragom. Takvi zadaci se veoma često pojavljuju na okružnim, državnim i međunarodnim takmičenjima.

Nedelja 4 — Uvod u dinamičko programiranje (DP)

U ovoj nedelji uvodimo ključne ideje iz dinamičkog programiranja (DP) — tehnike koja omogućava rešavanje problema koje bi čista rekurzija rešavala presporo, tako što pamti rezultate već obrađenih podproblema.

Glavni cilj: naučiti kako da prepoznaš probleme sa ponavljanjem podproblema i da ih transformišeš iz sporih rekurzivnih rešenja u efikasne DP algoritme.

Teme koje treba savladati

  • Preklapanje podproblema (Overlapping Subproblems)
  • Optimalna podstruktura (Optimal Substructure)
  • Definisanje DP stanja (State)
  • DP prelazi (Transitions)
  • Memoizacija (Top-Down DP)
  • Tabulacija (Bottom-Up DP)
  • Optimizacija memorije
  • Fibonacci kao uvodni DP primer
DP šablon razmišljanja:
  • 1️⃣ Definiši stanje — dp[...]
  • 2️⃣ Odredi bazne slučajeve
  • 3️⃣ Napiši prelaze između stanja
  • 4️⃣ Izaberi redosled računanja (top-down ili bottom-up)

Glavni koncepti

  • Preklapanje podproblema — isti podproblemi se pojavljuju više puta tokom rekurzije.
  • Optimalna podstruktura — optimalno rešenje problema može se sastaviti od optimalnih rešenja manjih podproblema.
  • State & Transition — najvažniji korak je pravilno definisanje značenja DP stanja i prelaza.
Važno:

Najveći problem kod početnika nije implementacija, već pravilno definisanje značenja DP niza. Ako ne znaš šta predstavlja dp[i], gotovo sigurno nećeš napisati ispravno rešenje.

Fibonacci kao uvodni primer

Fibonacci je idealan primer za poređenje: rekurzije, memoizacije i tabulacije. Na njemu se veoma jasno vidi zašto dinamičko programiranje donosi ogromno ubrzanje.

Rekurzija
Eksponencijalno rešenje
Isti podproblemi se računaju više puta, pa vreme izvršavanja brzo raste.
Memoizacija
Top-Down DP
Rezultati se pamte tokom rekurzivnih poziva i svaki podproblem se rešava samo jednom.
Tabulacija
Bottom-Up DP
Tabela se iterativno popunjava od baznih stanja ka konačnom rešenju.
Memoizacija vs. Tabulacija
  • Memoizacija (Top-Down) koristi rekurziju i čuva rezultate već obrađenih stanja.
  • Tabulacija (Bottom-Up) kreće od baznih slučajeva i iterativno popunjava DP tabelu.
  • Oba pristupa često imaju istu asimptotsku složenost, ali tabulacija omogućava bolju kontrolu memorije.

Predložene lekcije

Početni nivo
Uvod u dinamičko programiranje
Osnovni koncepti, stanja i prelazi.
Otvori lekciju →
Srednji nivo
0/1 Knapsack
Najpoznatiji problem dinamičkog programiranja.
Otvori lekciju →
Srednji nivo
Longest Common Subsequence
Klasičan DP problem nad stringovima.
Otvori lekciju →
Važno: Ako primetiš da se ista rekurzivna funkcija poziva više puta sa istim parametrima, velika je verovatnoća da problem može da se reši dinamičkim programiranjem.

Predloženi zadaci za vežbu

Napomena:

AtCoder Educational DP Contest (A–Z) predstavlja jedan od najboljih setova zadataka za sistematsko učenje dinamičkog programiranja. Zadaci su poređani tako da se postepeno uvode nove DP ideje.

Plan rada (predlog)

  1. Analiziraj Fibonacci rekurziju i pronađi ponavljanje podproblema.
  2. Izmeri broj poziva funkcije za n=30 i n=40.
  3. Implementiraj memoizaciju i uporedi broj poziva.
  4. Pređi na bottom-up tabulaciju.
  5. Optimizuj memoriju sa O(n) na O(1).
  6. Reši Frog 1 koristeći isti princip.
  7. Počni prve Knapsack i Coin Change zadatke.
  8. Uporedi performanse rekurzije, memoizacije i tabulacije.

Studijske napomene

  • DP često nastaje kao optimizacija spore rekurzije.
  • Uvek prvo napiši značenje DP stanja na papiru.
  • Bazni slučajevi su podjednako važni kao i prelazi.
  • Pokušaj da objasniš prelaze bez gledanja u kod.
  • Ne memoriši formule — razumi značenje svakog stanja.

Resursi i reference

Nedelja 5 — Dinamičko programiranje sa više dimenzija (2D / 3D DP)

Nakon savladavanja osnovnih DP problema sa jednom dimenzijom, prelazimo na zadatke kod kojih stanje zavisi od dva ili više parametara. Ovakvi problemi se veoma često pojavljuju na okružnim, državnim i SIO takmičenjima.

Glavni cilj: naučiti kako da definišeš stanja oblika dp[i][j] i dp[i][j][k], kao i kako da pravilno odrediš redosled popunjavanja DP tabele.

Teme koje treba savladati

  • 2D DP stanja — dp[i][j]
  • 3D DP stanja — dp[i][j][k]
  • DP nad matricama
  • DP nad stringovima
  • Longest Common Subsequence (LCS)
  • Edit Distance
  • 0/1 Knapsack kao 2D DP
  • Optimizacija memorije (2D → 1D)
  • Redosled popunjavanja DP tabele
Pravilo:

Ako problem zavisi od dva nezavisna parametra (npr. pozicija u matrici, dva stringa ili indeks i kapacitet), vrlo često je potrebno koristiti 2D dinamičko programiranje.

Kako prepoznati 2D DP?

  • Postoje najmanje dva parametra koja određuju stanje problema.
  • Rešenje zavisi od kombinacije više prethodnih stanja.
  • Prirodno se formira tabela dp[i][j].
  • Često se pojavljuju matrice, stringovi ili dva nezavisna indeksa.
  • Potrebno je pratiti više informacija istovremeno.

Klasični 2D DP problemi

Početni nivo
Maksimalan zbir kroz matricu
Klasičan primer DP-a nad mrežom i matricom.
Otvori lekciju →
Srednji nivo
Longest Common Subsequence
Najpoznatiji DP problem nad stringovima.
Otvori lekciju →
Srednji nivo
0/1 Knapsack
Višedimenzionalno stanje i optimizacija memorije.
Otvori lekciju →

DP nad matricama

Kod problema sa mrežama i matricama najčešće se koristi stanje:


dp[i][j]

koje predstavlja najbolju vrednost do polja (i,j).

Tipični prelazi:
  • iz gornjeg polja
  • iz levog polja
  • iz dijagonalnog polja
  • kombinacija više prethodnih stanja

DP nad stringovima

  • Longest Common Subsequence (LCS) — pronalazak najdužeg zajedničkog podniza dva stringa.
  • Edit Distance — minimalan broj operacija potrebnih za transformaciju jednog stringa u drugi.
  • Longest Common Substring — najduži zajednički neprekidni podniz.
Važno: Kod većine 2D DP problema najčešće greške nisu u formulama, već u pogrešno definisanim baznim slučajevima i redosledu popunjavanja tabele.

Predloženi zadaci za vežbu

Plan rada (predlog)

  1. Počni sa jednostavnim DP problemima nad matricama.
  2. Ručno nacrtaj DP tabelu za male ulazne primere.
  3. Analiziraj kako se formiraju prelazi između stanja.
  4. Pređi na LCS i probleme nad stringovima.
  5. Implementiraj Edit Distance.
  6. Pokušaj optimizaciju memorije na dva reda.
  7. Uporedi memorijsku složenost 2D i optimizovanog 1D rešenja.

Česte greške

  • Nejasno značenje DP stanja.
  • Pogrešan redosled popunjavanja.
  • Zaboravljeni bazni slučajevi.
  • Prevelika memorijska složenost.
  • Neprepoznavanje dimenzija koje zapravo definišu stanje.
  • Korišćenje cele DP tabele kada je moguća optimizacija na 1D niz.
Takmičarski savet:

Kod svakog DP zadatka prvo definiši šta predstavlja jedno stanje. Tek kada jasno znaš značenje stanja, piši prelaze i kod. To je najvažnija navika koju treba razviti za ozbiljne DP probleme.

Resursi i reference

Nedelja 6 — Naprednije dinamičko programiranje (Knapsack i optimizacije)

Ova nedelja je fokusirana na naprednije oblike dinamičkog programiranja, sa posebnim akcentom na Knapsack probleme, različite varijacije i optimizaciju memorije i vremena izvršavanja.

Glavni cilj: naučiti kako se 2D DP modeli optimizuju u 1D, kako se razlikuju 0/1 i unbounded varijante i kako se DP primenjuje na realne optimizacionе probleme.

Teme koje treba savladati

  • 0/1 Knapsack problem
  • Unbounded Knapsack
  • Bounded Knapsack (osnovna ideja)
  • DP po težini i vrednosti
  • Optimizacija memorije (2D → 1D DP)
  • Redosled petlji i njegov uticaj na rezultat
  • DP nad podnizovima i kombinatornim izborima
2D DP model
Knapsack tabela
Klasično stanje dp[i][w] kao osnova problema ranaca.
Otvori lekciju →
Optimizacija
2D → 1D DP
Smanjenje memorije uz pravilno vođenje iteracije.
Varijante problema
0/1, unbounded i bounded Knapsack
Različiti modeli izbora elemenata.

Ključni koncept — 0/1 Knapsack

Cilj je maksimizovati vrednost predmeta bez prekoračenja kapaciteta ranca. Svaki predmet se može uzeti najviše jednom.

DP stanje:

dp[i][w]

Maksimalna vrednost koristeći prvih i predmeta uz kapacitet w.

Optimizacija memorije (ključna ideja)

Pošto svako stanje zavisi samo od prethodnog reda, 2D DP se može svesti na 1D niz.


for (int i = 0; i < n; i++) {
    for (int w = W; w >= weight[i]; w--) {
        dp[w] = max(dp[w], dp[w - weight[i]] + value[i]);
    }
}
Važno pravilo:

Ako se iteracija vodi unazad (W → 0), dobijamo 0/1 Knapsack. Ako se vodi unapred, prelazimo u unbounded Knapsack.

0/1 vs Unbounded Knapsack

  • 0/1 Knapsack: svaki predmet se koristi najviše jednom.
  • Unbounded Knapsack: svaki predmet se može koristiti više puta.
  • Razlika je u smeru iteracije kroz kapacitet.

DP varijacije koje treba znati

  • Knapsack po težini
  • Knapsack po vrednosti
  • Minimum troška za određenu vrednost
  • Broj načina da se postigne suma

Česte greške

  • Pogrešan smer petlje (najčešća greška)
  • Mešanje 0/1 i unbounded logike
  • Korišćenje iste DP vrednosti više puta u istoj iteraciji
  • Pogrešno definisano DP stanje
  • Prevelika memorija bez potrebe

Predloženi zadaci

Plan rada (predlog)

  1. Implementiraj klasični 2D Knapsack.
  2. Razumi značenje dp[i][w].
  3. Prevedi 2D DP u 1D DP.
  4. Eksperimentiši sa smerom petlji (0/1 vs unbounded).
  5. Reši Coin Change (broj načina + minimum kovanica).
  6. Poveži Knapsack sa prethodnim DP problemima.

Studijske napomene

  • DP je modelovanje izbora, ne samo implementacija.
  • Smer petlje direktno menja matematički model problema.
  • Uvek prvo razjasni: da li se elementi mogu ponavljati.
  • Optimizacija memorije ne menja logiku problema.

Resursi

Nedelja 7 — Grafovi: predstavljanje, BFS i DFS


Ova nedelja predstavlja ulazak u grafove, jednu od najvažnijih oblasti algoritamskog programiranja. Grafovi se pojavljuju u ogromnom broju takmičarskih zadataka — od jednostavnih pretraga do složenih problema sa ograničenjima.

Fokus je na razumevanju: kako predstaviti graf, kako izvršiti pretragu grafa i kako prepoznati da je neki problem zapravo grafovski.


Osnovni koncepti
Predstavljanje grafova
Lista susedstva, matrica susedstva, usmereni i neusmereni grafovi.
Pretraga grafa
DFS i BFS
Obilazak grafa, povezane komponente i najkraći put u netežinskom grafu.
Modelovanje problema
Grafovi u matrici
Lavirinti, ostrva, rešetke i problemi sa stanjima i prelazima.

Osnovni pojmovi

  • Čvor (vertex), grana (edge)
  • Usmereni i neusmereni grafovi
  • Težinski i netežinski grafovi
  • Povezane komponente
  • Graf kao apstraktni model problema

Predstavljanje grafa

  • Lista susedstva — najčešća i najefikasnija (O(V + E))
  • Matrica susedstva — jednostavna, ali memorijski skupa (O(V²))

// Lista susedstva (neusmereni graf)
vector<vector<int>> adj(n);

adj[u].push_back(v);
adj[v].push_back(u);

Napomena: Lista susedstva je standard na takmičenjima i koristi se u gotovo svim BFS/DFS zadacima.


DFS — pretraga u dubinu (Depth-First Search)

DFS ide što dublje u graf pre nego što se vrati nazad. Najčešće se implementira rekurzivno i koristi se za:

  • Pronalaženje povezanih komponenti
  • Detekciju ciklusa
  • Obilazak grafa i matrice
  • Topološko sortiranje (kasnije)

vector<bool> visited;

void dfs(int u) {
    visited[u] = true;

    for (int v : adj[u]) {
        if (!visited[v]) {
            dfs(v);
        }
    }
}

BFS — pretraga u širinu (Breadth-First Search)

BFS obilazi graf po nivoima i koristi red (queue). Ključna osobina: u netežinskim grafovima BFS daje najkraći put.

  • Najkraći put u netežinskom grafu
  • Problemi sa minimalnim brojem koraka
  • Graf stanja (state graph)

vector<int> dist(n, -1);
queue<int> q;

dist[start] = 0;
q.push(start);

while (!q.empty()) {

    int u = q.front();
    q.pop();

    for (int v : adj[u]) {

        if (dist[v] == -1) {
            dist[v] = dist[u] + 1;
            q.push(v);
        }
    }
}

Važno: Ako su sve grane jednake težine — BFS je optimalan za najkraći put.


Graf u matrici (rešetka)

Mnogi zadaci nisu eksplicitno dati kao graf, već kao matrica ili lavirint. Svako polje je čvor, a pomeranja su grane.

  • Broj ostrva
  • Najkraći put u lavirintu
  • Širenje (vatra, poplava, infekcija)

Predloženi zadaci za vežbu


Plan rada (predlog)
  1. Naučiti osnovne pojmove i predstavljanje grafa.
  2. Implementirati DFS i BFS od nule.
  3. Vežbati grafove u matrici (4/8 smerova).
  4. Razlikovati kada koristiti BFS, a kada DFS.
  5. Rešiti bar 5 grafovskih zadataka.

Studijske napomene
  • Ako se problem može opisati kao „stanja + prelazi“ — verovatno je graf.
  • BFS = najmanji broj koraka.
  • DFS = struktura, komponente, ciklusi.
  • Grafovi su osnova za Dijkstra, DSU i topološko sortiranje.

Resursi

Nedelja 8 — Grafovi (najkraći putevi) + Priority Queue

U ovoj nedelji fokus je na problemima najkraćeg puta u grafu, koji su veoma česti na državnim takmičenjima i SIO. Učenici uče kako da pravilno modeluju realan problem kao graf i kako da izaberu odgovarajući algoritam u zavisnosti od tipa težina na granama.

Poseban akcenat je na algoritmu Dijkstra, kao i na pravilnoj upotrebi priority_queue (prioritetnog reda) iz C++ STL-a, što je česta tačka grešaka kod učenika.

Osnovni nivo
BFS za najkraći put
Najkraći put u netežinskim grafovima i rad sa queue strukturom.
Srednji nivo
Dijkstra algoritam
Najkraći put u ponderisanim grafovima sa nenegativnim težinama.
Napredni nivo
Priority Queue
Min-heap, zastareli unosi i optimizacija performansi.

Glavne teme

  • Modelovanje problema kao grafa (čvorovi, grane, težine)
  • Razlika između neponderisanih i ponderisanih grafova
  • BFS kao algoritam za najkraći put u neponderisanom grafu
  • Dijkstra algoritam — ideja, invarijante, složenost i implementacija
  • Upotreba priority_queue u C++
  • Rad sa min-heap strukturom
  • Tipične greške početnika: višestruki ulasci u red, pogrešna upotreba visited niza, pogrešno poređenje parova
Glavna ideja: ako su sve grane jednake težine, najkraći put se rešava BFS-om. Ako su težine različite, prelazi se na Dijkstra algoritam.

Dijkstra — osnovna ideja

Algoritam u svakom koraku bira čvor sa trenutno najmanjom poznatom udaljenošću i pokušava da poboljša udaljenosti njegovih suseda. Kada se čvor izvuče iz prioritetnog reda sa važećom udaljenošću, ta udaljenost postaje konačna.

Za razliku od BFS-a, ovde se obično ne koristi klasičan visited niz. Umesto toga proverava se da li je izvučena udaljenost zastarela.

Primer implementacije (C++)


#include <bits/stdc++.h>
using namespace std;

const long long INF = 1e18;
vector<vector<pair<int,int>>> graf;
vector<long long> dist;

void dijkstra(int start) {
    priority_queue<
        pair<long long,int>,
        vector<pair<long long,int>>,
        greater<pair<long long,int>>
    > pq;

    dist[start] = 0;
    pq.push({0, start});

    while (!pq.empty()) {
        auto [d, u] = pq.top();
        pq.pop();

        if (d > dist[u]) continue; // zastareli unos

        for (auto [v, w] : graf[u]) {
            if (dist[v] > dist[u] + w) {
                dist[v] = dist[u] + w;
                pq.push({dist[v], v});
            }
        }
    }
}
  
Važno: Dijkstra ne radi sa negativnim težinama. Za veće ulaze koristi long long, a uvek proveri da li je graf usmeren ili neusmeren.

Tipični zadaci

  • Najkraći put između dva grada
  • Najbrži ili najjeftiniji put
  • Grafovi sa težinama
  • Lavirinti sa cenama prelaza
  • Višestruki upiti iz jednog izvora
  • Modelovanje problema gde stanje predstavlja čvor grafa

Predloženi zadaci za vežbu

Plan rada (predlog)
  1. Rešiti najkraći put BFS-om u netežinskom grafu.
  2. Razumeti zašto BFS ne radi za različite težine.
  3. Implementirati Dijkstra algoritam.
  4. Ručno simulirati algoritam na malom grafu.
  5. Rešiti nekoliko zadataka sa CSES / SPOJ platformi.
Studijske napomene
  • Dijkstra ne radi sa negativnim težinama.
  • Složenost: O((V + E) log V).
  • Koristi long long za velike udaljenosti.
  • Uvek proveri da li je graf usmeren ili neusmeren.
  • Ako vidiš „najkraći put“ u neponderisanom grafu, prvo pomisli na BFS.

Nedelja 9 — Teorija brojeva (napredno / olimpijadski nivo)

Ova nedelja predstavlja proširenje osnovnog plana i namenjena je učenicima koji se spremaju za državna takmičenja, SIO i olimpijade. Teorija brojeva je jedna od najčešćih oblasti na višim nivoima takmičenja i zahteva kombinaciju matematičkog razmišljanja i efikasne implementacije.

Akcenat je na razumevanju osobina brojeva, modularne aritmetike i primeni poznatih algoritama kao što su Euklidov algoritam i brza modularna eksponencijacija.

Osnovni koncepti
NOD i NZS
Euklidov algoritam, deljivost i osnovna svojstva brojeva.
Otvori lekciju →
Takmičarski nivo
Modularna aritmetika
Sabiranje, množenje, modulo svojstva i rad sa velikim brojevima.
Otvori lekciju →
Olimpijski nivo
Prosti brojevi
Testiranje prostosti, faktorizacija i napredne tehnike iz teorije brojeva.
Otvori lekciju →

Glavne teme

  • Euklidov algoritam — NOD (GCD) i prošireni Euklidov algoritam
  • Modularna aritmetika (sabiranje, množenje, modulo svojstva)
  • Brza eksponencijacija (a^b mod m)
  • Prosti brojevi i testiranje prostosti
  • Razlaganje broja na proste činioce
  • Najmanji zajednički sadržalac (NZS) i veza sa NOD-om
Glavni cilj: naučiti da prepoznaš kada je zadatak zapravo broj-teorijski, čak i kada je „maskiran“ kroz kombinatoriku, grafove ili DP.

Važni koncepti za takmičenja

  • Zašto direktno računanje često nije moguće (veliki brojevi)
  • Rad sa modulom 10⁹+7 i sličnim konstantama
  • Prepoznavanje kada je zadatak iz teorije brojeva „skriven“
  • Kombinovanje teorije brojeva sa DP-om ili grafovima
  • Uloga deljivosti u konstrukciji i analizi rešenja

Primer: Brza modularna eksponencijacija (C++)


long long modexp(long long a, long long b, long long mod) {
    long long res = 1;
    a %= mod;
    while (b > 0) {
        if (b & 1) res = (res * a) % mod;
        a = (a * a) % mod;
        b >>= 1;
    }
    return res;
}
  

Ova tehnika se koristi u velikom broju zadataka — od teorije brojeva do kombinatorike i kriptografije.

Tipični zadaci

  • Računanje NOD-a i NZS-a za veliki broj upita
  • Provera deljivosti i osobina brojeva
  • Rad sa velikim stepenima i modulom
  • Zadaci sa prostim brojevima i faktorima
  • Kombinacija matematike i implementacije

Predloženi zadaci za vežbu

Plan rada (predlog)

  1. Obnoviti osnovna svojstva deljivosti i NOD/NZS.
  2. Naučiti i implementirati Euklidov algoritam.
  3. Uvežbati modularnu aritmetiku.
  4. Implementirati brzu eksponencijaciju.
  5. Rešiti nekoliko kombinovanih zadataka.

Studijske napomene

  • Teorija brojeva zahteva više razmišljanja nego koda.
  • Vežbaj prepoznavanje šablona u zadacima.
  • Uvek proveri granice ulaza (constraints).
  • Ova oblast je česta na olimpijadama i finalnim krugovima.
Savet: Kada vidiš veliki broj, modul ili deljivost, prvo proveri da li postoji kraći matematički put pre implementacije.

Resursi

Nedelja 10 — Napredne strukture podataka

Ova nedelja obuhvata napredne strukture podataka koje se često pojavljuju na državnim takmičenjima, SIO i olimpijadama, ali zahtevaju solidnu osnovu iz prethodnih oblasti kao što su DP, grafovi i prioritetni redovi.

Cilj nije samo naučiti implementaciju, već razumeti kada je određena struktura optimalna, kako utiče na složenost i kako se kombinuje sa drugim algoritamskim tehnikama.

Fokus nedelje:
  • efikasno procesiranje velikog broja upita
  • rad sa logaritamskim strukturama
  • kombinovanje struktura podataka sa grafovima i DP-om
  • optimizacija vremenske složenosti
Osnovni nivo
Set i Map
Pretraga, umetanje i brisanje elemenata u O(log n).
Srednji nivo
Fenwick Tree
Prefiksne sume i ažuriranja u logaritamskom vremenu.
Napredni nivo
Segmentno stablo
Napredni upiti nad intervalima i velika optimizacija.
Srednji nivo
Priority Queue
Heap struktura i primena u zadacima sa prioritetom.

Glavne teme

  • Set / Map — balansirana stabla i hash strukture
  • unordered_set / unordered_map — prosečno O(1) pristupanje
  • Priority Queue (Heap) — minimum / maksimum elementi
  • Fenwick Tree (BIT) — prefiksne sume u O(log n)
  • Segment Tree — rad nad intervalima
Važna ideja:

Napredne strukture podataka se koriste kada običan niz, sortiranje ili linearna pretraga više nisu dovoljno efikasni.

Set i Map — osnovna ideja

Strukture set i map u C++ STL-u zasnovane su na balansiranim stablima i omogućavaju:

  • ubacivanje u O(log n)
  • brisanje u O(log n)
  • pretragu u O(log n)

set<int> s;

s.insert(5);
s.insert(2);

if (s.count(5)) {
    cout << "Postoji";
}
  
Napomena:

unordered_set i unordered_map su često brži, ali nemaju sortirane elemente.

Fenwick Tree — osnovna ideja

Fenwick Tree (BIT) omogućava:

  • računanje prefiksnih suma
  • ažuriranje elemenata
  • sve u O(log n)

Koristi se kada postoji veliki broj:

  • upita nad segmentima
  • izmena elemenata
  • online obrada podataka
Tipični problemi:
  • broj elemenata manjih od x
  • prefiksne sume
  • inverzije u nizu
  • dinamički upiti

Segmentno stablo — uvod

Segment Tree predstavlja moćnu strukturu za obradu intervala.

Omogućava:

  • minimum / maksimum na segmentu
  • sume na segmentima
  • range update operacije
  • napredne lazy propagation tehnike
Status:

Detaljne stranice i implementacije za Fenwick i Segment Tree biće postepeno dodavane u narednim verzijama vodiča.

Zašto su ove teme važne?

  • Omogućavaju rešavanje problema sa velikim brojem upita.
  • Često su razlika između parcijalnog i punog broja poena.
  • Kombinuju se sa DP-om, grafovima i teorijom brojeva.
  • Pojavljuju se na višim nivoima takmičenja.

Predloženi zadaci i resursi

Plan rada (predlog)

  1. Obnoviti STL strukture (set, map, priority_queue).
  2. Razumeti razliku između O(n), O(log n) i O(1).
  3. Naučiti osnovnu ideju Fenwick stabla.
  4. Preći uvod u segmentno stablo.
  5. Vežbati zadatke sa velikim brojem upita.
Savet za takmičenja:

Kod mnogih zadataka ključ nije komplikovan algoritam, već izbor odgovarajuće strukture podataka.

Preporuka učenicima:
  • Ne preskakati prethodne nedelje — ovo gradivo se nadovezuje na njih.
  • Za sada je dovoljno razumeti kada se ove strukture koriste.
  • Detaljna implementacija dolazi u sledećim verzijama vodiča.

Nedelja 11 — Geometrija i mešoviti zadaci

Završna nedelja predstavlja prelaz sa pojedinačnih oblasti na rešavanje kompleksnih takmičarskih problema koji kombinuju više tehnika.

Fokus je na algoritamskoj geometriji, modelovanju problema i razvoju takmičarskog načina razmišljanja. Ovakvi zadaci su česti na državnim takmičenjima i SIO jer testiraju razumevanje modelovanja problema, a ne samo poznavanje jedne tehnike.

Geometrija
Osnovne formule i orijentacija
Površine, preseci duži, rastojanja i rad sa tačkama.
Kombinovani zadaci
Graf + DP + matematika
Problemi koji zahtevaju više algoritamskih tehnika.
Takmičarsko modelovanje
SIO nivo razmišljanja
Prepoznavanje obrazaca i optimizacija rešenja.

Geometrijske teme

  • Shoelace formula — površina poligona
  • Orijentacija tačaka — levo/desno skretanje
  • Presek duži — kolinearnost i specijalni slučajevi
  • Rastojanje tačke od prave
  • Konveksni omotač — osnovna ideja
Zašto je geometrija teška?

Zadaci iz geometrije često zahtevaju precizno modelovanje i pažljivo razmišljanje, dok je sama implementacija obično kraća nego kod DP ili grafova. Zato je ključ u pravilnom tumačenju uslova i pažljivom radu sa specijalnim slučajevima.

Shoelace formula

Koristi se za računanje površine prostog poligona čija su temena poznata. Formula koristi koordinate susednih temena i veoma je česta na takmičenjima.

Važno:

Redosled obilaska temena mora biti pravilan (u smeru kazaljke ili suprotno), jer u suprotnom znak može biti obrnut, ali apsolutna vrednost daje traženu površinu.

Presek duži

Jedan od najpoznatijih geometrijskih problema je da se odredi da li se dve duži seku. Za ovo su ključni orijentacija tačaka, kolinearnost i obrada specijalnih slučajeva.

  • orijentacija tačaka
  • kolinearnost
  • specijalni slučajevi
  • dodirivanje krajnjih tačaka

Mešoviti zadaci

Na višim nivoima takmičenja zadaci retko pripadaju samo jednoj oblasti. Vrlo često se kombinuju različite tehnike i upravo tu dolazi do izražaja sposobnost modelovanja problema.

Najčešće kombinacije su:

  • grafovi + DP
  • kombinatorika + matematika
  • geometrija + pretraga
  • strukture podataka + grafovi
  • DP nad geometrijskim objektima (intervali, segmenti, tačke)
Ključna veština:

Najvažnije je naučiti da prepoznaš koja oblast i tehnika odgovaraju problemu. Kod mešovitih zadataka najčešće ne pobeđuje najduži kod, već najjasnije modelovanje.

Tipični problemi

  • najkraći put sa dodatnim ograničenjima
  • brojanje puteva u grafovima
  • optimizacija nad segmentima
  • kombinovani matematički problemi
  • modelovanje stanja

Preporučeni resursi

Plan rada (predlog)

  1. Obnoviti sve prethodne oblasti.
  2. Rešavati kombinovane zadatke.
  3. Vežbati modelovanje problema.
  4. Raditi simulacije takmičenja.
  5. Analizirati svoja rešenja i greške.
Završna preporuka:

Takmičarsko programiranje nije samo učenje algoritama, već razvoj načina razmišljanja.

Najveći napredak dolazi kroz:

  • kontinuirano rešavanje zadataka
  • analizu tuđih rešenja
  • upornost i praksu
Napomena:

Nije potrebno naučiti sve napamet. Mnogo je važnije razumeti:

  • kako razmišljati o problemu
  • kako modelovati stanje
  • kako analizirati složenost
  • kada koristiti određenu tehniku

Proširenje za nivo olimpijade (napredni učenici)

Sledeće teme nisu obavezne za standardna školska takmičenja, ali predstavljaju veoma važan deo pripreme za državna takmičenja višeg nivoa, SIO finale, republičke olimpijade i IOI stil zadataka.

Ove oblasti zahtevaju ozbiljno iskustvo u rešavanju zadataka, dobro poznavanje osnovnih algoritama i sposobnost kombinovanja više tehnika u jednom problemu.

Napredni graf algoritmi

Grafovi
Minimalno razapinjuće stablo
Prim i Kruskal algoritmi za optimizaciju mreža.
DAG
Topološko sortiranje
Rad sa zavisnostima i usmerenim acikličnim grafovima.
SCC
Snažno povezane komponente
Kosaraju i Tarjan algoritmi.

MST — Minimalno razapinjuće stablo

  • Prim algoritam
  • Kruskal algoritam
  • Disjoint Set Union (DSU)

Topološko sortiranje

  • DAG grafovi
  • zavisnosti
  • DP na grafovima

Snažno povezane komponente (SCC)

  • Kosaraju
  • Tarjan
  • kompresija grafa

Bellman–Ford

  • negativne težine
  • detekcija ciklusa

Napredno dinamičko programiranje

DP na grafovima
DAG DP
Kombinovanje topološkog sortiranja i DP-a.
Bitmask DP
Stanja sa podskupovima
Problemi sa n ≤ 20.

DP na grafovima (DAG DP)

Kombinuje topološko sortiranje i dinamičko programiranje.

  • najkraći / najduži put u DAG-u
  • brojanje puteva
  • optimizacija zavisnosti

DP sa bitmaskama

  • TSP
  • podskupovi

Napredne strukture podataka

  • Segmentno stablo
  • Fenwick (BIT)
  • kombinovane strukture

Segmentno stablo

Fenwick (BIT)

Preporuka: Ove teme uvoditi tek nakon DFS/BFS, Dijkstre i osnovnog DP-a.

Napomena o izvorima zadataka

Svi linkovi vode ka izvorima zadataka (LeetCode, GeeksforGeeks, Petlja) ili ka lokalnim rešenjima na SvetProgramiranja. Kod i detaljna objašnjenja na lokalnim stranicama su originalna i prilagođena za edukativnu upotrebu.