\section{Sonstiges} \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 werden um 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 \code{1} 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}{Pragmas} \sourcecode{other/pragmas.cpp} \end{algorithm} \begin{algorithm}{DP Optimizations} Aufgabe: Partitioniere Array in genau $m$ 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{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 ist alle $400$ Jahre gleich. \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. \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{SQRT Techniques:} \begin{itemize} \item Aufteilen in \emph{leichte} (wert $\leq\sqrt{x}$) und \emph{schwere} (höchsten $\sqrt{x}$ viele) Objekte. \item Datenstruktur in Blöcke fester Größe (z.b. 256 oder 512) aufteilen. \item Datenstruktur nach fester Anzahl Updates komplett neu bauen. \item Wenn die Summe über $x_i$ durch $X$ beschränkt ist, dann gibt es nur $\sqrt{2X}$ verschiedene Werte von $x_i$ (z.b. Längen von Strings). \item Wenn $w\cdot h$ durch $X$ beschränkt ist, dann ist $\min(w,h)\leq\sqrt{X}$. \end{itemize} \item \textbf{Partition:} Gegeben Gewichte $w_0+w_1+\cdots+w_k=W$, existiert eine Teilmenge mit Gewicht $x$? Drei gleiche Gewichte $w$ können zu $w$ und $2w$ kombiniert werden ohne die Lösung zu ändern $\Rightarrow$ nur $2\sqrt{W}$ unterschiedliche Gewichte. Mit bitsets daher selbst für $10^5$ lösbar. \end{itemize} \subsection{Tipps \& Tricks} \begin{itemize} \item \textbf{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? Mit \code{/usr/bin/time -v} erhält man den maximalen Speicherverbrauch bei der Ausführung (Maximum resident set size). \end{itemize} \item \textbf{Strings:} \begin{itemize} \item Soll \codeSafe{"aa"} kleiner als \codeSafe{"z"} sein oder nicht? \item bit \code{0x20} beeinflusst Groß-/Kleinschreibung. \end{itemize} \item \textbf{Zeilenbasierte Eingabe}: \begin{itemize} \item \code{getline(cin, str)} liest Zeile ein. \item Wenn vorher \code{cin >> ...} benutzt, lese letztes \code{\\n} mit \code{getline(cin, x)}. \end{itemize} \item \textbf{Gleitkommazahlen:} \begin{itemize} \item \code{NaN}? Evtl. ungültige Werte für mathematische Funktionen, z.B. \mbox{\code{acos(1.00000000000001)}}? \item Falsches Runden bei negativen Zahlen? Abschneiden $\neq$ Abrunden! \item genügend Präzision oder Output in wissenschaftlicher Notation (\code{1e-25})? \item Kann \code{-0.000} ausgegeben werden? \end{itemize} \item \textbf{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 Ausgabeformat im 'unmöglich'-Fall überprüfen. \item Ist das Ergebnis modulo einem Wert? \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 Kolineare Punkte existieren. \item Polygon ist konkav/selbstschneidend. \end{itemize} \item Bei DP/Rekursion: Stimmt Basisfall? \item Unsicher bei benutzten STL-Funktionen? \end{itemize} \end{itemize}