Merge conflicting changes from upstream in chapter 1
This commit is contained in:
commit
1bf55961f6
|
@ -398,8 +398,8 @@ because it is possible that the values should be
|
|||
equal but they are not because of precision errors.
|
||||
A better way to compare floating point numbers
|
||||
is to assume that two numbers are equal
|
||||
if the difference between them is less than
|
||||
$\varepsilon$, where $\varepsilon$ is a small number.
|
||||
if the difference between them is less than $\varepsilon$,
|
||||
where $\varepsilon$ is a small number.
|
||||
|
||||
In practice, the numbers can be compared
|
||||
as follows ($\varepsilon=10^{-9}$):
|
||||
|
@ -852,7 +852,7 @@ secondary school students.
|
|||
Each country is allowed to send a team of
|
||||
four students to the contest.
|
||||
There are usually about 300 participants
|
||||
from 80 countries \cite{iois}.
|
||||
from 80 countries.
|
||||
|
||||
The IOI consists of two five-hour long contests.
|
||||
In both contests, the participants are asked to
|
||||
|
@ -862,7 +862,7 @@ each of which has an assigned score.
|
|||
Even if the contestants are divided into teams,
|
||||
they compete as individuals.
|
||||
|
||||
The IOI syllabus \cite{ioiy} regulates the topics
|
||||
The IOI syllabus \cite{iois} regulates the topics
|
||||
that may appear in IOI tasks.
|
||||
This book covers almost all the topics in the IOI syllabus.
|
||||
|
||||
|
@ -879,11 +879,11 @@ such as the Croatian Open Competition in Informatics (COCI)
|
|||
and the USA Computing Olympiad (USACO).
|
||||
In addition,
|
||||
many problems from Polish contests
|
||||
are available online \cite{main}.
|
||||
are available online\footnote{Młodzieżowa Akademia Informatyczna (MAIN), \texttt{http://main.edu.pl/}}.
|
||||
|
||||
\subsubsection{ICPC}
|
||||
|
||||
The International Collegiate Programming Contest (ICPC) \cite{icpc}
|
||||
The International Collegiate Programming Contest (ICPC)
|
||||
is an annual programming contest for university students.
|
||||
Each team in the contest consists of three students,
|
||||
and unlike in the IOI, the students work together;
|
||||
|
|
|
@ -252,16 +252,16 @@ there are two possible solutions to the problem:
|
|||
\begin{tikzpicture}[scale=.65]
|
||||
\begin{scope}
|
||||
\draw (0, 0) grid (4, 4);
|
||||
\node at (1.5,3.5) {$K$};
|
||||
\node at (3.5,2.5) {$K$};
|
||||
\node at (0.5,1.5) {$K$};
|
||||
\node at (2.5,0.5) {$K$};
|
||||
\node at (1.5,3.5) {\symqueen};
|
||||
\node at (3.5,2.5) {\symqueen};
|
||||
\node at (0.5,1.5) {\symqueen};
|
||||
\node at (2.5,0.5) {\symqueen};
|
||||
|
||||
\draw (6, 0) grid (10, 4);
|
||||
\node at (6+2.5,3.5) {$K$};
|
||||
\node at (6+0.5,2.5) {$K$};
|
||||
\node at (6+3.5,1.5) {$K$};
|
||||
\node at (6+1.5,0.5) {$K$};
|
||||
\node at (6+2.5,3.5) {\symqueen};
|
||||
\node at (6+0.5,2.5) {\symqueen};
|
||||
\node at (6+3.5,1.5) {\symqueen};
|
||||
\node at (6+1.5,0.5) {\symqueen};
|
||||
|
||||
\end{scope}
|
||||
\end{tikzpicture}
|
||||
|
@ -289,10 +289,10 @@ the backtracking algorithm are as follows:
|
|||
\draw (3, -6) grid (7, -2);
|
||||
\draw (9, -6) grid (13, -2);
|
||||
|
||||
\node at (-9+0.5,-3+0.5) {$Q$};
|
||||
\node at (-3+1+0.5,-3+0.5) {$Q$};
|
||||
\node at (3+2+0.5,-3+0.5) {$Q$};
|
||||
\node at (9+3+0.5,-3+0.5) {$Q$};
|
||||
\node at (-9+0.5,-3+0.5) {\symqueen};
|
||||
\node at (-3+1+0.5,-3+0.5) {\symqueen};
|
||||
\node at (3+2+0.5,-3+0.5) {\symqueen};
|
||||
\node at (9+3+0.5,-3+0.5) {\symqueen};
|
||||
|
||||
\draw (2,0) -- (-7,-2);
|
||||
\draw (2,0) -- (-1,-2);
|
||||
|
@ -304,14 +304,14 @@ the backtracking algorithm are as follows:
|
|||
\draw (-1, -12) grid (3, -8);
|
||||
\draw (4, -12) grid (8, -8);
|
||||
\draw[white] (11, -12) grid (15, -8);
|
||||
\node at (-11+1+0.5,-9+0.5) {$Q$};
|
||||
\node at (-6+1+0.5,-9+0.5) {$Q$};
|
||||
\node at (-1+1+0.5,-9+0.5) {$Q$};
|
||||
\node at (4+1+0.5,-9+0.5) {$Q$};
|
||||
\node at (-11+0+0.5,-10+0.5) {$Q$};
|
||||
\node at (-6+1+0.5,-10+0.5) {$Q$};
|
||||
\node at (-1+2+0.5,-10+0.5) {$Q$};
|
||||
\node at (4+3+0.5,-10+0.5) {$Q$};
|
||||
\node at (-11+1+0.5,-9+0.5) {\symqueen};
|
||||
\node at (-6+1+0.5,-9+0.5) {\symqueen};
|
||||
\node at (-1+1+0.5,-9+0.5) {\symqueen};
|
||||
\node at (4+1+0.5,-9+0.5) {\symqueen};
|
||||
\node at (-11+0+0.5,-10+0.5) {\symqueen};
|
||||
\node at (-6+1+0.5,-10+0.5) {\symqueen};
|
||||
\node at (-1+2+0.5,-10+0.5) {\symqueen};
|
||||
\node at (4+3+0.5,-10+0.5) {\symqueen};
|
||||
|
||||
\draw (-1,-6) -- (-9,-8);
|
||||
\draw (-1,-6) -- (-4,-8);
|
||||
|
@ -368,7 +368,7 @@ and the arrays \texttt{r2} and \texttt{r3}
|
|||
keep track of the diagonals.
|
||||
It is not allowed to add another queen to a
|
||||
column or diagonal that already contains a queen.
|
||||
For example, the rows and the diagonals of
|
||||
For example, the rows and diagonals of
|
||||
the $4 \times 4$ board are numbered as follows:
|
||||
|
||||
\begin{center}
|
||||
|
|
|
@ -80,14 +80,14 @@ the answer for any possible query.
|
|||
|
||||
\subsubsection{Sum queries}
|
||||
|
||||
\index{sum array}
|
||||
\index{prefix sum array}
|
||||
|
||||
It turns out that we can easily process
|
||||
sum queries on a static array,
|
||||
because we can construct a data structure called
|
||||
a \key{sum array}.
|
||||
Each element in a sum array corresponds to
|
||||
the sum of elements in the original array up to that position.
|
||||
because we can use a data structure called
|
||||
a \key{prefix sum array}.
|
||||
Each value in such an array equals
|
||||
the sum of values in the original array up to that position.
|
||||
|
||||
For example, consider the following array:
|
||||
\begin{center}
|
||||
|
@ -115,7 +115,7 @@ For example, consider the following array:
|
|||
\node at (7.5,1.4) {$8$};
|
||||
\end{tikzpicture}
|
||||
\end{center}
|
||||
The corresponding sum array is as follows:
|
||||
The corresponding prefix sum array is as follows:
|
||||
\begin{center}
|
||||
\begin{tikzpicture}[scale=0.7]
|
||||
%\fill[color=lightgray] (3,0) rectangle (7,1);
|
||||
|
@ -144,7 +144,7 @@ The corresponding sum array is as follows:
|
|||
\end{center}
|
||||
Let $\textrm{sum}(a,b)$ denote the sum of elements
|
||||
in the range $[a,b]$.
|
||||
Since the sum array contains all values
|
||||
Since the prefix sum array contains all values
|
||||
of the form $\textrm{sum}(1,k)$,
|
||||
we can calculate any value of
|
||||
$\textrm{sum}(a,b)$ in $O(1)$ time, because
|
||||
|
@ -180,7 +180,7 @@ For example, consider the range $[4,7]$:
|
|||
\end{center}
|
||||
The sum in the range is $8+6+1+4=19$.
|
||||
This sum can be calculated using
|
||||
two values in the sum array:
|
||||
two values in the prefix sum array:
|
||||
\begin{center}
|
||||
\begin{tikzpicture}[scale=0.7]
|
||||
\fill[color=lightgray] (2,0) rectangle (3,1);
|
||||
|
@ -213,7 +213,7 @@ Thus, the sum in the range $[4,7]$ is $27-8=19$.
|
|||
It is also possible to generalize this idea
|
||||
to higher dimensions.
|
||||
For example, we can construct a two-dimensional
|
||||
sum array that can be used for calculating
|
||||
prefix sum array that can be used for calculating
|
||||
the sum of any rectangular subarray in $O(1)$ time.
|
||||
Each value in such an array is the sum of a subarray
|
||||
that begins at the upper-left corner of the array.
|
||||
|
@ -441,7 +441,7 @@ we can conclude that $\textrm{rmq}(2,7)=1$.
|
|||
\index{Fenwick tree}
|
||||
|
||||
A \key{binary indexed tree} or \key{Fenwick tree} \cite{fen94}
|
||||
can be seen as a dynamic variant of a sum array.
|
||||
can be seen as a dynamic version of a prefix sum array.
|
||||
This data structure supports two $O(\log n)$ time operations:
|
||||
calculating the sum of elements in a range
|
||||
and modifying the value of an element.
|
||||
|
@ -449,9 +449,9 @@ and modifying the value of an element.
|
|||
The advantage of a binary indexed tree is
|
||||
that it allows us to efficiently update
|
||||
the array elements between the sum queries.
|
||||
This would not be possible using a sum array,
|
||||
This would not be possible using a prefix sum array,
|
||||
because after each update, we should build the
|
||||
whole sum array again in $O(n)$ time.
|
||||
whole array again in $O(n)$ time.
|
||||
|
||||
\subsubsection{Structure}
|
||||
|
||||
|
@ -628,7 +628,7 @@ the following values:
|
|||
Hence, the sum of elements in the range $[1,7]$ is $16+7+4=27$.
|
||||
|
||||
To calculate the sum of elements in any range $[a,b]$,
|
||||
we can use the same trick that we used with sum arrays:
|
||||
we can use the same trick that we used with prefix sum arrays:
|
||||
\[ \textrm{sum}(a,b) = \textrm{sum}(1,b) - \textrm{sum}(1,a-1).\]
|
||||
Also in this case, only $O(\log n)$ values are needed.
|
||||
|
||||
|
@ -1314,12 +1314,18 @@ retrieve single values.
|
|||
We focus on an operation that increases all
|
||||
elements in a range $[a,b]$ by $x$.
|
||||
|
||||
\index{difference array}
|
||||
|
||||
Surprisingly, we can use the data structures
|
||||
presented in this chapter also in this situation.
|
||||
To do this, we build an \key{inverse sum array}
|
||||
To do this, we build a \key{difference array}
|
||||
for the array.
|
||||
The idea is that the original array is the sum array of the
|
||||
inverse sum array.
|
||||
In such an array, each value indicates
|
||||
the difference between two consecutive values
|
||||
in the original array.
|
||||
Thus, the original array is the
|
||||
prefix sum array of the
|
||||
difference array.
|
||||
For example, consider the following array:
|
||||
|
||||
\begin{center}
|
||||
|
@ -1348,7 +1354,7 @@ For example, consider the following array:
|
|||
\end{tikzpicture}
|
||||
\end{center}
|
||||
|
||||
The inverse sum array for the above array is as follows:
|
||||
The difference array for the above array is as follows:
|
||||
\begin{center}
|
||||
\begin{tikzpicture}[scale=0.7]
|
||||
\draw (0,0) grid (8,1);
|
||||
|
@ -1378,10 +1384,10 @@ The inverse sum array for the above array is as follows:
|
|||
For example, the value 5 at position 6 in the original array
|
||||
corresponds to the sum $3-2+4=5$.
|
||||
|
||||
The advantage of the inverse sum array is
|
||||
The advantage of the difference array is
|
||||
that we can update a range
|
||||
in the original array by changing just
|
||||
two elements in the inverse sum array.
|
||||
two elements in the difference array.
|
||||
For example, if we want to
|
||||
increase the elements in the range $2 \ldots 5$ by 5,
|
||||
it suffices to increase the value at position 2 by 5
|
||||
|
|
|
@ -546,4 +546,4 @@ it is difficult to find out if the nodes
|
|||
in a graph can be colored using $k$ colors
|
||||
so that no adjacent nodes have the same color.
|
||||
Even when $k=3$, no efficient algorithm is known
|
||||
but the problem is NP-hard \cite{gar79}.
|
||||
but the problem is NP-hard.
|
|
@ -5,7 +5,8 @@ In this chapter, we focus on two classes of directed graphs:
|
|||
\begin{itemize}
|
||||
\item \key{Acyclic graphs}:
|
||||
There are no cycles in the graph,
|
||||
so there is no path from any node to itself.
|
||||
so there is no path from any node to itself\footnote{Directed acyclic
|
||||
graphs are sometimes called DAGs.}.
|
||||
\item \key{Successor graphs}:
|
||||
The outdegree of each node is 1,
|
||||
so each node has a unique successor.
|
||||
|
|
|
@ -559,9 +559,5 @@ and both $x_i$ and $x_j$ become false.
|
|||
A more difficult problem is the \key{3SAT problem}
|
||||
where each part of the formula is of the form
|
||||
$(a_i \lor b_i \lor c_i)$.
|
||||
This problem is NP-hard \cite{gar79}, so no efficient algorithm
|
||||
for solving the problem is known.
|
||||
|
||||
|
||||
|
||||
|
||||
This problem is NP-hard, so no efficient algorithm
|
||||
for solving the problem is known.
|
|
@ -689,9 +689,9 @@ using a depth-first search:
|
|||
\end{tikzpicture}
|
||||
\end{center}
|
||||
|
||||
|
||||
However, we use a bit different technique where
|
||||
we add each node to the tree traversal array \emph{always}
|
||||
However, we use a bit different variant of
|
||||
the tree traversal array where
|
||||
we add each node to the array \emph{always}
|
||||
when the depth-first search visits the node,
|
||||
and not only at the first visit.
|
||||
Hence, a node that has $k$ children appears $k+1$ times
|
||||
|
|
|
@ -314,9 +314,9 @@ because both cases take a total of $O(n \sqrt n)$ time.
|
|||
|
||||
\index{Mo's algorithm}
|
||||
|
||||
\key{Mo's algorithm} \footnote{According to \cite{cod15}, this algorithm
|
||||
is named after Mo Tao, a Chinese competitive programmer. However,
|
||||
the technique has appeared earlier in the literature \cite{ken06}.} can be used in many problems
|
||||
\key{Mo's algorithm}\footnote{According to \cite{cod15}, this algorithm
|
||||
is named after Mo Tao, a Chinese competitive programmer, but
|
||||
the technique has appeared earlier in the literature.} can be used in many problems
|
||||
that require processing range queries in
|
||||
a \emph{static} array.
|
||||
Before processing the queries, the algorithm
|
||||
|
|
27
list.tex
27
list.tex
|
@ -88,7 +88,7 @@
|
|||
F. Le Gall.
|
||||
Powers of tensors and fast matrix multiplication.
|
||||
In \emph{Proceedings of the 39th International Symposium on Symbolic and Algebraic Computation},
|
||||
296--303.
|
||||
296--303, 2014.
|
||||
|
||||
\bibitem{gar79}
|
||||
M. R. Garey and D. S. Johnson.
|
||||
|
@ -116,20 +116,8 @@
|
|||
A method for the construction of minimum-redundancy codes.
|
||||
\emph{Proceedings of the IRE}, 40(9):1098--1101, 1952.
|
||||
|
||||
\bibitem{icpc}
|
||||
The ACM-ICPC International Collegiate Programming Contest,
|
||||
\url{https://icpc.baylor.edu/}
|
||||
|
||||
\bibitem{ioi}
|
||||
International Olympiad in Informatics -- Official site,
|
||||
\url{http://www.ioinformatics.org/}
|
||||
|
||||
\bibitem{iois}
|
||||
International Olympiad in Informatics -- Statistics,
|
||||
\url{http://stats.ioinformatics.org/}
|
||||
|
||||
\bibitem{ioiy}
|
||||
MisoF's IOI Syllabus page,
|
||||
The International Olympiad in Informatics Syllabus, available at
|
||||
\url{https://people.ksp.sk/~misof/ioi-syllabus/}
|
||||
|
||||
\bibitem{kar87}
|
||||
|
@ -142,11 +130,6 @@
|
|||
The statistics of dimers on a lattice: I. The number of dimer arrangements on a quadratic lattice.
|
||||
\emph{Physica}, 27(12):1209--1225, 1961.
|
||||
|
||||
\bibitem{ken06}
|
||||
C. Kent, G. m. Landau and M. Ziv-Ukelson.
|
||||
On the complexity of sparse exon assembly.
|
||||
\emph{Journal of Computational Biology}, 13(5):1013--1027, 2006.
|
||||
|
||||
\bibitem{kru56}
|
||||
J. B. Kruskal.
|
||||
On the shortest spanning subtree of a graph and the traveling salesman problem.
|
||||
|
@ -157,10 +140,6 @@
|
|||
An $O(n \log n)$ algorithm for finding all repetitions in a string.
|
||||
\emph{Journal of Algorithms}, 5(3):422--432, 1984.
|
||||
|
||||
\bibitem{main}
|
||||
Młodzieżowa Akademia Informatyczna (MAIN),
|
||||
\url{http://main.edu.pl/en}
|
||||
|
||||
\bibitem{pac13}
|
||||
J. Pachocki and J. Radoszweski.
|
||||
Where to use and how not to use polynomial string hashing.
|
||||
|
@ -186,4 +165,4 @@
|
|||
Dimer problem in statistical mechanics -- an exact result.
|
||||
\emph{Philosophical Magazine}, 6(68):1061--1063, 1961.
|
||||
|
||||
\end{thebibliography}
|
||||
\end{thebibliography}
|
Loading…
Reference in New Issue