diff --git a/chapter01.tex b/chapter01.tex index c7b5072..d6037ce 100644 --- a/chapter01.tex +++ b/chapter01.tex @@ -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; diff --git a/chapter05.tex b/chapter05.tex index d90120e..fce1d21 100644 --- a/chapter05.tex +++ b/chapter05.tex @@ -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} diff --git a/chapter09.tex b/chapter09.tex index 6b3eacf..572e6aa 100644 --- a/chapter09.tex +++ b/chapter09.tex @@ -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 diff --git a/chapter12.tex b/chapter12.tex index 90ae9c4..fe77bac 100644 --- a/chapter12.tex +++ b/chapter12.tex @@ -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}. \ No newline at end of file +but the problem is NP-hard. \ No newline at end of file diff --git a/chapter16.tex b/chapter16.tex index 605670a..f5e312d 100644 --- a/chapter16.tex +++ b/chapter16.tex @@ -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. diff --git a/chapter17.tex b/chapter17.tex index 8dbe992..ba99272 100644 --- a/chapter17.tex +++ b/chapter17.tex @@ -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. \ No newline at end of file diff --git a/chapter18.tex b/chapter18.tex index 7e445fb..309f2c1 100644 --- a/chapter18.tex +++ b/chapter18.tex @@ -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 diff --git a/chapter27.tex b/chapter27.tex index 38bbbad..8117e9d 100644 --- a/chapter27.tex +++ b/chapter27.tex @@ -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 diff --git a/list.tex b/list.tex index 26997b4..6cd1b06 100644 --- a/list.tex +++ b/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} \ No newline at end of file