Files
teamnote/2024fall/main.tex
2026-06-03 09:36:52 +09:00

650 lines
19 KiB
TeX

\documentclass[portrait, 8pt, a4paper, oneside, twocolumn]{extarticle}
\usepackage{teamnote}
\usepackage[hangul]{kotex}
\usepackage[most]{tcolorbox}
\usepackage{multirow}
\usepackage{adjustbox}
% \usepackage{amsmath}
% \usepackage{etoolbox}
% \AtBeginEnvironment{align*}{%
% \setlength{\abovedisplayskip}{0pt}
% \setlength{\belowdisplayskip}{0pt}
% \setlength{\abovedisplayshortskip}{0pt}
% \setlength{\belowdisplayshortskip}{0pt}
% }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{enumitem}
\setlistdepth{9}
\newlist{IdeaNote}{enumerate}{6}
\setlist[IdeaNote]{topsep=0pt,itemsep=-1ex,partopsep=1ex,parsep=1ex}
\setlist[IdeaNote, 1]{label= \Roman*. }
\setlist[IdeaNote, 2]{label= \Alph*. }
\setlist[IdeaNote, 3]{label= \arabic*. }
\setlist[IdeaNote, 4]{label= \roman*) }
\setlist[IdeaNote, 5]{label= \alph*) }
\setlist[IdeaNote, 6]{label= \arabic*) }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\teamnote{POSTECH}{ConForza}{}
\ShowUsage
\ShowComplexity
\HideAuthor
\begin{document}
\maketitlepage
\pagebreak
\section{Have you...}
\subsection{tried...}
\begin{itemize}
\item \textcolor{red}{\textbf{Reading the problem once more?}}
\item doubting ``obvious" things?
\item writing obivous things?
\item radical greedy approach?
\item thinking in reverse direction?
\item a greedy algorithm?
\item network flow when your greedy algorithms stuck?
\item a dynamic programming?
\item checking the range of answer?
\item random algorithm?
\item graph modeling using states?
\item inverting state only on odd indexes?
\item calculating error bound on a real number usage?
\end{itemize}
\subsection{checked...}
\begin{itemize}
\item \textcolor{red}{\textbf{you have read the statement correctly?}}
\item typo copying the team note?
\item initialization on multiple test case problem?
\item additional information from the problem?
\item undefined behavior?
\item overflow?
\item function without return value?
\item real number error?
\item implicit conversion?
\item comparison between signed and unsigned integer?
\end{itemize}
\pagebreak
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Algorithmic Idea Note}
\begin{tcolorbox}[breakable, enhanced, sharp corners, colback=white, colframe=black, boxrule=1pt, left=0pt]
\begin{IdeaNote}
\item Complete Search: Backtracking \& Pruning
\item Math
\begin{IdeaNote}
\item Number Theory
\begin{IdeaNote}
\item Prime Number
\begin{IdeaNote}
\item Sieve of Eratosthenes, Prime Factorization
\item Fast Prime Verdict; Millar-Rabin
\item Fast Prime Factorization; Pollad Rho
\end{IdeaNote}
\item Extended Euclidean Algorithm; Diophantos Equation
\item Chinese Remainder Theorem
\item Harmonic Lemma
\item Floor Sum (Sum of Rational Arithmetic Sequence)
\item Several Sieves
\end{IdeaNote}
\item Linear Programming
\begin{IdeaNote}
\item Solve (some) LP with Shortest Path
\end{IdeaNote}
\item FFT \& Polynomials
\begin{IdeaNote}
\item FFT : Convolution
\begin{IdeaNote}
\item High precision FFT with modulo 1e9+7
\end{IdeaNote}
\item NTT : Number Theoretic Tranform
\item Quotient Ring (Formal Power Series)
\begin{IdeaNote}
\item Multiplication
\item FPS : Inverse / Division
\item Integration / Differentiation
\item FPS : Logarithm / Exponentiation
\item FPS : Power of Polynomial
\item Division - Quotient \& Remainder
\item Polynomial Taylor Shift
\item Multipoint Evaluation
\end{IdeaNote}
\end{IdeaNote}
\item Combinatorics
\begin{IdeaNote}
\item Labeled Combinatorial Target
\item The Twelvefold Way (12정도)
\item Generating Function
\end{IdeaNote}
\end{IdeaNote}
\item Linear Algebra
\item Geometry
\begin{IdeaNote}
\item Basic Tools
\begin{IdeaNote}
\item Outer Product (CCW)
\item Sorting by Polar
\item Segment Intersection
\item Closest Point
\item Furthest Point
\end{IdeaNote}
\item Convex Polygon (Convex Hull)
\begin{IdeaNote}
\item Convex Hull Construction
\item Convex Layer
\item Rotating Calipers
\item Point Containment
\item Tangent to convex polygon
\item Inner and Outer Tangent of two Convex's
\end{IdeaNote}
\item General Polygon
\item Half Plane Intersection
\item Delaunay Triangulation : Voronoi diagram
\end{IdeaNote}
\item Greedy
\begin{IdeaNote}
\item Rearrangement Inequality
\end{IdeaNote}
\item DP
\begin{IdeaNote}
\item DP Optimization
\begin{IdeaNote}
\item Convex Hull Trick
\item Alien's Trick (Lagrangian Relaxation)
\item Slope Trick
\end{IdeaNote}
\end{IdeaNote}
\item String
\begin{IdeaNote}
\item KMP(Knuth-Morris-Pratt), Z, Manacher Algorithm
\item Trie
\item Aho-Corasick
\item Suffix Array \& LCP Array
\item Eertree
\item Wavelet Tree
\end{IdeaNote}
\item Graph
\begin{IdeaNote}
\item Searching : DFS/BFS
\item DAG(Directed Acyclic Graph) : Topological Sorting
\item MST(Minimum Spanning Tree)
\begin{IdeaNote}
\item Kruskal Algorithm
\item Prim Algorithm
\item Euclidian MST
\end{IdeaNote}
\item Shortest Path
\begin{IdeaNote}
\item Dijkstra Algorithm
\item Bellman-Ford Algorithm
\item Floyd-Warshall Algorithm
\item Shortest Path DAG
\end{IdeaNote}
\item Connectivity
\begin{IdeaNote}
\item Offline Dynamic Connectivity (Odc)
\item Online Dynamic Connectivity
\begin{IdeaNote}
\item Euler Tour Tree
\item Top Tree
\end{IdeaNote}
\end{IdeaNote}
\item DFS tree
\begin{IdeaNote}
\item SCC(Strongly Connected Component)
\begin{IdeaNote}
\item Graph Compression
\item 2-SAT Problem
\item Offline Incremental SCC
\end{IdeaNote}
\item BCC (BiConnected Component)
\begin{IdeaNote}
\item Blcok Cut Tree
\item Cactus Graph
\end{IdeaNote}
\item Articulation Points and Bridges
\end{IdeaNote}
\item Network Flow
\begin{IdeaNote}
\item Ford-Fulkerson/Edmonds-Karp Algorithm
\item Dinic's Algorithm
\item Push-Relabel Algorithm
\item MCMF(Minimum Cost Maximum Flow)
\item Minimum s-t Cut = Maximum Flow
\item Bipartite Matching
\begin{IdeaNote}
\item Minimum Vertex Cover on Bipartite
\item Maximum Independent Set on Bipartite
\item Minimum Path Cover on DAG
\item Maximum Antichain on DAG
\end{IdeaNote}
\item Circulation
\item General Matching
\end{IdeaNote}
\item Treewidth
\end{IdeaNote}
\item Tree
\begin{IdeaNote}
\item LCA(Lowest Common Ancestor)
\item Heavy-Light Decomposition
\item Centroid Decomposition
\item Link-Cut Tree
\end{IdeaNote}
\item Data Structure
\begin{IdeaNote}
\item C++ Standard Library
\begin{IdeaNote}
\item Stack, Queue, List, Vector, Deque
\item Priority Queue; Heap
\item Set, Map : Binary Search Tree
\item Unordered Set, Unordered Map : Hashing
\item PBDS(Policy-Based Data Structure)
\item Rope (Cord)
\end{IdeaNote}
\item Disjoint Set (Unoin-Find structure)
\begin{IdeaNote}
\item Union by Rank / Path Compression
\item UF with LCA (Making Root)
\item UF with Edge Weight
\item UF with Unjoining
\begin{IdeaNote}
\item Unjoin from latest (Stack undoing)
\item Unjoin from earliest (Queue undoing)
\item Unjoin by Priority (Priority undoing)
\end{IdeaNote}
\end{IdeaNote}
\item Sparse Table
\item Range Query Structure
\begin{IdeaNote}
\item Square Root Decomposition
\item Fenwick Tree
\item Segment Tree
\begin{IdeaNote}
\item Lazy Propagation \& Generalization
\item 금광 ST (Maximum Adjacent Sum of Given Range)
\item PST (Persistent Segment Tree)
\item MST (Merge Sort Tree)
\item Segment Tree on Tree (HLD)
\item Li-Chao Tree (Segment Add Get Min)
\item ST Beats
\item Kinetic ST
\end{IdeaNote}
\item Splay Tree
\begin{IdeaNote}
\item Range Reverse / Range Shift
\end{IdeaNote}
\end{IdeaNote}
\end{IdeaNote}
\item Sorting \& Searching
\begin{IdeaNote}
\item Sorting
\item Searching
\begin{IdeaNote}
\item Binary Search : Monotone Sequence / function
\begin{IdeaNote}
\item Lower bount / Upper bound
\item LIS (Longest Increasing Subsequence)
\item PBS (Parallel Binary Search)
\end{IdeaNote}
\item Ternary Search : Unimodal Sequence / function
\begin{IdeaNote}
\item Fibonacci Search (Golden Ratio Search)
\end{IdeaNote}
\end{IdeaNote}
\end{IdeaNote}
\item Numerical Analysis
\begin{IdeaNote}
\item Numerical Differentiation
\item Gradient Descent
\end{IdeaNote}
\item Technic
\begin{IdeaNote}
\item Coordinate Compression
\item Two Pointer/Sliding Window
\item Sweeping
\item Meet in the Middle
\item Bitmasking
\item Small to Large
\item Randomization
\begin{IdeaNote}
\item Verifying Matrix Multiplication
\end{IdeaNote}
\item Query Technic
\begin{IdeaNote}
\item Offline Query
\begin{IdeaNote}
\item Mo's Algorithm
\end{IdeaNote}
\end{IdeaNote}
\end{IdeaNote}
\end{IdeaNote}
\end{tcolorbox}
\Algorithm{Some Rules}
{}{}{cpp}{source/Fundemental.cpp}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Math}
\subsection{Prime Number}
\subsubsection{Distribution of Prime Number}
\begin{center}
\begin{tabular}{|
>{\columncolor[HTML]{BFBFBF}}c |c|
>{\columncolor[HTML]{BFBFBF}}c |c|
>{\columncolor[HTML]{BFBFBF}}c |c|}
\hline
1e2 & 25 & 1e6 & 78,498 & 1e10 & \textless 5e8 \\ \hline
1e3 & 168 & 1e7 & 664,579 & 1e11 & \textless 5e9 \\ \hline
1e4 & 1,229 & 1e8 & \textless 6e6 & 1e12 & \textless 4e10 \\ \hline
1e5 & 9,592 & 1e9 & \textless 6e7 & 1e13 & \textless 4e11 \\ \hline
\end{tabular}
\end{center}
\subsubsection{Prime Gap}
\begin{align*}
2 \cdot 10^{5} \text{ 이하의 소수 간극 } &\le 100\\
2^{32} \text{ 이하의 소수 간극 } &\le 464 \\
2^{64} \text{ 이하의 소수 간극 } &\le 1550
\end{align*}
\Algorithm{Miller-Rabin Algorithm}
{\texttt{is\_p(X)} : returns true if $X$ is prime, otherwise false.
\begin{align*}
\text{ When } X \le 2^{32}, D &= \{2, 7, 61\} \text{ is sufficient; } \\
X \le 2^{64}, D &= \{p | p \text{ is prime}, p \le 37 \} \text{ is sufficient.}
\end{align*}}
{$\mathcal O (\log^3 X)$}
{cpp}
{source/Math/MillerRabin.cpp}
\Algorithm{Pollad Rho Algorithm}
{ \texttt{po\_rho(N)} : returns array of prime factors of X.}
{$\mathcal O (N^{1/4})$}
{cpp}
{source/Math/PolladRho.cpp}
\Algorithm{Diopantos Equation(Extended Euclidian Algorithm)}
{\texttt{diophantos(a, b)} : return one integer solution of $ax+by=1$, satisfying $0 \le x < b$. }
{$\mathcal O \left(\log \left( \max(a, b) \right) \right)$}
{cpp}
{source/Math/Diophantos.cpp}
\Algorithm{Chinese Remainder Theorem}
{\texttt{crt(pll p, pll q)} : return \texttt{pll r}, satisfying follows:
\begin{align*}
x &\equiv \texttt{p.fi} \mod \texttt{p.se} \\
\text{and } x &\equiv \texttt{q.fi} \mod \texttt{q.se} \\
\leftrightarrow x &\equiv \texttt{r.fi} \mod \texttt{r.se}
\end{align*}
If there's no such \texttt{r}, return $\{-1, -1\}$.
}
{$\mathcal O(\log A)$}
{cpp}
{source/Math/CRT.cpp}
\Algorithm{Harmonic Lemma}
{\texttt{f(N)} : return the value
$$\sum_{i=1}^{N} \left\lfloor \frac{N}{i} \right\rfloor = \left\lfloor \frac{N}{1}\right\rfloor + \left\lfloor \frac{N}{2} \right\rfloor + \cdots + \left\lfloor \frac{N}{N}\right\rfloor $$}
{$\mathcal O(\sqrt N )$}
{cpp}
{source/Math/Harmonic.cpp}
\Algorithm{Floor Sum (Sum of Floor of Ratinoal Arithmetic Sequence)}
{\texttt{floor\_sum(A, B, C, N)} : retun the value
$$\sum_{x=1}^{N} \left\lfloor \frac{Ax+B}{C} \right\rfloor $$}
{$\mathcal O(\log N)$}
{cpp}
{source/Math/FloorSum.cpp}
\Algorithm{FFT - Convolution}
{}
{$\mathcal O (N\log N)$}
{cpp}
{source/Math/FFTConv.cpp}
\Algorithm{NTT - Number Theoretic Transform}
{helloworld}
{}
{cpp}
{source/Math/NTT.cpp}
\subsubsection{Good prime numbers to run NTT}
\begin{center}
\begin{adjustbox}{width=0.8\columnwidth}
\begin{tabular}{|c|c|
>{\columncolor[HTML]{C0C0C0}}l |}
\hline
595 591 169 & 71\textless{}\textless{}23|1 & \cellcolor[HTML]{C0C0C0} \\ \cline{1-2}
645 922 817 & 77\textless{}\textless{}23|1 & \cellcolor[HTML]{C0C0C0} \\ \cline{1-2}
897 581 057 & 107\textless{}\textless{}23|1 & \cellcolor[HTML]{C0C0C0} \\ \cline{1-2}
998 244 353 & 119\textless{}\textless{}23|1 & \cellcolor[HTML]{C0C0C0} \\ \cline{1-2}
1 300 234 241 & 155\textless{}\textless{}23|1 & \cellcolor[HTML]{C0C0C0} \\ \cline{1-2}
1 224 736 769 & 73\textless{}\textless{}24|1 & \cellcolor[HTML]{C0C0C0} \\ \cline{1-2}
2 130 706 433 & 127\textless{}\textless{}24|1 & \cellcolor[HTML]{C0C0C0} \\ \cline{1-2}
167 772 161 & 5\textless{}\textless{}25|1 & \cellcolor[HTML]{C0C0C0} \\ \cline{1-2}
469 762 049 & 7\textless{}\textless{}26|1 & \multirow{-9}{*}{\cellcolor[HTML]{C0C0C0}$\omega$ = 3} \\ \hline
\end{tabular}
\end{adjustbox}
\end{center}
\Algorithm{Polynomial (Formal Power Series)}
{}
{}
{cpp}
{source/Math/Polynomial.cpp}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Linear Algebra}
\subsection{Matrix Multiplication}
\texttt{k-i-j} 순서가 가장 Cache-Friendly 함.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Geometry}
\Algorithm{Mindset}
{}
{$\mathcal O(N?)$}
{cpp}
{source/Geometry/Mindset.cpp}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Greedy}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{DP}
% \Algorithm{}
% {}
% {$\mathcal O(N?)$}
% {cpp}
% {source/}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{String}
\Algorithm{F, Z, M, SA(Suffix Array), LCP(Longest Common Prefix)}
{For string s(1-indexed) of length N;
\begin{align*}
\texttt{F[i] = }& \text{maximum } k<i && \text{ s.t. } s[1\dots k] = s[i-k+1 \dots i]\\
\texttt{Z[i] = }& \text{maximum } k && \text{ s.t. } s[1\dots k] = s[i \dots i+k-1]\\
\texttt{M[i] = }& \text{maximum } k && \text{ s.t. } s[i-k+1 \dots i+k-1] \text{ is palindrom.}\\
\texttt{SA[i] = }& k && \text{ s.t. } s[k\dots N] \text{ is the } i^{th} \text{ smallest of } \\
& && \{s[1\dots N],\; s[2\dots N],\; \cdots,\; s[N\dots N]\}\\
\texttt{LCP[i] = }& \text{maximum } k && \text{ s.t. } s[SA[i-1]\dots SA[i-1]+k-1]\\
& && = s[SA[i] \dots SA[i]+k-1]
\end{align*}
}
{$\mathcal O(N),\mathcal O(N),\mathcal O(N),\mathcal O(N\log N),\mathcal O(N)$, respectively}
{cpp}
{source/String/F_Z_M_SA_LCP.cpp}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Graph}
\Algorithm{SCC - Tarjan Algorithm}
{\texttt{scn[i]} : SCC number of node $i$, \texttt{nscc} : the number of SCCs}
{}
{cpp}
{source/Graph/TarjanSCC.cpp}
\Algorithm{Bipartite Matching - with DFS}
{Let's say that graph is bipartite. And Let's say that one group is $A$, and the other graph is $B$. $|A|=N$, $|B|=M$. \texttt{matching(c = s)} : add one matching from $s \in A$. If successfully matched, return true; otherwise return false. \texttt{selby[i] = } store $s\in A$, s.t. $i\in B$ is matched with $s$. \\ (e.g.) \texttt{forr(i, n) ans += matching(c=i);}}
{$\mathcal O(VE)$}
{cpp}
{source/Graph/BipartiteMatching.cpp}
\subsubsection{Minimum Vertex Cover on Bipartite Graph(Kőnig's Therorem)}
On bipartite graph, $$|\texttt{Minimum Vertex Cover}| = |\texttt{Maximum Matching}|$$
To find Minimum Vertex Cover, ( \added )
\subsubsection{Maximum Independent Set on Bipartite Graph}
On bipartite graph, $$|\texttt{Maximum Independent Set}|=|V|-|\texttt{Maximum Matching}|$$
* Note : Complement of the Vertex Cover is the Independent Set.
\subsubsection{Minimum Path Cover on DAG}
Let's think about the bipartite graph, with vertex set A and B, satisfying follow property:
\begin{itemize}
\item If there's edge from node $i$ to node $j$ on DAG, then there's edge connecting $i^{th}$ node of A and $j^{th}$ node of B, and vice versa.
\end{itemize}
Then following holds:
$|\texttt{Minimum Path Cover of DAG}| = |\texttt{Maximum Matching on Bipartite Graph}|$
\subsubsection{Maximum Antichain on DAG(Dilworth's Theorem)}
On DAG, $$|\texttt{Minimum Path Cover}| = |\texttt{Maximum Antichain}|$$
\Algorithm{Network Flow - Dinic}
{Construct graph with \texttt{connect(from, to, capacity, isDirected);}. Find the flow from $S$ to $T$ with \texttt{flow(S, T);}. }
{$\mathcal O(V^2E)$, but it works like magic.}
{cpp}
{source/Graph/Dinic.cpp}
\Algorithm{MCMF - with SPFA}
{Construct graph with \texttt{connect(from, to, capacity, cost);}. Find the maximum flow and corresponding minimum cost from $S$ to $T$ with \texttt{flow(S, T);}.}
{$\mathcal O(VEf)$, but it works like magic.}
{cpp}
{source/Graph/MCMF.cpp}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Tree}
\Algorithm{HLD(Heavy Light Decomposition)}
{}
{}
{cpp}
{source/Tree/HLD.cpp}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Data Structure}
\Algorithm{PBDS - Policy-Based Data Structure}
{}
{Equivalent to std::set}
{cpp}
{source/DS/PBDS.cpp}
\Algorithm{rope}{}{}{cpp}{}
\Algorithm{Union and Find - Queue Undoing}
{}
{$\mathcal O(\log^2N)$}
{cpp}
{source/DS/UF_QUndo.cpp}
\Algorithm{Segment Tree Generalization}
{}
{$\mathcal O(\log N)$}
{cpp}
{source/DS/SegmentTree.cpp}
\Algorithm{Li-Chao Tree}
{}
{}
{cpp}
{source/DS/LiChaoTree.cpp}
\Algorithm{Splay Tree}
{}
{}
{cpp}
{source/DS/SplayTree.cpp}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Numerical Analysis}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Technic}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Misc}
\Algorithm{Fast Input}
{Fast Input with fread. Do not use with scanf, cin, or other input function. Use \texttt{forr(i, n) read(arr[i]);} instead of \texttt{forr(i, n) scanf("\%d", arr+i);}. Use \texttt{read(s+1)} instead of \texttt{scanf("\%s", s+1);}.}
{}
{cpp}
{source/Misc/FastI.cpp}
\Algorithm{MT19937 Random Number}
{}
{}
{cpp}
{source/Misc/mt19937.cpp}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{center}
\bigskip
--- Document end ---
\end{center}
\end{document}