\section{Sonstiges} \begin{algorithm}[optional]{Zeileneingabe} \sourcecode{other/split.cpp} \end{algorithm} \begin{algorithm}[optional]{Fast IO} \sourcecode{other/fastIO.cpp} \end{algorithm} \begin{algorithm}{Pragmas} \sourcecode{other/pragmas.cpp} \end{algorithm} \begin{algorithm}{Compiletime} \begin{itemize} \item überprüfen ob Compilezeit Berechnungen erlaubt sind! \item braucht \code{c++14} oder höher! \end{itemize} \sourcecode{other/compiletime.cpp} \end{algorithm} \begin{algorithm}{Timed} Kann benutzt werdem un randomisierte Algorithmen so lange wie möglich laufen zu lassen. \sourcecode{other/timed.cpp} \end{algorithm} \begin{algorithm}{Bit Operations} \begin{expandtable} \begin{tabularx}{\linewidth}{|Ll|} \hline Bit an Position j lesen & \code{(x & (1 << j)) != 0} \\ Bit an Position j setzten & \code{x |= (1 << j)} \\ Bit an Position j löschen & \code{x &= ~(1 << j)} \\ Bit an Position j flippen & \code{x ^= (1 << j)} \\ Anzahl an führenden nullen ($x \neq 0$) & \code{__builtin_clzll(x)} \\ Anzahl an schließenden nullen ($x \neq 0$) & \code{__builtin_ctzll(x)} \\ Anzahl an bits & \code{__builtin_popcountll(x)} \\ $i$-te Zahl eines Graycodes & \code{i ^ (i >> 1)} \\ \hline \end{tabularx}\\ \end{expandtable} \sourcecode{other/bitOps.cpp} \end{algorithm} \begin{algorithm}{Overflow-sichere arithmetische Operationen} Gibt zurück, ob es einen Overflow gab. Wenn nicht, enthält \code{c} das Ergebnis. \begin{expandtable} \begin{tabularx}{\linewidth}{|lR|} \hline Addition & \code{__builtin_saddll_overflow(a, b, &c)} \\ Subtraktion & \code{__builtin_ssubll_overflow(a, b, &c)} \\ Multiplikation & \code{__builtin_smulll_overflow(a, b, &c)} \\ \hline \end{tabularx} \end{expandtable} \end{algorithm} \begin{algorithm}{Sonstiges} \sourcecode{other/stuff.cpp} \end{algorithm} \begin{algorithm}{DP Optimizations} Aufgabe: Partitioniere Array in genau $k$ zusammenhängende Teile mit minimalen Kosten: $dp[i][j] = \min_{kn>0,~k>0$ und $m\not\equiv n \bmod 2$ dann beschreibt diese Formel alle Pythagoreischen Tripel eindeutig: \[k~\cdot~\Big(~a=m^2-n^2,\quad b=2mn,\quad c=m^2+n^2~\Big)\] \item \textbf{\textsc{Mo}'s Algorithm:} SQRT-Decomposition auf $n$ Intervall Queries $[l,r]$. Gruppiere Queries in $\sqrt{n}$ Blöcke nach linker Grenze $l$. Sortiere nach Block und bei gleichem Block nach rechter Grenze $r$. Beantworte Queries offline durch schrittweise Vergrößern/Verkleinern des aktuellen Intervalls. Laufzeit:~\runtime{n\cdot\sqrt{n}}. (Anzahl der Blöcke als Konstante in Code schreiben.) \item \textbf{Centroids of a Tree:} Ein \emph{Centroid} ist ein Knoten, der einen Baum in Komponenten der maximalen Größe $\frac{\abs{V}}{2}$ splitted. Es kann $2$ Centroids geben! \item \textbf{Centroid Decomposition:} Wähle zufälligen Knoten und mache DFS. Verschiebe ausgewählten Knoten in Richtung des tiefsten Teilbaums, bis Centroid gefunden. Entferne Knoten, mache rekursiv in Teilbäumen weiter. Laufzeit:~\runtime{\abs{V} \cdot \log(\abs{V})}. \item \textbf{Gregorian Calendar:} Der Anfangstag des Jahres verhält sich periodisch alle $400$ Jahre. \item \textbf{Pivotsuche und Rekursion auf linkem und rechtem Teilarray:} Suche gleichzeitig von links und rechts nach Pivot, um Worst Case von $\runtime{n^2}$ zu $\runtime{n\log n}$ zu verbessern. \end{itemize} \subsection{Tipps \& Tricks} \begin{itemize} \item Run Time Error: \begin{itemize} \item Stack Overflow? Evtl. rekursive Tiefensuche auf langem Pfad? \item Array-Grenzen überprüfen. Indizierung bei $0$ oder bei $1$ beginnen? \item Abbruchbedingung bei Rekursion? \item Evtl. Memory Limit Exceeded? \end{itemize} \item Strings: \begin{itemize} \item Soll \lstinline{"aa"} kleiner als \lstinline{"z"} sein oder nicht? \item bit \code{0x20} beeinflusst Groß-/Kleinschreibung. \end{itemize} \item Gleitkommazahlen: \begin{itemize} \item \lstinline{NaN}? Evtl. ungültige Werte für mathematische Funktionen, z.B. \mbox{\lstinline{acos(1.00000000000001)}}? \item Falsches Runden bei negativen Zahlen? Abschneiden $\neq$ Abrunden! \item genügend Präzision oder Output in wissenschaftlicher Notation (\lstinline{1e-25})? \item Kann \lstinline{-0.000} ausgegeben werden? \end{itemize} \item Wrong Answer: \begin{itemize} \item Lies Aufgabe erneut. Sorgfältig! \item Mehrere Testfälle in einer Datei? Probiere gleichen Testcase mehrfach hintereinander. \item Integer Overflow? Teste maximale Eingabegrößen und mache Überschlagsrechnung. \item Integer Division rundet zur $0$ $\neq$ abrunden. \item Eingabegrößen überprüfen. Sonderfälle ausprobieren. \begin{itemize} \item $n = 0$, $n = -1$, $n = 1$, $n = 2^{31}-1$, $n = -2^{31}$ \item $n$ gerade/ungerade \item Graph ist leer/enthält nur einen Knoten. \item Liste ist leer/enthält nur ein Element. \item Graph ist Multigraph (enthält Schleifen/Mehrfachkanten). \item Sind Kanten gerichtet/ungerichtet? \item Polygon ist konkav/selbstschneidend. \end{itemize} \item Bei DP/Rekursion: Stimmt Basisfall? \item Unsicher bei benutzten STL-Funktionen? \end{itemize} \end{itemize}