From 1a0fba268ca9ef390a45c86a94a27edf026a4f67 Mon Sep 17 00:00:00 2001 From: Gloria Mundi Date: Thu, 20 Nov 2025 17:58:00 +0100 Subject: normalize newlines --- content/other/other.tex | 652 ++++++++++++++++++++++++------------------------ 1 file changed, 326 insertions(+), 326 deletions(-) (limited to 'content/other/other.tex') diff --git a/content/other/other.tex b/content/other/other.tex index d8726d4..a43aa35 100644 --- a/content/other/other.tex +++ b/content/other/other.tex @@ -1,326 +1,326 @@ -\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}{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}{Bit Operations} - \begin{expandtable} - \begin{tabularx}{\linewidth}{|Ll|} - \hline - Bit an Position j lesen & \code{(x \& (1 << j)) != 0} \\ - Bit an Position j setzen & \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}{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} - -%\input{other/simd} +\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}{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}{Bit Operations} + \begin{expandtable} + \begin{tabularx}{\linewidth}{|Ll|} + \hline + Bit an Position j lesen & \code{(x \& (1 << j)) != 0} \\ + Bit an Position j setzen & \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}{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} + +%\input{other/simd} -- cgit v1.2.3