digitcrusher/algorytmy
Metodologia
-
Nie ma jednej implementacji algorytmu zaspokojającej wszystkie przypadki użycia, więc algorytmy powinny być proste do skopiowania, wklejenia do własnego kodu i zmodyfikowania w ważnych punktach ich działania.
-
Wszystkie algorytmy w tej bibliotece powinny być możliwie niezależnymi od siebie kawałkami kodu, wymagać jak najmniej kodu do samodzielnego funkcjonowania i mieć jak najprostszy interfejs.
-
Kod ma być czytelny, krótki, bez mikrooptymalizacji.
-
Asserty powinny sprawdzać warunki dotyczące wejścia, które nie mogą być wykryte na inne sposoby (np. przez sygnał naruszenia ochrony pamięci lub tryb debugowania w glibc++).
Lista zadań
Algorytmy
- matematyka
- NWD, NWW
- mnożenie i potęgowanie modularne
- rozszerzony algorytm Euklidesa
- odwrotność modularna
- liniowe równania diofantyczne
- chińskie twierdzenie o resztach
- logarytm dyskretny
- sito liczb pierwszych - Eratostenes, Euler
- test pierwszości - z sita, Miller-Rabin
- rozkład na czynniki pierwsze - z sita, rho Pollarda
- funkcja φ Eulera
- liczba i suma dzielników
- spamiętywana silnia
- symbol Newtona
- różne wzorki kombinatoryczne
- FFT
- modularne inty
- NTT
- rozszerzony binarny algorytm Euklidesa
- funkcje tworzące
- grafy
- skojarzenia w grafie dwudzielnym - Hopcroft-Karp
- przeszukiwanie grafu - BFS, DFS (w tym funkcja low)
- sortowanie topologiczne - Kahn, z DFS
- silnie spójne składowe - Kosaraju
- dwu-kolorowanie grafu
- mosty i punkty artykulacji
- generator grafów losowych
- minimalne drzewo rozpinające - Kruskal, Prim
- najkrótsze ścieżki
- dla DAGów, Dijkstra, Dial, Bellman-Ford, SPFA, Floyd-Warshall
- A*, Johnson
- binary lifting
- najniższy wspólny przodek - z binary liftingu, z RMQ
- heavy-light decomposition
- chain decomposition
- centroid decomposition
- 2-SAT
- transformacje drzew binarnych
- znajdywanie cykli w grafie
- skojarzenia
- problem komiwojażera - z DP, z branch-and-bound
- problem skoczka szachowego
- liczba ścieżek prostych w grafie
- dwuspójne składowe
- ścieżka i cykl Eulera
- algorytm Rémy'ego
- struktury danych
- drzewo przedziałowe - rekurencyjne, iteratywne
- struktura zbiorów rozłącznych
- sparse table
- stos i kolejka minimum/monotoniczna
- sumy prefiksowe
- drzewo Fenwicka
- skompresowane drzewo trie
- sumy prefiksowe 2D
- big inty
- ułamki
- modularne ułamki
- treap (drzewiec)
- ciągi
- dynamiczne drzewo AABB
- leniwe drzewo przedziałowe
- maski bitowe
- glibc pbds
- permutacje
- fibonacci heap
- disjoint sparse table
- drzewo Li Chao
- drzewo przedziałowe 2D
- drzewo Fenwicka 2D
- sparse table 2D
- algorytmy tekstowe i ciągi
- najdłuższy wspólny podciąg - z DP, z dziel i zwyciężaj
- haszowanie w okienku
- hasze prefiksowe
- wyszukiwanie wzorca w tekście
- Rabin-Karp
- KMP
- tablica sufiksowa
- najdłuższy rosnący podciąg
- funkcja prefiksowa - KMP
- algorytm Manachera
- KMR
- geometria
- convex hull trick
- figury geometryczne
- punkt, odcinek
- koło, trójkąt, wielokąt
- triangulacja wielokątów
- otoczka wypukła - Graham's scan
- przecięcia i różnice prostokątów
- euklidesowe minimalne drzewo spinające
- inne
- algorytm Mo
- liczba unikatowych elementów na przedziałach przy użyciu drzewa przedziałowego
- znajdź jedną liczbe w ciągu par liczb i podobne problemy
- Quickselect
- algorytm magicznych piątek
- Lazyselect
- reszta algorytmów
Notatki i materiały
- kwadraty łacińskie
- sztuczki i triki
- kompresja wartości i współrzędnych
- digit dp
- meet in the middle
- wszystko
Inne
- moja templatka do rozwiązań
- pragmy
- testerka w kodzie
- szybkie I/O
Przykładowe zadania
- "Kajaki" z IV OI
- "Małpki" z Solve
- zadania z przedziałami
- "Dyżury" z Solve
- "Szpilki i zdjęcia" z Solve
- "Too Many Segments" z Codeforces
- reszta zadań