diff --git a/.gitignore b/.gitignore index 3e4b45d..a481c20 100644 --- a/.gitignore +++ b/.gitignore @@ -1,16 +1,16 @@ -Gemfile.lock -test/dest -*.gem -pkg/ -*.swp -*~ -_site/ -.bundle/ -.DS_Store -bbin/ -gh-pages/ -site/_site/ -coverage -.ruby-version -.sass-cache - +Gemfile.lock +test/dest +*.gem +pkg/ +*.swp +*~ +_site/ +.bundle/ +.DS_Store +bbin/ +gh-pages/ +site/_site/ +coverage +.ruby-version +.sass-cache + diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json new file mode 100644 index 0000000..b11371a --- /dev/null +++ b/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": "No Configurations" +} \ No newline at end of file diff --git a/.vs/icpc-website/v16/.suo b/.vs/icpc-website/v16/.suo new file mode 100644 index 0000000..3345478 Binary files /dev/null and b/.vs/icpc-website/v16/.suo differ diff --git a/.vs/icpc-website/v16/Browse.VC.db b/.vs/icpc-website/v16/Browse.VC.db new file mode 100644 index 0000000..c150729 Binary files /dev/null and b/.vs/icpc-website/v16/Browse.VC.db differ diff --git a/.vs/icpc-website/v16/Browse.VC.opendb b/.vs/icpc-website/v16/Browse.VC.opendb new file mode 100644 index 0000000..b352b8d Binary files /dev/null and b/.vs/icpc-website/v16/Browse.VC.opendb differ diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000..47a30a3 Binary files /dev/null and b/.vs/slnx.sqlite differ diff --git a/CNAME b/CNAME index 624e75c..d02191a 100644 --- a/CNAME +++ b/CNAME @@ -1 +1 @@ -icpc.cs.illinois.edu +icpc.cs.illinois.edu diff --git a/README.md b/README.md index 60ce1a6..03c7484 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,32 @@ -# ACM-ICPC Website -This is the website repository for the ICPC team at UIUC. - -## Quick Start -
$ git clone https://github.com/acm-uiuc/icpc-website.git
-$ cd icpc-website
-$ jekyll serve --watch
-$ open http://localhost:4000/
- -## Page Updates -Update meeting summaries in the _post file. -- File name format "YYYY-MM-DD-Meeting-Title" -- Include this segment at the top ---- -layout: post -category: practices -time: 1:00 PM -description: Summary of Meeting ---- - Category can be either practices or announcement depending on the post type. - layout is always post - time can be anytime (please just make it reasonable) - description will be the small message under post on front page - -## Adding Links -If you get a 404 after adding a link to the website, try this -
$ git commit --allow-empty -m "Trigger rebuild"
-$ git push 
- -## Other Resources -Other resources can be found in [here](https://docs.google.com/presentation/d/1S6Cn7opfmwvdXv_hj0epf-f2VVPMVOSjQPr48xtk6Oc/edit#slide=id.g334dc67db_00). - +# ACM-ICPC Website +This is the website repository for the ICPC team at UIUC. + +## Quick Start +
$ git clone https://github.com/acm-uiuc/icpc-website.git
+$ cd icpc-website
+$ jekyll serve --watch
+$ open http://localhost:4000/
+ +## Page Updates +Update meeting summaries in the _post file. +- File name format "YYYY-MM-DD-Meeting-Title" +- Include this segment at the top +--- +layout: post +category: practices +time: 1:00 PM +description: Summary of Meeting +--- + Category can be either practices or announcement depending on the post type. + layout is always post + time can be anytime (please just make it reasonable) + description will be the small message under post on front page + +## Adding Links +If you get a 404 after adding a link to the website, try this +
$ git commit --allow-empty -m "Trigger rebuild"
+$ git push 
+ +## Other Resources +Other resources can be found in [here](https://docs.google.com/presentation/d/1S6Cn7opfmwvdXv_hj0epf-f2VVPMVOSjQPr48xtk6Oc/edit#slide=id.g334dc67db_00). + diff --git a/_config.yml b/_config.yml index 5ead05e..7e8786e 100644 --- a/_config.yml +++ b/_config.yml @@ -1,12 +1,12 @@ -site: - owner: - disque-shortname: icpc-cs-illinois-edu -comments: true - -name: ACM@UIUC ICPC -markdown: kramdown -redcarpet: - extensions: ["no_intra_emphasis", "fenced_code_blocks", "autolink", "tables", "with_toc_data"] -highlighter: rouge - -future: false +site: + owner: + disque-shortname: icpc-cs-illinois-edu +comments: true + +name: ACM@UIUC ICPC +markdown: kramdown +redcarpet: + extensions: ["no_intra_emphasis", "fenced_code_blocks", "autolink", "tables", "with_toc_data"] +highlighter: rouge + +future: false diff --git a/_includes/head.html b/_includes/head.html index cde6b2f..e8c5243 100644 --- a/_includes/head.html +++ b/_includes/head.html @@ -1,30 +1,30 @@ - - - - {{ page.title }} - ICPC @ UIUC - - - - - - - - - - - - - - - - - - {% if page.title == "Calendar" %} - - - - - - - {% endif %} - + + + + {{ page.title }} - ICPC @ UIUC + + + + + + + + + + + + + + + + + + {% if page.title == "Calendar" %} + + + + + + + {% endif %} + diff --git a/_includes/navbar.html b/_includes/navbar.html index 118b131..eea611e 100644 --- a/_includes/navbar.html +++ b/_includes/navbar.html @@ -1,51 +1,51 @@ - + diff --git a/_layouts/default.html b/_layouts/default.html index 2d4307e..5e8b504 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -1,15 +1,15 @@ - - - {% include head.html %} - - {% include navbar.html %} - {% if page.title == "UIUC's ICPC Team Homepage" %} -
- {% endif %} -
-
- {{ content }} -
-
- - + + + {% include head.html %} + + {% include navbar.html %} + {% if page.title == "UIUC's ICPC Team Homepage" %} +
+ {% endif %} +
+
+ {{ content }} +
+
+ + diff --git a/_layouts/post.html b/_layouts/post.html index b21e408..f71444b 100644 --- a/_layouts/post.html +++ b/_layouts/post.html @@ -1,48 +1,48 @@ ---- -layout: default ---- - -
- - -
- {% if page.category == "solutions" %} - -
-
- {% endif %} - -

{{ page.title }}

-

- {{ page.time }} • {{ page.date | date: "%b %-d, %Y" }} - {% if page.author %} • {{ page.author }}{% endif %} - {% if page.meta %} • {{ page.meta }}{% endif %} -

-
- -
- {{ content }} -
-
- - -
+--- +layout: default +--- + +
+ + +
+ {% if page.category == "solutions" %} + +
+
+ {% endif %} + +

{{ page.title }}

+

+ {{ page.time }} • {{ page.date | date: "%b %-d, %Y" }} + {% if page.author %} • {{ page.author }}{% endif %} + {% if page.meta %} • {{ page.meta }}{% endif %} +

+
+ +
+ {{ content }} +
+
+ + +
diff --git a/_plugins/title.rb b/_plugins/title.rb index 7ba0dc5..47bf537 100644 --- a/_plugins/title.rb +++ b/_plugins/title.rb @@ -1,6 +1,6 @@ -class Jekyll::Post - - def titleized_slug - self.slug.split(/[_-]/).join(' ') - end -end +class Jekyll::Post + + def titleized_slug + self.slug.split(/[_-]/).join(' ') + end +end diff --git a/_posts/2017-09-26-Season-2-Contest-1.md b/_posts/2017-09-26-Season-2-Contest-1.md index bb5e134..d0916f5 100644 --- a/_posts/2017-09-26-Season-2-Contest-1.md +++ b/_posts/2017-09-26-Season-2-Contest-1.md @@ -1,67 +1,67 @@ ---- -layout: post -category: solutions -time: 00:30 AM -description: Solutions for both Freshman and Open Divisions. ---- -# **[RGB Cards](http://abc064.contest.atcoder.jp/tasks/abc064_a?lang=en)** -We are given three digits \\(r, g, b\\) and are asked whether the number obtained from concatenating \\(r, g, b\\) is divisible by 4. Recall that a number is divisible by 4 if its last 2 digits form a number divisible by 4. Therefore, we only need to check if \\(g \times 10 + b\\) is divisible by 4. - -**Complexity:** O(1) - -**Sample Solution:** [rgb.py] - -# **[Break Number](http://abc068.contest.atcoder.jp/tasks/abc068_b)** -The number that is less than or equal to \\(N\\) and can be divided by 2 for the most times is just the largest power of 2 under \\(N\\). - -We can prove that this number is unique. -Let \\(2p\\) be the largest power of 2 under \\(N\\), and assume there is another number \\(x \leq N\\) that can also divided by 2 for \\(p\\) times. -If \\(x\\) is not equal to \\(2p\\), then it must contain some other odd factor greater or equal to \\(3\\). - -Therefore we have \\(2p ∗ 3 \leq N\\) , which is a contradiction since \\(2p\\) is not the largest power of 2 under \\(N\\) . - -**Complexity:** O(\\(\log{N}\\)) - -**Sample Solution:** [break.py] - -# **[A to Z String](http://abc053.contest.atcoder.jp/tasks/abc053_b?lang=en)** -Let \\(l\\) be the index of the first occurance of ’A’ in \\(s\\) and \\(r\\) be the index of the last occurrence of ’Z’ in \\(s\\). Then \\(r - l + 1\\) is the answer. - -**Complexity:** O(length(\\(s\\))) - -**Sample Solution:** [az.cpp] - -# **[Go Home](http://arc070.contest.atcoder.jp/tasks/arc070_a?lang=en)** - -We observe that if the kangaroo can reach position \\(X\\) at time \\(n\\), then \\(\frac{n(n + 1)}{2} \geq X\\). We will now prove that the converse is also true, that is if \\(\frac{n(n + 1)}{2} \geq X\\), then the kangaroo can reach \\(X\\) by time \\(n\\). To prove this, let us prove that we can create any sum \\(X \leq \frac{n(n + 1)}{2}\\) from numbers \\(1, 2, ..., n\\) where each number is used at most once. We will prove this using induction: - - Basis step: With \\(n = 1\\). Then, the only \\(X \leq n\\) is \\(X = 1\\). We can use \\(1\\) to create this sum. With \\(n = 2\\), the possible values of \\(X\\) are \\(1, 2, 3\\) which are the sum of \\({1}, {2}, {1, 2}\\). Then the claim holds true for \\(n = 1\\) and \\(n = 2\\). - - Induction step: Let \\(n > 2\\). Suppose the claim holds true for all \\(j < n\\), we will prove that it holds true for \\(n\\). Let \\(X \leq \frac{n(n + 1)}{2}\\) be our desired sum. Then, if \\(X \leq \frac{(n - 1)n}{2}\\), then we can create \\(X\\) from numbers \\(1, 2, ..., (n - 1)\\) (Induction hypothesis). Otherwise, \\(n \leq \frac{(n - 1)n}{2} < X \implies X - n > 0\\). We have \\(X \leq \frac{n(n + 1)}{2} \implies X - n \leq \frac{n(n + 1)}{2} - n = \frac{n(n - 1)}{2}\\). Then, according to the hypothesis, we can create a sum with of \\(X - n\\) from \\(1, 2, ..., n - 1\\). That sum along with \\(n\\) will form a sum equals \\(X\\). - -Then, for a given \\(X\\), we only need to find the smallest \\(n\\) where \\(\frac{n(n + 1)}{2} \geq X\\). - -**Complexity:** O(1) - -**Sample Solution:** [kangaroo.py] - -# **[Connectivity](http://abc049.contest.atcoder.jp/tasks/arc065_b?lang=en)** -First, we create 2 graphs \\(G_{road}\\) and \\(G_{railway}\\) where the the sets of vertices of these graphs represent the cities. There is an edge connecting two nodes \\(A, B\\) in \\(G_{road}\\) if there is a road connecting city \\(A\\) and city \\(B\\). Similarly, we can define the edges for \\(G_{railway}\\). Then, we can find all the connected components in \\(G_{road}\\) (using BFS or DFS) and number these components in some order. Then, let us define \\(x_A\\) be the component that contains node \\(A\\) (city \\(A\\)) in \\(G_{road}\\). We can do the same thing for \\(G_{railway}\\) and let \\(y_A\\) be the component that contains node \\(A\\) (city \\(A\\)) in \\(G_{railway}\\). Then, 2 cities \\(A, B\\) are connected by both roads and railways if and only if \\(x_A = x_B\\) and \\(y_A = y_B\\). We can then count \\(c(x, y)\\) which is the number of node \\(A\\) where \\(x_A = x\\) and \\(y_A = y\\) for all \\((x, y)\\). (i.e using \\(std::map\\) in \\(C++\\)). Then, for city \\(A\\), the number of other cities connected with \\(A\\) using both roads and railways is \\(c(x_A, y_A)\\). - -**Complexity:** O(\\(n\log{n}\\)) - -**Sample Solution:** [connectivity.cpp] - -# **[Array GCD](http://codeforces.com/problemset/problem/623/B)** -Since we are not allowed to remove the whole array, either \\(a_1\\) or \\(a_n\\) must be kept in the result array. Moreover, since we can only add or subtract at most 1 from each element, the result array must contain at least one of the following values \\(a_1, a_1 - 1, a_1 + 1, a_n, a_n - 1, a_n + 1\\). Since the GCD of all the elements in the result array is greater than 1, all of these elements have to be divisible by some prime factor \\(d\\). Then, \\(d\\) can only be one of the prime factors of \\(a_1, a_1 - 1, a_1 + 1, a_n, a_n - 1, a_n + 1\\). The number of \\(d\\) should be O(\\(\log{v}\\)) where \\(v = max\{a_1, a_1 - 1, a_1 + 1, a_n, a_n - 1, a_n + 1\}\\). - -Then, for each prime factor \\(d\\), we need to compute the minimum amount of money we have to pay to transform the array into another array where all elements are divisible by \\(d\\). This can be done using dynamic programming with \\(f[index][\textit{not deleting yet/deleting/done deleting}]\\) to be the minimum amount of money to transform first \\(index\\) elements where we either haven't deleted any elements yet / are deleting / have done deleting. - -**Complexity:** O(\\(n\log{v}\\)) - -**Sample Solution:** [gcd.cpp] - -[rgb.py]: /assets/ipl_solutions/season2/contest1/rgb.py -[break.py]: /assets/ipl_solutions/season2/contest1/break.py -[az.cpp]: /assets/ipl_solutions/season2/contest1/az.cpp -[kangaroo.py]: /assets/ipl_solutions/season2/contest1/kangaroo.py -[connectivity.cpp]: /assets/ipl_solutions/season2/contest1/connectivity.cpp -[gcd.cpp]: /assets/ipl_solutions/season2/contest1/gcd.cpp +--- +layout: post +category: solutions +time: 00:30 AM +description: Solutions for both Freshman and Open Divisions. +--- +# **[RGB Cards](http://abc064.contest.atcoder.jp/tasks/abc064_a?lang=en)** +We are given three digits \\(r, g, b\\) and are asked whether the number obtained from concatenating \\(r, g, b\\) is divisible by 4. Recall that a number is divisible by 4 if its last 2 digits form a number divisible by 4. Therefore, we only need to check if \\(g \times 10 + b\\) is divisible by 4. + +**Complexity:** O(1) + +**Sample Solution:** [rgb.py] + +# **[Break Number](http://abc068.contest.atcoder.jp/tasks/abc068_b)** +The number that is less than or equal to \\(N\\) and can be divided by 2 for the most times is just the largest power of 2 under \\(N\\). + +We can prove that this number is unique. +Let \\(2p\\) be the largest power of 2 under \\(N\\), and assume there is another number \\(x \leq N\\) that can also divided by 2 for \\(p\\) times. +If \\(x\\) is not equal to \\(2p\\), then it must contain some other odd factor greater or equal to \\(3\\). + +Therefore we have \\(2p ∗ 3 \leq N\\) , which is a contradiction since \\(2p\\) is not the largest power of 2 under \\(N\\) . + +**Complexity:** O(\\(\log{N}\\)) + +**Sample Solution:** [break.py] + +# **[A to Z String](http://abc053.contest.atcoder.jp/tasks/abc053_b?lang=en)** +Let \\(l\\) be the index of the first occurance of ’A’ in \\(s\\) and \\(r\\) be the index of the last occurrence of ’Z’ in \\(s\\). Then \\(r - l + 1\\) is the answer. + +**Complexity:** O(length(\\(s\\))) + +**Sample Solution:** [az.cpp] + +# **[Go Home](http://arc070.contest.atcoder.jp/tasks/arc070_a?lang=en)** + +We observe that if the kangaroo can reach position \\(X\\) at time \\(n\\), then \\(\frac{n(n + 1)}{2} \geq X\\). We will now prove that the converse is also true, that is if \\(\frac{n(n + 1)}{2} \geq X\\), then the kangaroo can reach \\(X\\) by time \\(n\\). To prove this, let us prove that we can create any sum \\(X \leq \frac{n(n + 1)}{2}\\) from numbers \\(1, 2, ..., n\\) where each number is used at most once. We will prove this using induction: + - Basis step: With \\(n = 1\\). Then, the only \\(X \leq n\\) is \\(X = 1\\). We can use \\(1\\) to create this sum. With \\(n = 2\\), the possible values of \\(X\\) are \\(1, 2, 3\\) which are the sum of \\({1}, {2}, {1, 2}\\). Then the claim holds true for \\(n = 1\\) and \\(n = 2\\). + - Induction step: Let \\(n > 2\\). Suppose the claim holds true for all \\(j < n\\), we will prove that it holds true for \\(n\\). Let \\(X \leq \frac{n(n + 1)}{2}\\) be our desired sum. Then, if \\(X \leq \frac{(n - 1)n}{2}\\), then we can create \\(X\\) from numbers \\(1, 2, ..., (n - 1)\\) (Induction hypothesis). Otherwise, \\(n \leq \frac{(n - 1)n}{2} < X \implies X - n > 0\\). We have \\(X \leq \frac{n(n + 1)}{2} \implies X - n \leq \frac{n(n + 1)}{2} - n = \frac{n(n - 1)}{2}\\). Then, according to the hypothesis, we can create a sum with of \\(X - n\\) from \\(1, 2, ..., n - 1\\). That sum along with \\(n\\) will form a sum equals \\(X\\). + +Then, for a given \\(X\\), we only need to find the smallest \\(n\\) where \\(\frac{n(n + 1)}{2} \geq X\\). + +**Complexity:** O(1) + +**Sample Solution:** [kangaroo.py] + +# **[Connectivity](http://abc049.contest.atcoder.jp/tasks/arc065_b?lang=en)** +First, we create 2 graphs \\(G_{road}\\) and \\(G_{railway}\\) where the the sets of vertices of these graphs represent the cities. There is an edge connecting two nodes \\(A, B\\) in \\(G_{road}\\) if there is a road connecting city \\(A\\) and city \\(B\\). Similarly, we can define the edges for \\(G_{railway}\\). Then, we can find all the connected components in \\(G_{road}\\) (using BFS or DFS) and number these components in some order. Then, let us define \\(x_A\\) be the component that contains node \\(A\\) (city \\(A\\)) in \\(G_{road}\\). We can do the same thing for \\(G_{railway}\\) and let \\(y_A\\) be the component that contains node \\(A\\) (city \\(A\\)) in \\(G_{railway}\\). Then, 2 cities \\(A, B\\) are connected by both roads and railways if and only if \\(x_A = x_B\\) and \\(y_A = y_B\\). We can then count \\(c(x, y)\\) which is the number of node \\(A\\) where \\(x_A = x\\) and \\(y_A = y\\) for all \\((x, y)\\). (i.e using \\(std::map\\) in \\(C++\\)). Then, for city \\(A\\), the number of other cities connected with \\(A\\) using both roads and railways is \\(c(x_A, y_A)\\). + +**Complexity:** O(\\(n\log{n}\\)) + +**Sample Solution:** [connectivity.cpp] + +# **[Array GCD](http://codeforces.com/problemset/problem/623/B)** +Since we are not allowed to remove the whole array, either \\(a_1\\) or \\(a_n\\) must be kept in the result array. Moreover, since we can only add or subtract at most 1 from each element, the result array must contain at least one of the following values \\(a_1, a_1 - 1, a_1 + 1, a_n, a_n - 1, a_n + 1\\). Since the GCD of all the elements in the result array is greater than 1, all of these elements have to be divisible by some prime factor \\(d\\). Then, \\(d\\) can only be one of the prime factors of \\(a_1, a_1 - 1, a_1 + 1, a_n, a_n - 1, a_n + 1\\). The number of \\(d\\) should be O(\\(\log{v}\\)) where \\(v = max\{a_1, a_1 - 1, a_1 + 1, a_n, a_n - 1, a_n + 1\}\\). + +Then, for each prime factor \\(d\\), we need to compute the minimum amount of money we have to pay to transform the array into another array where all elements are divisible by \\(d\\). This can be done using dynamic programming with \\(f[index][\textit{not deleting yet/deleting/done deleting}]\\) to be the minimum amount of money to transform first \\(index\\) elements where we either haven't deleted any elements yet / are deleting / have done deleting. + +**Complexity:** O(\\(n\log{v}\\)) + +**Sample Solution:** [gcd.cpp] + +[rgb.py]: /assets/ipl_solutions/season2/contest1/rgb.py +[break.py]: /assets/ipl_solutions/season2/contest1/break.py +[az.cpp]: /assets/ipl_solutions/season2/contest1/az.cpp +[kangaroo.py]: /assets/ipl_solutions/season2/contest1/kangaroo.py +[connectivity.cpp]: /assets/ipl_solutions/season2/contest1/connectivity.cpp +[gcd.cpp]: /assets/ipl_solutions/season2/contest1/gcd.cpp diff --git a/_posts/2017-10-01-Season-2-Contest-2.md b/_posts/2017-10-01-Season-2-Contest-2.md index 44dc15c..0c958f5 100644 --- a/_posts/2017-10-01-Season-2-Contest-2.md +++ b/_posts/2017-10-01-Season-2-Contest-2.md @@ -1,187 +1,187 @@ ---- -layout: post -category: solutions -time: 20:00 PM -description: Solutions for both Freshman and Open Divisions. ---- -# **[Find Remainder](https://www.codechef.com/problems/FLOW002)** -For each pair of \\(A, B\\), we are asked to output the remainder for A divided by B. This is accomplished by operator \\(%\\) in most programming languages. - -**Complexity:** O(1) - -**Sample Solution:** [remain.cpp] - -# **[Puppy and Sum](https://www.codechef.com/problems/PPSUM)** -Observe that we can write the recursive definition of \\(sum\\): - -\\(sum(D, N) = sum(1, sum(D-1, N))\\) for \\(D > 1\\) - -\\(sum(1, N) = sum(N) = \frac{N * (N+1)}{2}\\) - -**Complexity:** O(\\(D\\)) - -**Sample Solution:** [ppsum.cpp] - -# **[AtCoDeer and Election Report](http://abc046.contest.atcoder.jp/tasks/arc062_a?lang=en)** -The key to solve this problem is to realize that the number of votes each candidate -gets is non-decreasing. - -Let \\(t_k\\) be the minimum number of votes Takahashi gets at time \\(k\\) (right after -AtCoDeer checked the report), and \\(a_k\\) for Aoki respectively. - -Then at time \\(1\\), \\(t_1 = T_1\\) and \\(a_1 = A_1\\), since -\\(T_k\\) and \\(A_k\\) are coprime. - -At time \\(k > 1\\), we want \\(t_k\\) and \\(a_k\\) to be barely -larger than (or equal to) \\(t_{k-1}\\) and \\(a_{k-1}\\), and satisfy the ratio \\(T_k : A_k\\). -Therefore, we need to find the minimum integer \\(n\\) such that -\\(n T_k \geq t_{k-1}\\) and \\(n A_k \geq a_{k-1}\\). -Note it is very inefficient to compute \\(n\\) using a while loop, since -the numbers get big really quickly. Instead, use integer division. -Floating point division and the ceiling function would also work, but highly NOT recommended. - -Repeat the process and update the votes for time \\(k = 2, 3, ..., N\\), and you get the final result. - -Also since the result could be as big as \\(10^{18}\\), it is necessary to use 64-bit integers. - -**Complexity:** O(\\(N\\)) - -**Sample Solution:** [election.cpp] - -# **[Marathon](http://codeforces.com/problemset/problem/404/B)** -The hardest part of this problem is about using floating point. -Dealing with floating point numbers is very tricky due to precision issues, -so if it is possible, by all means we should -somehow convert floating point numbers into regular integers. - -One hint in the problem statement is that both \\(a, d\\) have at most -4 digits after the decimal point. This means we can simply multiply -the floating point numbers by 10000 to get the same integer representations. -After that, we can directly deal with integers. - -Another thing to notice is that the output size of this problem is kinda large, -so use fast IO (for example, scanf, printf in C++) can help speed things up. - -**Time Complexity:** O(\\(n\\)) - -**Sample Solution:** [marathon.cpp] - -# **[Restore Graph](http://codeforces.com/problemset/problem/404/C)** -We first notice that, if there exists a graph satisfying the requirements, then -the must at least exists a tree that also satisfies such requirements. Recall that -a tree is a connected acyclic graph. We should also notice that, there should exists -exactly one vertex \\(i\\) such that \\(d[i] = 0\\). - -Now, let us sort the vertices \\(u_1, u_2, ..., u_n\\) such that: \\(d[u_1] \leq -d[u_2] \leq ... \leq d[u_n]\\). Then, if \\(d[u_1] \neq 0\\), there exists no graph -that satisfies the requirement. Otherwise, let us try to build a valid tree. - -We maintain \\(n\\) stacks \\(s[0], s[1], ..., s[n - 1]\\) where \\(s[i]\\) contains -vertices \\(u\\) such that \\(d[u] = i\\) and the current degree of \\(u\\) is at -most \\(k - 1\\). Then, we can push \\(u_1\\) into \\(s[0]\\) and mark degree of -\\(u_1\\) as 0. Now, for each \\(i\\) from \\(2 \to n\\) we do the following: - - Get vetex \\(v\\) on top of stack \\(s[d[u_i] - 1]\\). If the stack is empty, -we stop the algorithm and reports that no such graph exists. - - Next, we add an edge connecting \\(v\\) and \\(u_i\\), increase the degree of -\\(v\\) and mark the degree of \\(u_i\\) as 1. - - Push \\(u_i\\) onto \\(s[d[u_i]]\\). - - If degree of \\(v\\) is \\(k\\), remove \\(v\\) from \\(s[d[u_i] - 1]\\). - -At each step, if there are many vertices \\(v\\) that we can connect \\(u_i\\) to, -it does not matter which \\(v\\) we choose to do so. Therefore, the algorithm -guarantees to find the tree with given requirements if there exists one. - -**Time Complexity:** O(\\(n\\)) - -**Sample Solution:** [restore.cpp] - -# **[Lego Blocks](https://www.hackerrank.com/contests/codesprint-practice/challenges/lego-blocks)** -A typical DP problem. Notice that all blocks are of height 1, and only differ -in widths. - -First let's consider \\(all\\_walls(h, w)\\), which gives the total number of -ways to build a wall of height \\(h\\) and width \\(w\\), without considering -the requirement of solidness. Since we are not considering solidness, it is -clear that all rows are independent of each other. Let \\(rows(w)\\) be the -total number of ways to build a wall of height 1 and width \\(w\\), then we have -\\(all\\_walls(h, w) = rows(w)^h \\). This exponentiation can either be -computed directly (O(\\(h\\))) or use exponentiation by squaring -(O(\\(\log(h)\\))). Either way will work for this problem given height is at most -\\(1000\\). - -To compute \\(rows(w)\\), we will use dynamic programming. The recurrence is -simply -\\[rows(w) = rows(w - 1) + rows(w - 2) + rows(w - 3) + rows(w - 4) \\] -We intentionally left out the base cases so readers can think by themselves. -If you are unsure, check the sample solution code at the end. - -After discussing \\(all\\_walls(h, w)\\), now let's consider -\\(solid\\_walls(h, w)\\), which is the total number of ways to build a -solid wall of height \\(h\\) and width \\(w\\). Directly counting the number -of solid walls efficiently is very hard. Instead, we can easily compute the -number of walls that are not solid given height and width. - -If a wall is not solid, then by definition, we can find a vertical cut so that -no block is blocking that cut. In other words, this vertical cut effectively -partitions the original wall into two smaller walls. - -By enumerating the vertical cuts, we can split the original wall into two -smaller walls, a sign for another dynamic programming. However, in order to -avoid double counting, we should only enumerate the leftmost vertical cut. -Namely, the wall left of the vertical cut must be solid, and the wall right -of the vertical cut can either be solid or not. - -Let \\(vert\\_cut\\) be the position such that the leftmost vertical cut is -on the right side of this position. -So we can compute \\(invalid\\_walls(height, width)\\) as - -\\[\sum_{vert\\_cut = 1}^{width - 1} - solid\\_walls(height, vert\\_cut) - \times all\\_walls(height, width - vert\\_cut)\\] - -At last, we can get -\\[solid\\_walls(height, width) = all\\_walls(height, width) - - invalid\\_walls(height, width) \\] - -Filling up \\(all\\_walls\\) takes O(\\(NM\\)), and for each height, computing -\\(solid\\_walls\\) takes O(\\(M^2\\)). Since there are total \\(T\\) test case, -the time complexity will be O(\\(NM + TM^2\\)). - -**Sample Solution:** [lego.cpp] - -# **[Nice SubSegments](https://www.codechef.com/problems/SUBSGM)** -Let \\(d_i = x_{i + 1} - x_i\\) for all \\(1 \leq i < n\\). Then, if \\(x_i, x_{i + 1}, -x_{i + 2}, ..., x_{j - 1}, x_j\\) form a nice subsequence, then we have \\(d_i = d_{i + 1} -= d_{i + 2} = ... = d_{j - 1} = 1\\). Thus, we can solve this problem using segment tree (for -those who are not familiar with segment tree, you can find everything you need here -http://codeforces.com/blog/entry/15729). - -We will maintain a segment tree that contains information of \\(d_1, d_2, ..., d_{n - 1}\\), -where for each node \((k\)) containing information of \\(d_l, d_{l + 1}, ..., d_r\\), we will -store three information: - -- \\(T[k].L\\): The longest consecutive subsequence containing all 1 that starts at \\(l\\). -- \\(T[k].R\\): The longest consecutive subsequence containing all 1 that ends at \\(r\\). -- \\(T[k].M\\): The longest consecutive subsequence containing all 1 in \\([l..r]\\). - -Then, let \\(k_L, k_R\\) be the left and right child of \\(k\\): - -- If the whole segment controlled by \\(k_L\\) is 1, \\(T[k].L = T[k_L].L + T[k_R].L\\). -Otherwise, \\(T[k].L = T[k_L].L\\). -- Similarly, we have either \\(T[k].R = T[k_R].R + T[k_L].R\\) or \\(T[k].R = T[k_R].R\\). -- \\(T[k].M = max(T[k].L, T[k].R, T[k_L].M, T[k_R].M, T[k_L].R + T[k_R].L)\\) - -Then, for each query, we can easily update the value of \\(d\\) in O(\\(\log{n}\\)) and -get the result in O(1). - -**Time Complexity:** O(\\(q\log{n}\\)) - -**Sample Solution:** [subsgm.cpp] - -[remain.cpp]: /assets/ipl_solutions/season2/contest2/remain.cpp -[ppsum.cpp]: /assets/ipl_solutions/season2/contest2/ppsum.cpp -[election.cpp]: /assets/ipl_solutions/season2/contest2/election.cpp -[marathon.cpp]: /assets/ipl_solutions/season2/contest2/marathon.cpp -[restore.cpp]: /assets/ipl_solutions/season2/contest2/restore.cpp -[lego.cpp]: /assets/ipl_solutions/season2/contest2/lego.cpp -[subsgm.cpp]: /assets/ipl_solutions/season2/contest2/subsgm.cpp +--- +layout: post +category: solutions +time: 20:00 PM +description: Solutions for both Freshman and Open Divisions. +--- +# **[Find Remainder](https://www.codechef.com/problems/FLOW002)** +For each pair of \\(A, B\\), we are asked to output the remainder for A divided by B. This is accomplished by operator \\(%\\) in most programming languages. + +**Complexity:** O(1) + +**Sample Solution:** [remain.cpp] + +# **[Puppy and Sum](https://www.codechef.com/problems/PPSUM)** +Observe that we can write the recursive definition of \\(sum\\): + +\\(sum(D, N) = sum(1, sum(D-1, N))\\) for \\(D > 1\\) + +\\(sum(1, N) = sum(N) = \frac{N * (N+1)}{2}\\) + +**Complexity:** O(\\(D\\)) + +**Sample Solution:** [ppsum.cpp] + +# **[AtCoDeer and Election Report](http://abc046.contest.atcoder.jp/tasks/arc062_a?lang=en)** +The key to solve this problem is to realize that the number of votes each candidate +gets is non-decreasing. + +Let \\(t_k\\) be the minimum number of votes Takahashi gets at time \\(k\\) (right after +AtCoDeer checked the report), and \\(a_k\\) for Aoki respectively. + +Then at time \\(1\\), \\(t_1 = T_1\\) and \\(a_1 = A_1\\), since +\\(T_k\\) and \\(A_k\\) are coprime. + +At time \\(k > 1\\), we want \\(t_k\\) and \\(a_k\\) to be barely +larger than (or equal to) \\(t_{k-1}\\) and \\(a_{k-1}\\), and satisfy the ratio \\(T_k : A_k\\). +Therefore, we need to find the minimum integer \\(n\\) such that +\\(n T_k \geq t_{k-1}\\) and \\(n A_k \geq a_{k-1}\\). +Note it is very inefficient to compute \\(n\\) using a while loop, since +the numbers get big really quickly. Instead, use integer division. +Floating point division and the ceiling function would also work, but highly NOT recommended. + +Repeat the process and update the votes for time \\(k = 2, 3, ..., N\\), and you get the final result. + +Also since the result could be as big as \\(10^{18}\\), it is necessary to use 64-bit integers. + +**Complexity:** O(\\(N\\)) + +**Sample Solution:** [election.cpp] + +# **[Marathon](http://codeforces.com/problemset/problem/404/B)** +The hardest part of this problem is about using floating point. +Dealing with floating point numbers is very tricky due to precision issues, +so if it is possible, by all means we should +somehow convert floating point numbers into regular integers. + +One hint in the problem statement is that both \\(a, d\\) have at most +4 digits after the decimal point. This means we can simply multiply +the floating point numbers by 10000 to get the same integer representations. +After that, we can directly deal with integers. + +Another thing to notice is that the output size of this problem is kinda large, +so use fast IO (for example, scanf, printf in C++) can help speed things up. + +**Time Complexity:** O(\\(n\\)) + +**Sample Solution:** [marathon.cpp] + +# **[Restore Graph](http://codeforces.com/problemset/problem/404/C)** +We first notice that, if there exists a graph satisfying the requirements, then +the must at least exists a tree that also satisfies such requirements. Recall that +a tree is a connected acyclic graph. We should also notice that, there should exists +exactly one vertex \\(i\\) such that \\(d[i] = 0\\). + +Now, let us sort the vertices \\(u_1, u_2, ..., u_n\\) such that: \\(d[u_1] \leq +d[u_2] \leq ... \leq d[u_n]\\). Then, if \\(d[u_1] \neq 0\\), there exists no graph +that satisfies the requirement. Otherwise, let us try to build a valid tree. + +We maintain \\(n\\) stacks \\(s[0], s[1], ..., s[n - 1]\\) where \\(s[i]\\) contains +vertices \\(u\\) such that \\(d[u] = i\\) and the current degree of \\(u\\) is at +most \\(k - 1\\). Then, we can push \\(u_1\\) into \\(s[0]\\) and mark degree of +\\(u_1\\) as 0. Now, for each \\(i\\) from \\(2 \to n\\) we do the following: + - Get vetex \\(v\\) on top of stack \\(s[d[u_i] - 1]\\). If the stack is empty, +we stop the algorithm and reports that no such graph exists. + - Next, we add an edge connecting \\(v\\) and \\(u_i\\), increase the degree of +\\(v\\) and mark the degree of \\(u_i\\) as 1. + - Push \\(u_i\\) onto \\(s[d[u_i]]\\). + - If degree of \\(v\\) is \\(k\\), remove \\(v\\) from \\(s[d[u_i] - 1]\\). + +At each step, if there are many vertices \\(v\\) that we can connect \\(u_i\\) to, +it does not matter which \\(v\\) we choose to do so. Therefore, the algorithm +guarantees to find the tree with given requirements if there exists one. + +**Time Complexity:** O(\\(n\\)) + +**Sample Solution:** [restore.cpp] + +# **[Lego Blocks](https://www.hackerrank.com/contests/codesprint-practice/challenges/lego-blocks)** +A typical DP problem. Notice that all blocks are of height 1, and only differ +in widths. + +First let's consider \\(all\\_walls(h, w)\\), which gives the total number of +ways to build a wall of height \\(h\\) and width \\(w\\), without considering +the requirement of solidness. Since we are not considering solidness, it is +clear that all rows are independent of each other. Let \\(rows(w)\\) be the +total number of ways to build a wall of height 1 and width \\(w\\), then we have +\\(all\\_walls(h, w) = rows(w)^h \\). This exponentiation can either be +computed directly (O(\\(h\\))) or use exponentiation by squaring +(O(\\(\log(h)\\))). Either way will work for this problem given height is at most +\\(1000\\). + +To compute \\(rows(w)\\), we will use dynamic programming. The recurrence is +simply +\\[rows(w) = rows(w - 1) + rows(w - 2) + rows(w - 3) + rows(w - 4) \\] +We intentionally left out the base cases so readers can think by themselves. +If you are unsure, check the sample solution code at the end. + +After discussing \\(all\\_walls(h, w)\\), now let's consider +\\(solid\\_walls(h, w)\\), which is the total number of ways to build a +solid wall of height \\(h\\) and width \\(w\\). Directly counting the number +of solid walls efficiently is very hard. Instead, we can easily compute the +number of walls that are not solid given height and width. + +If a wall is not solid, then by definition, we can find a vertical cut so that +no block is blocking that cut. In other words, this vertical cut effectively +partitions the original wall into two smaller walls. + +By enumerating the vertical cuts, we can split the original wall into two +smaller walls, a sign for another dynamic programming. However, in order to +avoid double counting, we should only enumerate the leftmost vertical cut. +Namely, the wall left of the vertical cut must be solid, and the wall right +of the vertical cut can either be solid or not. + +Let \\(vert\\_cut\\) be the position such that the leftmost vertical cut is +on the right side of this position. +So we can compute \\(invalid\\_walls(height, width)\\) as + +\\[\sum_{vert\\_cut = 1}^{width - 1} + solid\\_walls(height, vert\\_cut) + \times all\\_walls(height, width - vert\\_cut)\\] + +At last, we can get +\\[solid\\_walls(height, width) = all\\_walls(height, width) - + invalid\\_walls(height, width) \\] + +Filling up \\(all\\_walls\\) takes O(\\(NM\\)), and for each height, computing +\\(solid\\_walls\\) takes O(\\(M^2\\)). Since there are total \\(T\\) test case, +the time complexity will be O(\\(NM + TM^2\\)). + +**Sample Solution:** [lego.cpp] + +# **[Nice SubSegments](https://www.codechef.com/problems/SUBSGM)** +Let \\(d_i = x_{i + 1} - x_i\\) for all \\(1 \leq i < n\\). Then, if \\(x_i, x_{i + 1}, +x_{i + 2}, ..., x_{j - 1}, x_j\\) form a nice subsequence, then we have \\(d_i = d_{i + 1} += d_{i + 2} = ... = d_{j - 1} = 1\\). Thus, we can solve this problem using segment tree (for +those who are not familiar with segment tree, you can find everything you need here +http://codeforces.com/blog/entry/15729). + +We will maintain a segment tree that contains information of \\(d_1, d_2, ..., d_{n - 1}\\), +where for each node \((k\)) containing information of \\(d_l, d_{l + 1}, ..., d_r\\), we will +store three information: + +- \\(T[k].L\\): The longest consecutive subsequence containing all 1 that starts at \\(l\\). +- \\(T[k].R\\): The longest consecutive subsequence containing all 1 that ends at \\(r\\). +- \\(T[k].M\\): The longest consecutive subsequence containing all 1 in \\([l..r]\\). + +Then, let \\(k_L, k_R\\) be the left and right child of \\(k\\): + +- If the whole segment controlled by \\(k_L\\) is 1, \\(T[k].L = T[k_L].L + T[k_R].L\\). +Otherwise, \\(T[k].L = T[k_L].L\\). +- Similarly, we have either \\(T[k].R = T[k_R].R + T[k_L].R\\) or \\(T[k].R = T[k_R].R\\). +- \\(T[k].M = max(T[k].L, T[k].R, T[k_L].M, T[k_R].M, T[k_L].R + T[k_R].L)\\) + +Then, for each query, we can easily update the value of \\(d\\) in O(\\(\log{n}\\)) and +get the result in O(1). + +**Time Complexity:** O(\\(q\log{n}\\)) + +**Sample Solution:** [subsgm.cpp] + +[remain.cpp]: /assets/ipl_solutions/season2/contest2/remain.cpp +[ppsum.cpp]: /assets/ipl_solutions/season2/contest2/ppsum.cpp +[election.cpp]: /assets/ipl_solutions/season2/contest2/election.cpp +[marathon.cpp]: /assets/ipl_solutions/season2/contest2/marathon.cpp +[restore.cpp]: /assets/ipl_solutions/season2/contest2/restore.cpp +[lego.cpp]: /assets/ipl_solutions/season2/contest2/lego.cpp +[subsgm.cpp]: /assets/ipl_solutions/season2/contest2/subsgm.cpp diff --git a/_posts/2017-10-07-Season-2-Contest-3.md b/_posts/2017-10-07-Season-2-Contest-3.md index 7446095..c794c2d 100644 --- a/_posts/2017-10-07-Season-2-Contest-3.md +++ b/_posts/2017-10-07-Season-2-Contest-3.md @@ -1,141 +1,141 @@ ---- -layout: post -category: solutions -time: 20:00 PM -description: Solutions for both Freshman and Open Divisions. ---- -# **[Patrick and Shopping](http://codeforces.com/problemset/problem/599/A)** -Since there are only three locations and three roads, we can just enumerate all the possible shortest paths - -Patrick could take and take the minimum: -* (house -> shop 1 -> shop 2 -> house) or (house -> shop 2 -> shop 1 -> house) : \\(s_1 = d_1 + d_2 + d_3\\) -* (house -> shop 1 -> shop 2 -> shop 1 -> house) : \\(s_2 = d_1 + d_3 + d_3 + d_1\\) -* (house -> shop 2 -> shop 1 -> shop 2 -> house) : \\(s_3 = d_2 + d_3 + d_3 + d_2\\) -* (house -> shop 1 -> house -> shop 2 -> house) or (house -> shop 2 -> house -> shop 1 -> house) : \\(s_4 = 2d_1 + 2d_2\\) - -Then the answer is \\(\min(s_1, s_2, s_3, s_4)\\). - -Alternatively, you can think of it in this way: what if we use -* all the three roads? -* two of the three roads? -* only one road? - -**Complexity:** O\\((1)\\) - -**Sample Solution:** [shopping.cpp] - -# **[Sum of Digits](https://www.codechef.com/problems/FLOW006)** -Here are two easy ways to calculate the sum of digits of each number: -* Treat each line of the input as an integer, use the mod operator to get the last digit (mod by 10) and keep dividing the number by 10 until it is zero. - - **Sample Solution:** [digits1.cpp] -* Treat each line of the input as a string, and compute \\(\sum (c_i - '0')\\), where \\(c_i\\) is the \\(i^{th}\\) character. - - Why does this work? Ascii code. - - **Sample Solution:** [digits2.cpp] - -**Complexity:** O\\((T \log N)\\) - -# **[Second Order Statistics](http://codeforces.com/problemset/problem/22/A)** -The problem is pretty straight forward: find the smallest element that is strictly greater than the minimum. -When all the \\(n\\) numbers are the same, this element does not exist and you should output "NO". -Here are 2 ways to solve this problem: -* Sort the whole array (using a library function) in increasing order and then use a loop to find the first element that is different from the minimum one. - - **Complexity:** O\\((n \log n)\\) - - **Sample Solution:** [sos_method1.cpp] -* First use a loop to find the minimum element \\(m\\), then use another loop to find the minimum element that is different from \\(m\\). - - **Complexity:** O\\((n)\\) - - **Sample Solution:** [sos_method2.cpp] - -# **[Cinema Line](http://codeforces.com/problemset/problem/349/A)** -Since we cannot change the order of customers, we can simply run a sequential simulation through all the bills and check if all changes can be satisfied. We keep track of the number of 25 and 50 bills that the seller is holding. Consider three cases: -* An incoming 25 bill. No change is required. -* An incoming 50 bill. The only strategy is to give a 25 bill change. -* An incoming 100 bill. The seller can either give back 50+25 or three 25's. However, 50 bill can always be substituted by two 25 bills, so the seller wants to hold as many 25's as possible. Thus we always prioritize the former strategy of giving change. -If a change cannot be satisfied, output NO. If end of line is reached and all changes are satisfied, output YES. - -**Complexity:** O(\\(n\\)) - -**Sample Solution:** [cinema.cpp] - -# **[Team](http://codeforces.com/problemset/problem/401/C)** -You are asked to construct a 0-1 string with n 0's and m 1's, with no consecutive zeros and no three-consecutive ones. -First, observe that there is a solution iff \\(n-1 <= m <= 2(n+1)\\). for \\(n <= m <= 2n\\), such case can be implemented by selecting an appropriate combination of "10" and "110". The \\(n-1 = m\\) case can be reduced to \\(n = m\\) case by appending a 0 at front; the \\(m > 2n\\) case can be reduced to \\(m = 2n\\) case by append 1 or 11 at end. - -**Complexity:** O(\\(n + m\\)) - -**Sample Solution:** [team.cpp] - -# **[Maze](http://codeforces.com/problemset/problem/377/A)** -Let the number of empty cells be \\(e\\). Since we know that all empty cell in the given maze forms -a connected area (any empty cell can reac h any other empty cell), we can start from an arbitrary -empty cell \\(x\\) and search for exactly \\((e - k - 1)\\) empty cells that are connected to \\(x\\) -(using BFS or DFS). Then, these \\(e - k - 1\\) along with \\(x\\) cells form a connected area. We can -then turn all empty cells that does not belong to the chosen cells to walls. - -**Complexity:** O(\\(n + m\\)) - -**Sample Solution:** [maze.cpp] - -# **[Queries on a Binary Tree](https://www.codechef.com/problems/BINTREEQ)** -First, suppose we have a node \\(x\\) with binary representation \\(x_1x_2x_3...x_q\\) such that -\\(x_i \in \{0, 1\}\\) \\(\forall 1 \leq i \leq q\\). Then: - -- The left child of \\(x\\) has binary representation \\(x_1x_2...x_q0\\) -- The right child of \\(x\\) has binary representation \\(x_1x_2...x_q1\\) -- The parent of \\(x\\) has binary representation \\(x_1x_2...x_{q - 1}\\) - -Let us consider the binary representation of \\(u, v\\) \\(u = u_1u_2u_3...u_{k}, v = v_1v_2v_3...v_{m}\\) -where \\(u_i \in \{0, 1\}\\) \\(\forall 1 \leq i \leq k\\), \\(v_j \in \{0, 1\}\\) \\(\forall 1 \leq j \leq m\\). Then, -let \\(t\\) be the length of the longest common prefix of \\(u_1u_2u_3...u_{k}\\) and \\(v_1v_2v_3...v_{m}\\). -That is, \\(t\\) is the largest number such that \\(u_i = v_i\\) \\(\forall 1 \leq i \leq t\\). - -Let \\(a\\) be the lowest common ancestor of \\(u, v\\). Then, the binary representation of \\(a\\) is \\(u_1u_2...u_t\\). -Since, the graph is a tree, the unique path from \\(u\\) to \\(v\\) is the path through \\(a\\). Then, this path is defined -by \\(u_{t + 1}, u_{t + 2}, ..., u_k, v_{t + 1}, v_{t + 2}, ..., v_m\\). Thus, if two nodes \\(c, d\\) have the same path -configuration as \\(u, v\\), then \\(c, d\\) must have the binary representations of \\(su_{t + 1}u_{t + 2}...u_k, sv_{t + 1} -v_{t + 1}...v_m\\) (\\(s\\) is an arbitrary binary string). Then, our problem is to find the number of \\(s\\) that makes \\( -c, d \leq n\\). - -Let \\(u_{suf} = u_{t + 1}u_{t + 2}...u_k, v_{suf} = v_{t + 1}v_{t + 2}...v_m\\). Then, we have \\(2^{k - t}s + u_{suf} \leq n\\) -and \\(2^{m - t}s + v_{suf} \leq n\\). Then \\(1 \leq s \leq max\big(\big\lfloor\frac{n - u_{suf}}{2^{k - t}}\big\rfloor, \big\lfloor\frac{n - v_{suf}}{2^{m - t}}\big\rfloor\big)\\) -and \\(s\\) is an integer. - -Therefore, the answer to the problem is \\(max\big(\big\lfloor\frac{n - u_{suf}}{2^{k - t}}\big\rfloor, \big\lfloor\frac{n - v_{suf}}{2^{m - t}}\big\rfloor\big)\\). - -**Complexity:** O(\\(q\log{n}\\)) - -**Sample Solution:** [bintree.cpp] - -# **[Dead Ends](http://codeforces.com/problemset/problem/53/E)** -To rephrase the problem, we are given a graph \\(G = (V, E)\\), we need to count the number of spanning trees of \\(G\\) that contains -exactly \\(k\\) leaves. This problem can be solved using dynamic programming with bitmask. Let \\(L \subseteq C \subseteq V\\) be 2 -subsets of \\(V\\). Then, let \\(f(C, L)\\) be the number of trees which has the set of nodes \\(C\\) and subset of leaves \\(L\\). - -Suppose we have 2 sets \\(L \subseteq C \subseteq V\\). Then, consider following cases: -- If \\(\left\vert{L}\right\vert < 2\\): \\(f(C, L) = 0\\) -- If \\(\left\vert{L}\right\vert = \left\vert{C}\right\vert = 2\\): Let \\(u, v\\) be the 2 elements in \\(C\\). If there is an edge connecting \\(u, v\\), \\(f(C, L) = 1\\). -Otherwise, \\(f(C, L) = 0\\). -- Otherwise: Since \\(|L| \geq 2\\), there exists \\(u \in L\\). Then: -\begin{equation} -f(C, L) = \sum_{v \in C, v \notin L, uv \in E} f(C\setminus\\{u\\}, L\setminus\\{v\\}) + f(C\setminus\\{u\\}, L\setminus\\{u, v\\}) -\end{equation} - -Then, our answer is -\begin{equation} -\sum_{C = V, L \subseteq C, \left\vert{L}\right\vert = k} f(C, L) -\end{equation} - -**Complexity:** O(\\(3^nn\\)) - -**Sample Solution:** [deadends.cpp] - -[digits1.cpp]: /assets/ipl_solutions/season2/contest3/digits1.cpp -[digits2.cpp]: /assets/ipl_solutions/season2/contest3/digits2.cpp -[shopping.cpp]: /assets/ipl_solutions/season2/contest3/shopping.cpp -[sos_method1.cpp]: /assets/ipl_solutions/season2/contest3/sos_method1.cpp -[sos_method2.cpp]: /assets/ipl_solutions/season2/contest3/sos_method2.cpp -[cinema.cpp]: /assets/ipl_solutions/season2/contest3/cinema.cpp -[team.cpp]: /assets/ipl_solutions/season2/contest3/team.cpp -[maze.cpp]: /assets/ipl_solutions/season2/contest3/maze.cpp -[bintree.cpp]: /assets/ipl_solutions/season2/contest3/bintree.cpp -[deadends.cpp]: /assets/ipl_solutions/season2/contest3/deadends.cpp - +--- +layout: post +category: solutions +time: 20:00 PM +description: Solutions for both Freshman and Open Divisions. +--- +# **[Patrick and Shopping](http://codeforces.com/problemset/problem/599/A)** +Since there are only three locations and three roads, we can just enumerate all the possible shortest paths + +Patrick could take and take the minimum: +* (house -> shop 1 -> shop 2 -> house) or (house -> shop 2 -> shop 1 -> house) : \\(s_1 = d_1 + d_2 + d_3\\) +* (house -> shop 1 -> shop 2 -> shop 1 -> house) : \\(s_2 = d_1 + d_3 + d_3 + d_1\\) +* (house -> shop 2 -> shop 1 -> shop 2 -> house) : \\(s_3 = d_2 + d_3 + d_3 + d_2\\) +* (house -> shop 1 -> house -> shop 2 -> house) or (house -> shop 2 -> house -> shop 1 -> house) : \\(s_4 = 2d_1 + 2d_2\\) + +Then the answer is \\(\min(s_1, s_2, s_3, s_4)\\). + +Alternatively, you can think of it in this way: what if we use +* all the three roads? +* two of the three roads? +* only one road? + +**Complexity:** O\\((1)\\) + +**Sample Solution:** [shopping.cpp] + +# **[Sum of Digits](https://www.codechef.com/problems/FLOW006)** +Here are two easy ways to calculate the sum of digits of each number: +* Treat each line of the input as an integer, use the mod operator to get the last digit (mod by 10) and keep dividing the number by 10 until it is zero. + - **Sample Solution:** [digits1.cpp] +* Treat each line of the input as a string, and compute \\(\sum (c_i - '0')\\), where \\(c_i\\) is the \\(i^{th}\\) character. + - Why does this work? Ascii code. + - **Sample Solution:** [digits2.cpp] + +**Complexity:** O\\((T \log N)\\) + +# **[Second Order Statistics](http://codeforces.com/problemset/problem/22/A)** +The problem is pretty straight forward: find the smallest element that is strictly greater than the minimum. +When all the \\(n\\) numbers are the same, this element does not exist and you should output "NO". +Here are 2 ways to solve this problem: +* Sort the whole array (using a library function) in increasing order and then use a loop to find the first element that is different from the minimum one. + - **Complexity:** O\\((n \log n)\\) + - **Sample Solution:** [sos_method1.cpp] +* First use a loop to find the minimum element \\(m\\), then use another loop to find the minimum element that is different from \\(m\\). + - **Complexity:** O\\((n)\\) + - **Sample Solution:** [sos_method2.cpp] + +# **[Cinema Line](http://codeforces.com/problemset/problem/349/A)** +Since we cannot change the order of customers, we can simply run a sequential simulation through all the bills and check if all changes can be satisfied. We keep track of the number of 25 and 50 bills that the seller is holding. Consider three cases: +* An incoming 25 bill. No change is required. +* An incoming 50 bill. The only strategy is to give a 25 bill change. +* An incoming 100 bill. The seller can either give back 50+25 or three 25's. However, 50 bill can always be substituted by two 25 bills, so the seller wants to hold as many 25's as possible. Thus we always prioritize the former strategy of giving change. +If a change cannot be satisfied, output NO. If end of line is reached and all changes are satisfied, output YES. + +**Complexity:** O(\\(n\\)) + +**Sample Solution:** [cinema.cpp] + +# **[Team](http://codeforces.com/problemset/problem/401/C)** +You are asked to construct a 0-1 string with n 0's and m 1's, with no consecutive zeros and no three-consecutive ones. +First, observe that there is a solution iff \\(n-1 <= m <= 2(n+1)\\). for \\(n <= m <= 2n\\), such case can be implemented by selecting an appropriate combination of "10" and "110". The \\(n-1 = m\\) case can be reduced to \\(n = m\\) case by appending a 0 at front; the \\(m > 2n\\) case can be reduced to \\(m = 2n\\) case by append 1 or 11 at end. + +**Complexity:** O(\\(n + m\\)) + +**Sample Solution:** [team.cpp] + +# **[Maze](http://codeforces.com/problemset/problem/377/A)** +Let the number of empty cells be \\(e\\). Since we know that all empty cell in the given maze forms +a connected area (any empty cell can reac h any other empty cell), we can start from an arbitrary +empty cell \\(x\\) and search for exactly \\((e - k - 1)\\) empty cells that are connected to \\(x\\) +(using BFS or DFS). Then, these \\(e - k - 1\\) along with \\(x\\) cells form a connected area. We can +then turn all empty cells that does not belong to the chosen cells to walls. + +**Complexity:** O(\\(n + m\\)) + +**Sample Solution:** [maze.cpp] + +# **[Queries on a Binary Tree](https://www.codechef.com/problems/BINTREEQ)** +First, suppose we have a node \\(x\\) with binary representation \\(x_1x_2x_3...x_q\\) such that +\\(x_i \in \{0, 1\}\\) \\(\forall 1 \leq i \leq q\\). Then: + +- The left child of \\(x\\) has binary representation \\(x_1x_2...x_q0\\) +- The right child of \\(x\\) has binary representation \\(x_1x_2...x_q1\\) +- The parent of \\(x\\) has binary representation \\(x_1x_2...x_{q - 1}\\) + +Let us consider the binary representation of \\(u, v\\) \\(u = u_1u_2u_3...u_{k}, v = v_1v_2v_3...v_{m}\\) +where \\(u_i \in \{0, 1\}\\) \\(\forall 1 \leq i \leq k\\), \\(v_j \in \{0, 1\}\\) \\(\forall 1 \leq j \leq m\\). Then, +let \\(t\\) be the length of the longest common prefix of \\(u_1u_2u_3...u_{k}\\) and \\(v_1v_2v_3...v_{m}\\). +That is, \\(t\\) is the largest number such that \\(u_i = v_i\\) \\(\forall 1 \leq i \leq t\\). + +Let \\(a\\) be the lowest common ancestor of \\(u, v\\). Then, the binary representation of \\(a\\) is \\(u_1u_2...u_t\\). +Since, the graph is a tree, the unique path from \\(u\\) to \\(v\\) is the path through \\(a\\). Then, this path is defined +by \\(u_{t + 1}, u_{t + 2}, ..., u_k, v_{t + 1}, v_{t + 2}, ..., v_m\\). Thus, if two nodes \\(c, d\\) have the same path +configuration as \\(u, v\\), then \\(c, d\\) must have the binary representations of \\(su_{t + 1}u_{t + 2}...u_k, sv_{t + 1} +v_{t + 1}...v_m\\) (\\(s\\) is an arbitrary binary string). Then, our problem is to find the number of \\(s\\) that makes \\( +c, d \leq n\\). + +Let \\(u_{suf} = u_{t + 1}u_{t + 2}...u_k, v_{suf} = v_{t + 1}v_{t + 2}...v_m\\). Then, we have \\(2^{k - t}s + u_{suf} \leq n\\) +and \\(2^{m - t}s + v_{suf} \leq n\\). Then \\(1 \leq s \leq max\big(\big\lfloor\frac{n - u_{suf}}{2^{k - t}}\big\rfloor, \big\lfloor\frac{n - v_{suf}}{2^{m - t}}\big\rfloor\big)\\) +and \\(s\\) is an integer. + +Therefore, the answer to the problem is \\(max\big(\big\lfloor\frac{n - u_{suf}}{2^{k - t}}\big\rfloor, \big\lfloor\frac{n - v_{suf}}{2^{m - t}}\big\rfloor\big)\\). + +**Complexity:** O(\\(q\log{n}\\)) + +**Sample Solution:** [bintree.cpp] + +# **[Dead Ends](http://codeforces.com/problemset/problem/53/E)** +To rephrase the problem, we are given a graph \\(G = (V, E)\\), we need to count the number of spanning trees of \\(G\\) that contains +exactly \\(k\\) leaves. This problem can be solved using dynamic programming with bitmask. Let \\(L \subseteq C \subseteq V\\) be 2 +subsets of \\(V\\). Then, let \\(f(C, L)\\) be the number of trees which has the set of nodes \\(C\\) and subset of leaves \\(L\\). + +Suppose we have 2 sets \\(L \subseteq C \subseteq V\\). Then, consider following cases: +- If \\(\left\vert{L}\right\vert < 2\\): \\(f(C, L) = 0\\) +- If \\(\left\vert{L}\right\vert = \left\vert{C}\right\vert = 2\\): Let \\(u, v\\) be the 2 elements in \\(C\\). If there is an edge connecting \\(u, v\\), \\(f(C, L) = 1\\). +Otherwise, \\(f(C, L) = 0\\). +- Otherwise: Since \\(|L| \geq 2\\), there exists \\(u \in L\\). Then: +\begin{equation} +f(C, L) = \sum_{v \in C, v \notin L, uv \in E} f(C\setminus\\{u\\}, L\setminus\\{v\\}) + f(C\setminus\\{u\\}, L\setminus\\{u, v\\}) +\end{equation} + +Then, our answer is +\begin{equation} +\sum_{C = V, L \subseteq C, \left\vert{L}\right\vert = k} f(C, L) +\end{equation} + +**Complexity:** O(\\(3^nn\\)) + +**Sample Solution:** [deadends.cpp] + +[digits1.cpp]: /assets/ipl_solutions/season2/contest3/digits1.cpp +[digits2.cpp]: /assets/ipl_solutions/season2/contest3/digits2.cpp +[shopping.cpp]: /assets/ipl_solutions/season2/contest3/shopping.cpp +[sos_method1.cpp]: /assets/ipl_solutions/season2/contest3/sos_method1.cpp +[sos_method2.cpp]: /assets/ipl_solutions/season2/contest3/sos_method2.cpp +[cinema.cpp]: /assets/ipl_solutions/season2/contest3/cinema.cpp +[team.cpp]: /assets/ipl_solutions/season2/contest3/team.cpp +[maze.cpp]: /assets/ipl_solutions/season2/contest3/maze.cpp +[bintree.cpp]: /assets/ipl_solutions/season2/contest3/bintree.cpp +[deadends.cpp]: /assets/ipl_solutions/season2/contest3/deadends.cpp + diff --git a/_posts/2017-10-17-Tryout-2.md b/_posts/2017-10-17-Tryout-2.md index f8ff6fa..90c4997 100644 --- a/_posts/2017-10-17-Tryout-2.md +++ b/_posts/2017-10-17-Tryout-2.md @@ -1,211 +1,211 @@ ---- -layout: post -category: solutions -time: 00:30 AM -description: Solutions for second tryout (ICPC North America Qualifier 2017) ---- -# Problems: You can find the problemset [here](https://open.kattis.com/contests/naq17open/problems) - -# B: Bumbped -We first create a graph \\(G = (V, E)\\) where -* The set of vertices is - \begin{equation} - V' = \{ (u, x) | \forall 1 \leq u \leq n, x \in \\{0, 1\\} \} - \end{equation} -* There is an edge from \\(u, x\\) and \\(v, y\\) in \\(E'\\) with cost \\(C\\) if and only if one of the following is true: - - \\(x = y\\) and there is an a road connecting \\(u_{th}\\) city and \\(v_{th}\\) city. In this case \\(C\\) equals the cost to travel \\(u, v\\) road. - - \\(x < y\\) and there is a flight from \\(u_{th}\\) city to \\(v_{th}\\) city. In this case \\(C = 0\\). - -Let us denote \\(L((u, x), (v, y))\\) be the length of the shortest path from \\((u, x)\\) to \\((v, y)\\) in \\(G\\). Then, the answer to our original problem is - \begin{equation} - min \\{ L((s, x), (t, y)) | \forall x, y \in \\{0, 1\\} \wedge x \leq y \\} - \end{equation} - -We can solve this by using Dijkstra algorithm on \\(G\\). - -# C: Canonical Coin Systems -To solve this problem, we need to determine if there is a counterexample for the given system. We will use dynamic programming to answer this question. - -Let \\(f(S\\) be the minimum number of coins we need to form a sum of \\(S\\) using the given denominations. Then we have - \begin{equation} - f(S) = min\\{f(S - c_i) + 1 | 1 \leq i \leq n\\} - \end{equation} - -Let \\(g(S\\)) be the number of coins we need to form the sum of \\(S\\) using greedy algorithm. Then - \begin{equation} - g(S) = g(S - c_t) \textit{ where t is the maximum number such that \\(c_t \leq S\\)} - \end{equation} - -Then, a sum \\(S\\) is a counterexample if \\(f(S) \neq g(S)\\). Since we are already given a hint that the minimum counter example is at most \\(2c_n\\), we only need to compute \\(f(S), g(S)\\) for all \\(S \leq 2c_n\\). Thus, the complexity of the algorithm is only O(\\(nc_n\\)). - -# D: Cat and Mice -Let \\((x_i, y_i)\\) and \\(s_i\\) be the coordinate of the \\(i_{th}\\) mouse and the time it stays above the ground. -We also denote function \\(T(i, j, v) = \frac{\sqrt{(x_i - x_j)^2 + (y_i - y_j)^2}}{v}\\) be the amount of time to get -from the \\(i_{th}\\) mouse to the \\(j_{th}\\) mouse with speed \\(v\\). - -
- -Suppose we have two real values \\(v_1, v_2\\) such that \\(v_1 < v_2\\) and we are able to get all the mice with initial -speed \\(v_1\\), then clearly we can also achieve the same thing with initial speed \\(v_2\\). Similarly, if we can't get -all the mice with initial speed \\(v_2\\), we certainly can't get all the mice with initial speed \\(v_1\\). With this -property, we can binary search the minimum initial speed \\(v\\). Then, our problem becomes: Given an initial speed \\(v\\), -determine whether we are able to get all the mice. - -
- -We will solve the new problem using dynamic programming. Let \\(f(S, i)\\) (where \\(S\\) is a subset of all mice and -\\(i \in S\\)) be the minimum amount of time we need to get all the mice in set \\(S\\) and the last mouse we get is -\\(i\\). We also denote \\(f(S, i) = -1\\) if there is no way to get all the mice in \\(S\\) with \\(i\\) be the last one. -For the sake of our problem, we also denote \\(min\{\emptyset\} = -1\\). Let \\(x_0 = y_0 = 0\\), then our base cases will be -- If \\(T(0, i, v) > s_i\\), \\(f(\\{i\\}, i) = -1\\). -- Otherwise, \\(f(\\{i\\}, i) = T(0, i, v)\\). - -And for all other cases - \begin{equation} - f(S, i) = min \\{ f(S', j) + T(i, j, v) | S' = S \setminus \\{i\\}, j \in S', f(S', j) \neq -1, f(S', j) + T(i, j, v) \leq s_i\\} - \end{equation} - -
- -Then, we can get all the mice with initial speed \\(v\\) if there exists \\(i\\) (\\(1 \leq i \leq n\\)) such that -\\(f(\\{1, 2, ..., n\\}, i) \neq -1\\). - -# E: Company Picnic -Let us number the employees from \\(1 \to n\\) and let \\(s_i\\) be the running speed of the \\(i_{th}\\) employee. Let us -create a rooted tree \\(G\\) where each node represents an employee and node \\(i\\) is a parent of node \\(j\\) if the -\\(j_{th}\\) employee is the direct supervisor of the \\(i_{th}\\) employee. The root of the tree is the node representing -the CEO. - -
- -Suppose we have a value \\(v\\). If we know that there exists a formation which results in the average speed \\(v_a \leq v\\), -we know that the answer is at least \\(v\\). Otherwise, the answer cannot exceed \\(v\\). With this property, we can binary -search for the optimal average speed \\(v_{optimal}\\). Then, the remaining problem is to determine if we can form a set of -teams where the average speed is at least \\(v_{min}\\) for any given \\(v_{min}\\). - -
- -We will solve this problem using dynamic programming. Suppose we have a team formation with pairs \\((i_1, j_1), (i_2, j_2), ..., (i_k, j_k)\\). -Then, the average running speed of these teams is - \begin{equation} - \frac{\sum_{t = 1}^k min\\{s_{i_t}, s_{j_t}\\}}{k} - \end{equation} -Let \\(T_{v_{min}}(i, j) = min\\{s_i, s_j\\} - v_{min}\\). Then we have - \begin{equation} - \frac{\sum_{t = 1}^k min\\{s_{i_t}, s_{j_t}\\}}{k} \geq v_{min} \iff \sum_{t = 1}^k min\\{s_{i_t}, s_{j_t}\\} \geq kv_{min} \iff \sum_{t = 1}^k (min\\{s_{i_t}, s_{j_t}\\} - v_{min}) = - \sum_{t = 1}^k T_{v_{min}}(i_t, j_t) \geq 0 - \end{equation} - -Let us call the sum \\(\sum_{t = 1}^k (min\\{s_{i_t}, s_{j_t}\\})\\) the \\(T\\)-sum of this formation. - -
- -Let \\(f(u, p)\\) (\\(1 \leq u \leq n, p \in \\{0, 1\\}\\)) be the maximum number of teams can be formed using only employees -represented by nodes under subtree rooted at \\(u\\) and \\(p\\) denotes whether we can pair \\(u\\) with one of its children -(\\(p = 1\\) means you can). Similarly, let \\(g(u, p)\\) be the maximum \\(T\\)-sum of all the formation with \\(f(u, p)\\) teams. -Lastly, let \\(better(u)\\) be defined as: -- If \\(f(u, 0) > f(u, 1)\\) or \\(f(u, 0) = f(u, 1) \wedge g(u, 0) > g(u, 1)\\), \\(better(u) = 1\\). -- Otherwise, \\(better(u) = 0\\). - -Then, for each \\(u\\) we have: -- \\(f(u, 0) = \sum_{v \in children(u)} f(v, better(v))\\) -- \\(g(u, 0) = \sum_{v \in children(u)} g(v, better(v))\\) - -To calculate \\(f(u, 1)\\) and \\(g(u, 1)\\), we will try to pair \\(u\\) with each of its child and take the maximum: -- \\(f(u, 1) = f(u, 0) + max\\{f(v, 0) - f(v, better(v)) + 1 \vert v \in children(u)\\}\\) -- \\(g(u, 1) = g(u, 0) + max\\{g(v, 0) - g(v, better(v)) + T_{v_{min}}(u, v) \vert v \in children(u)\\}\\) - -
- -Then, to determine if the minimum average speed is at least \\(v_{min}\\), we only need to check if \\(g(root, 0) \geq 0\\). - -# F: GlitchBot -Since the constraints are relatively small, for each instruction, we can replace that instruction with \\(\textit{Forward/Left/Right}\\) -and the check if the new set of instruction is correct. We can verify if a set of instructions is correct by simulating the robot. -We stop as soon as we can find a good instruction set by replacing some instruction. Since we have \\(n\\) instructions and for each -instruction, the simulation process takes O(\\(n\\)), the total complexity is O(\\(n^2\\)). - -# G: Greeting Card -We are given \\(n\\) points on an \\(xy\\)-plane. We are asked to count the number of pair of two points such that the Euclidean -distance between them is exactly 2018. - -
- -Suppose we have 2 points \\((x_1, y_1)\\) and \\((x_2, y_2)\\). Then - \begin{equation} - \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2} = 2018 \iff (x_1 - x_2)^2 + (y_1 - y_2)^2 = 2018^2 - \end{equation} - -Since \\(x_1, x_2, y_1, y_2\\) are all integers, \\((x_1 - x_2)^2\\) and \\((y_1 - y_2)^2\\) are integers. The key -observation here is there are only 4 ordered pairs of integers \\((a, b)\\) such that \\(a^2 + b^2 = 2018^2\\). Those are -(0, 2018), (2018, 0), (1118, 1680), (1680, 1118). - -
- -Then, for each point \\((x, y)\\) among the \\(n\\) given points and each pair \\((a, b)\\) mentioned above, we will count -the number of points \\((x', y')\\) that: - \begin{equation} - |x - x'| = a \wedge |y - y'| = b - \end{equation} -This can be done in several ways. One easy way to achieve this is that for each given point, we will store it inside a data -structure that allows fast query base on the coordinates (such as \\(\textit{std::set}\\) or \\(\textit{std::map}\\) in C++). -Since each pair of points would be counted twice this way, we need to divide our sum by 2 to get the desired answer. - -# H: Imperfect GPS -Let \\(T\\) be the recording period of the GPS. For each time \\(t\\) which is a multiple of \\(T\\) and does not exceed \\(t_n\\) -we will calculate the position of the runner. If \\(t = t_n\\), then the position recorded by the GPS at time \\(t\\) is \\((x_n, y_n)\\). -Otherwise, let \\(j\\) be the largest number between 1 and \\(n\\) such that the \\(t_j\\) is at most \\(t\\). Then, the position -recorded by GPS at time \\(t\\) \\((x', y')\\) is: - \begin{equation} - x' = \frac{t - t_{j}}{t_{j + 1} - t_{j}}(x_{j + 1} - x_{j}) + x_j, - y' = \frac{t - t_{j}}{t_{j + 1} - t_{j}}(y_{j + 1} - y_{j}) + y_j - \end{equation} -To get the index \\(j\\) for each time \\(t\\), we can either use two-pointers technique or binary search for \\(j\\). With the -recorded positions of the GPS, it should be easy to calculate the desired answer. - -# I: Odd Gnome -Suppose we have \\(n\\) gnomes in line with indexes \\(a_1, a_2, ..., a_n\\). Then, if there exists index \\(1 < i < n\\) such that -\\(a_i \neq a_{i - 1} + 1\\) and \\(a_i \neq a_{i + 1} - 1\\), then the \\(i_{th}\\) gnome is the king. Otherwise, if \\(a_1 \neq a_2 - 1\\) -then the \\(1_{st}\\) gnome is the king. Other than that, the last gnome is the king. - -# J: Progressive Scramble -Suppose we have a string \\(s\\) with length \\(L\\): -- To encode \\(s\\) into \\(s'\\): \\(s'_0 = s_0\\) and \\(s'_i = v^{-1}\bigg(\Big(v\big(s_i\big) + v\big(s'\_{i - 1}\big)\Big)\bigg) -\textit{ mod } 27\\) for all \\(1 \leq i \leq L\\) -- To decode \\(s\\) to get \\(s'\\): \\(s'_0 = s_0\\) and \\(s'_i = v^{-1}\Bigg(\bigg(\Big(v\big(s_i\big) - v\big(s'\_{i - 1}\big)\Big) -\textit{ mod } 27 + 27\bigg) \textit{ mod } 27\Bigg)\\) for all \\(1 \leq i \leq L\\) - -Where \\(v^{-1}\\) is the inverse function of \\(v\\). - -# K: Space Probe -Notice that the product \\(nk \leq 10^7\\), for each measurements time \\(m_i\\) and prohibited segment \\([b, e]\\), we know that -the starting time cannot be between \\([b - m_i, e - e_i]\\). Therefore, we can obtain \\(nk\\) segments of starting time that are -"prohibited". Let us sort the beginning and the ending of all such segments. For points with the same magnitude, we break the tie -by prioritizing the beginning points. We will then perform sweep line algorithm on the sorted points and keep track of the "opening" -segments at each point. Let \\(l, count\\) all initially equals to zero. Then, we iterate through the sorted points in order. For -a point \\(x\\): -- If \\(x\\) is a closing point: We decrease the value of \\(count\\). If \\(count = 0\\), we assign \\(l = x\\). -- If \\(x\\) is a beginning point: We increase the value of \\(count\\). If \\(count = 1\\), let \\(L = max(t_1, l), R = min(t_2, x)\\). -If \\(L > R\\), we can go to the next point. Otherwise, \\([L, R] = [t_1, t_2] \cup [l, x]\\). Then, we know for sure that it is safe to -start the process anytime in between \\((L, R)\\). Thus, we add \\(\frac{R - L}{t_2 - t_1}\\) to the result. - -After iterating over all points, we can do similarly to the second case with \\(x = t_2\\). Then, we will have our final result. - -# L: Suspension Bridges -We have - \begin{equation} - a + s = a \cdot \cosh\bigg(\frac{d}{2a}\bigg) \implies s = a \cdot \cosh\bigg(\frac{d}{2a}\bigg) - a - \end{equation} - -Noticing that the function \\(s(a)\\) is decreasing, we can binary search for the right value of \\(a\\). With such value, -we can easily calculate the required result. - -# M: Umbral Decoding -Suppose we have a safe point \\((x, y, b)\\) and a point \\((p, q)\\) that lies inside the umbra of the given safe point. Then - \begin{equation} - |x - p|^3 + |y - q|^3 \leq b \implies |x - p|^3 \leq b \implies |x - p| \leq \sqrt[3]{b} - \end{equation} -Similarly, we have \\(|y - q| \leq \sqrt[3]{b}\\). We also know that \\(b \leq 10^9 \implies \sqrt[3]{b} \leq 10^3\\). Thus, for -any safe point, the points that are inside its umbra also lies in a relatively small square around it. Thus, for each safe point, -we can iterate through all points lying in its umbra and deduct them from our result. To mark the duplicating points, we can -use data structures such as \\(\textit{std::set}\\) in C++. +--- +layout: post +category: solutions +time: 00:30 AM +description: Solutions for second tryout (ICPC North America Qualifier 2017) +--- +# Problems: You can find the problemset [here](https://open.kattis.com/contests/naq17open/problems) + +# B: Bumbped +We first create a graph \\(G = (V, E)\\) where +* The set of vertices is + \begin{equation} + V' = \{ (u, x) | \forall 1 \leq u \leq n, x \in \\{0, 1\\} \} + \end{equation} +* There is an edge from \\(u, x\\) and \\(v, y\\) in \\(E'\\) with cost \\(C\\) if and only if one of the following is true: + - \\(x = y\\) and there is an a road connecting \\(u_{th}\\) city and \\(v_{th}\\) city. In this case \\(C\\) equals the cost to travel \\(u, v\\) road. + - \\(x < y\\) and there is a flight from \\(u_{th}\\) city to \\(v_{th}\\) city. In this case \\(C = 0\\). + +Let us denote \\(L((u, x), (v, y))\\) be the length of the shortest path from \\((u, x)\\) to \\((v, y)\\) in \\(G\\). Then, the answer to our original problem is + \begin{equation} + min \\{ L((s, x), (t, y)) | \forall x, y \in \\{0, 1\\} \wedge x \leq y \\} + \end{equation} + +We can solve this by using Dijkstra algorithm on \\(G\\). + +# C: Canonical Coin Systems +To solve this problem, we need to determine if there is a counterexample for the given system. We will use dynamic programming to answer this question. + +Let \\(f(S\\) be the minimum number of coins we need to form a sum of \\(S\\) using the given denominations. Then we have + \begin{equation} + f(S) = min\\{f(S - c_i) + 1 | 1 \leq i \leq n\\} + \end{equation} + +Let \\(g(S\\)) be the number of coins we need to form the sum of \\(S\\) using greedy algorithm. Then + \begin{equation} + g(S) = g(S - c_t) \textit{ where t is the maximum number such that \\(c_t \leq S\\)} + \end{equation} + +Then, a sum \\(S\\) is a counterexample if \\(f(S) \neq g(S)\\). Since we are already given a hint that the minimum counter example is at most \\(2c_n\\), we only need to compute \\(f(S), g(S)\\) for all \\(S \leq 2c_n\\). Thus, the complexity of the algorithm is only O(\\(nc_n\\)). + +# D: Cat and Mice +Let \\((x_i, y_i)\\) and \\(s_i\\) be the coordinate of the \\(i_{th}\\) mouse and the time it stays above the ground. +We also denote function \\(T(i, j, v) = \frac{\sqrt{(x_i - x_j)^2 + (y_i - y_j)^2}}{v}\\) be the amount of time to get +from the \\(i_{th}\\) mouse to the \\(j_{th}\\) mouse with speed \\(v\\). + +
+ +Suppose we have two real values \\(v_1, v_2\\) such that \\(v_1 < v_2\\) and we are able to get all the mice with initial +speed \\(v_1\\), then clearly we can also achieve the same thing with initial speed \\(v_2\\). Similarly, if we can't get +all the mice with initial speed \\(v_2\\), we certainly can't get all the mice with initial speed \\(v_1\\). With this +property, we can binary search the minimum initial speed \\(v\\). Then, our problem becomes: Given an initial speed \\(v\\), +determine whether we are able to get all the mice. + +
+ +We will solve the new problem using dynamic programming. Let \\(f(S, i)\\) (where \\(S\\) is a subset of all mice and +\\(i \in S\\)) be the minimum amount of time we need to get all the mice in set \\(S\\) and the last mouse we get is +\\(i\\). We also denote \\(f(S, i) = -1\\) if there is no way to get all the mice in \\(S\\) with \\(i\\) be the last one. +For the sake of our problem, we also denote \\(min\{\emptyset\} = -1\\). Let \\(x_0 = y_0 = 0\\), then our base cases will be +- If \\(T(0, i, v) > s_i\\), \\(f(\\{i\\}, i) = -1\\). +- Otherwise, \\(f(\\{i\\}, i) = T(0, i, v)\\). + +And for all other cases + \begin{equation} + f(S, i) = min \\{ f(S', j) + T(i, j, v) | S' = S \setminus \\{i\\}, j \in S', f(S', j) \neq -1, f(S', j) + T(i, j, v) \leq s_i\\} + \end{equation} + +
+ +Then, we can get all the mice with initial speed \\(v\\) if there exists \\(i\\) (\\(1 \leq i \leq n\\)) such that +\\(f(\\{1, 2, ..., n\\}, i) \neq -1\\). + +# E: Company Picnic +Let us number the employees from \\(1 \to n\\) and let \\(s_i\\) be the running speed of the \\(i_{th}\\) employee. Let us +create a rooted tree \\(G\\) where each node represents an employee and node \\(i\\) is a parent of node \\(j\\) if the +\\(j_{th}\\) employee is the direct supervisor of the \\(i_{th}\\) employee. The root of the tree is the node representing +the CEO. + +
+ +Suppose we have a value \\(v\\). If we know that there exists a formation which results in the average speed \\(v_a \leq v\\), +we know that the answer is at least \\(v\\). Otherwise, the answer cannot exceed \\(v\\). With this property, we can binary +search for the optimal average speed \\(v_{optimal}\\). Then, the remaining problem is to determine if we can form a set of +teams where the average speed is at least \\(v_{min}\\) for any given \\(v_{min}\\). + +
+ +We will solve this problem using dynamic programming. Suppose we have a team formation with pairs \\((i_1, j_1), (i_2, j_2), ..., (i_k, j_k)\\). +Then, the average running speed of these teams is + \begin{equation} + \frac{\sum_{t = 1}^k min\\{s_{i_t}, s_{j_t}\\}}{k} + \end{equation} +Let \\(T_{v_{min}}(i, j) = min\\{s_i, s_j\\} - v_{min}\\). Then we have + \begin{equation} + \frac{\sum_{t = 1}^k min\\{s_{i_t}, s_{j_t}\\}}{k} \geq v_{min} \iff \sum_{t = 1}^k min\\{s_{i_t}, s_{j_t}\\} \geq kv_{min} \iff \sum_{t = 1}^k (min\\{s_{i_t}, s_{j_t}\\} - v_{min}) = + \sum_{t = 1}^k T_{v_{min}}(i_t, j_t) \geq 0 + \end{equation} + +Let us call the sum \\(\sum_{t = 1}^k (min\\{s_{i_t}, s_{j_t}\\})\\) the \\(T\\)-sum of this formation. + +
+ +Let \\(f(u, p)\\) (\\(1 \leq u \leq n, p \in \\{0, 1\\}\\)) be the maximum number of teams can be formed using only employees +represented by nodes under subtree rooted at \\(u\\) and \\(p\\) denotes whether we can pair \\(u\\) with one of its children +(\\(p = 1\\) means you can). Similarly, let \\(g(u, p)\\) be the maximum \\(T\\)-sum of all the formation with \\(f(u, p)\\) teams. +Lastly, let \\(better(u)\\) be defined as: +- If \\(f(u, 0) > f(u, 1)\\) or \\(f(u, 0) = f(u, 1) \wedge g(u, 0) > g(u, 1)\\), \\(better(u) = 1\\). +- Otherwise, \\(better(u) = 0\\). + +Then, for each \\(u\\) we have: +- \\(f(u, 0) = \sum_{v \in children(u)} f(v, better(v))\\) +- \\(g(u, 0) = \sum_{v \in children(u)} g(v, better(v))\\) + +To calculate \\(f(u, 1)\\) and \\(g(u, 1)\\), we will try to pair \\(u\\) with each of its child and take the maximum: +- \\(f(u, 1) = f(u, 0) + max\\{f(v, 0) - f(v, better(v)) + 1 \vert v \in children(u)\\}\\) +- \\(g(u, 1) = g(u, 0) + max\\{g(v, 0) - g(v, better(v)) + T_{v_{min}}(u, v) \vert v \in children(u)\\}\\) + +
+ +Then, to determine if the minimum average speed is at least \\(v_{min}\\), we only need to check if \\(g(root, 0) \geq 0\\). + +# F: GlitchBot +Since the constraints are relatively small, for each instruction, we can replace that instruction with \\(\textit{Forward/Left/Right}\\) +and the check if the new set of instruction is correct. We can verify if a set of instructions is correct by simulating the robot. +We stop as soon as we can find a good instruction set by replacing some instruction. Since we have \\(n\\) instructions and for each +instruction, the simulation process takes O(\\(n\\)), the total complexity is O(\\(n^2\\)). + +# G: Greeting Card +We are given \\(n\\) points on an \\(xy\\)-plane. We are asked to count the number of pair of two points such that the Euclidean +distance between them is exactly 2018. + +
+ +Suppose we have 2 points \\((x_1, y_1)\\) and \\((x_2, y_2)\\). Then + \begin{equation} + \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2} = 2018 \iff (x_1 - x_2)^2 + (y_1 - y_2)^2 = 2018^2 + \end{equation} + +Since \\(x_1, x_2, y_1, y_2\\) are all integers, \\((x_1 - x_2)^2\\) and \\((y_1 - y_2)^2\\) are integers. The key +observation here is there are only 4 ordered pairs of integers \\((a, b)\\) such that \\(a^2 + b^2 = 2018^2\\). Those are +(0, 2018), (2018, 0), (1118, 1680), (1680, 1118). + +
+ +Then, for each point \\((x, y)\\) among the \\(n\\) given points and each pair \\((a, b)\\) mentioned above, we will count +the number of points \\((x', y')\\) that: + \begin{equation} + |x - x'| = a \wedge |y - y'| = b + \end{equation} +This can be done in several ways. One easy way to achieve this is that for each given point, we will store it inside a data +structure that allows fast query base on the coordinates (such as \\(\textit{std::set}\\) or \\(\textit{std::map}\\) in C++). +Since each pair of points would be counted twice this way, we need to divide our sum by 2 to get the desired answer. + +# H: Imperfect GPS +Let \\(T\\) be the recording period of the GPS. For each time \\(t\\) which is a multiple of \\(T\\) and does not exceed \\(t_n\\) +we will calculate the position of the runner. If \\(t = t_n\\), then the position recorded by the GPS at time \\(t\\) is \\((x_n, y_n)\\). +Otherwise, let \\(j\\) be the largest number between 1 and \\(n\\) such that the \\(t_j\\) is at most \\(t\\). Then, the position +recorded by GPS at time \\(t\\) \\((x', y')\\) is: + \begin{equation} + x' = \frac{t - t_{j}}{t_{j + 1} - t_{j}}(x_{j + 1} - x_{j}) + x_j, + y' = \frac{t - t_{j}}{t_{j + 1} - t_{j}}(y_{j + 1} - y_{j}) + y_j + \end{equation} +To get the index \\(j\\) for each time \\(t\\), we can either use two-pointers technique or binary search for \\(j\\). With the +recorded positions of the GPS, it should be easy to calculate the desired answer. + +# I: Odd Gnome +Suppose we have \\(n\\) gnomes in line with indexes \\(a_1, a_2, ..., a_n\\). Then, if there exists index \\(1 < i < n\\) such that +\\(a_i \neq a_{i - 1} + 1\\) and \\(a_i \neq a_{i + 1} - 1\\), then the \\(i_{th}\\) gnome is the king. Otherwise, if \\(a_1 \neq a_2 - 1\\) +then the \\(1_{st}\\) gnome is the king. Other than that, the last gnome is the king. + +# J: Progressive Scramble +Suppose we have a string \\(s\\) with length \\(L\\): +- To encode \\(s\\) into \\(s'\\): \\(s'_0 = s_0\\) and \\(s'_i = v^{-1}\bigg(\Big(v\big(s_i\big) + v\big(s'\_{i - 1}\big)\Big)\bigg) +\textit{ mod } 27\\) for all \\(1 \leq i \leq L\\) +- To decode \\(s\\) to get \\(s'\\): \\(s'_0 = s_0\\) and \\(s'_i = v^{-1}\Bigg(\bigg(\Big(v\big(s_i\big) - v\big(s'\_{i - 1}\big)\Big) +\textit{ mod } 27 + 27\bigg) \textit{ mod } 27\Bigg)\\) for all \\(1 \leq i \leq L\\) + +Where \\(v^{-1}\\) is the inverse function of \\(v\\). + +# K: Space Probe +Notice that the product \\(nk \leq 10^7\\), for each measurements time \\(m_i\\) and prohibited segment \\([b, e]\\), we know that +the starting time cannot be between \\([b - m_i, e - e_i]\\). Therefore, we can obtain \\(nk\\) segments of starting time that are +"prohibited". Let us sort the beginning and the ending of all such segments. For points with the same magnitude, we break the tie +by prioritizing the beginning points. We will then perform sweep line algorithm on the sorted points and keep track of the "opening" +segments at each point. Let \\(l, count\\) all initially equals to zero. Then, we iterate through the sorted points in order. For +a point \\(x\\): +- If \\(x\\) is a closing point: We decrease the value of \\(count\\). If \\(count = 0\\), we assign \\(l = x\\). +- If \\(x\\) is a beginning point: We increase the value of \\(count\\). If \\(count = 1\\), let \\(L = max(t_1, l), R = min(t_2, x)\\). +If \\(L > R\\), we can go to the next point. Otherwise, \\([L, R] = [t_1, t_2] \cup [l, x]\\). Then, we know for sure that it is safe to +start the process anytime in between \\((L, R)\\). Thus, we add \\(\frac{R - L}{t_2 - t_1}\\) to the result. + +After iterating over all points, we can do similarly to the second case with \\(x = t_2\\). Then, we will have our final result. + +# L: Suspension Bridges +We have + \begin{equation} + a + s = a \cdot \cosh\bigg(\frac{d}{2a}\bigg) \implies s = a \cdot \cosh\bigg(\frac{d}{2a}\bigg) - a + \end{equation} + +Noticing that the function \\(s(a)\\) is decreasing, we can binary search for the right value of \\(a\\). With such value, +we can easily calculate the required result. + +# M: Umbral Decoding +Suppose we have a safe point \\((x, y, b)\\) and a point \\((p, q)\\) that lies inside the umbra of the given safe point. Then + \begin{equation} + |x - p|^3 + |y - q|^3 \leq b \implies |x - p|^3 \leq b \implies |x - p| \leq \sqrt[3]{b} + \end{equation} +Similarly, we have \\(|y - q| \leq \sqrt[3]{b}\\). We also know that \\(b \leq 10^9 \implies \sqrt[3]{b} \leq 10^3\\). Thus, for +any safe point, the points that are inside its umbra also lies in a relatively small square around it. Thus, for each safe point, +we can iterate through all points lying in its umbra and deduct them from our result. To mark the duplicating points, we can +use data structures such as \\(\textit{std::set}\\) in C++. diff --git a/_posts/2017-10-21-Season-2-Contest-4.md b/_posts/2017-10-21-Season-2-Contest-4.md index 3b5b14b..e08a1cb 100644 --- a/_posts/2017-10-21-Season-2-Contest-4.md +++ b/_posts/2017-10-21-Season-2-Contest-4.md @@ -1,113 +1,113 @@ ---- -layout: post -category: solutions -time: 20:00 PM -description: Solutions for both Freshman and Open Divisions. ---- -# **[Petya and Strings](http://codeforces.com/problemset/problem/112/A)** - -You are asked to compare two strings, without distinguishing upper and lower cases. You may first convert all characters in both strings to upper case without affecting the result. Since the two strings are of same length, simply iterate through the index and report the result on the first occurrence of disagreement between the strings. Report zero if no difference is found. - -**Complexity:** O(\\(n\\)) - -**Sample Solution:** [petya.cpp] - - -# **[Yound Physicists](http://codeforces.com/problemset/problem/69/A)** - -The sum vector is zero iff the sum of each component is zero. So the object is idle iff \\(\Sigma{x_i}, \Sigma{y_i}, Sigma{z_i}\\) are all zero. - -**Complexity:** O(\\(n\\)) - -**Sample Solution:** [physicist.cpp] - -# **[Way too long words](http://codeforces.com/problemset/problem/71/A)** - -If the word has <= 10 letters, print the string itself. Otherwise, print the first character, and then the length of input string minus 2, and then the last character. - -**Complexity:** O(\\(\|S\|\\)) - -**Sample Solution:** [words.cpp] - -# **[Valera and X](http://codeforces.com/problemset/problem/404/A)** - -Simply check whether all symbols on the two diagonals are the same, and that -all symbols off the diagonals are the same, also symbols on and off diagonals -are different. - -**Complexity:** O(\\(n^2\\)) - -**Sample Solution:** [x.cpp] - -# **[Dubious Document](http://arc071.contest.atcoder.jp/tasks/arc071_a)** -For each character, we are trying to find the maximum number \\(c\\) -such that this character appears in every string at least \\(c\\) times. - -Iterate through each string and count the frequency of each character. -Take the minimum frequency of each character across all strings. - -At last, print the lexicographically smallest string composed of these -characters, where each character appears its minimum frequency number of times. - -**Complexity:** O(\\(\|S\|\\)) where \\(\|S\|\\) is the total string length. - -**Sample Solution:** [document.cpp] - -# **[Pairwise And Sum](https://www.codechef.com/problems/AND)** - -It is impractical to take the AND value of every pair and add them up, since N=10^5 and the complexity will be O(N^2). \\ -In many bitwise operation problems, the bits can be regarded as independent. In particular, if each number can be represented by three bits, then \\(a_2 a_1 a_0 AND b_2 b_1 b_0 = a_2 0 0 AND b_2 0 0 + 0 a_1 0 AND 0 b_1 0 + 0 0 a_0 AND 0 0 b_0\\). Therefore, we can decompose every number into power-of-2's, compute the pairwise sum for each digit, and add them up. Computing pairwise sum for a specified digit is trivial: simply count the numbers in which that binary digit is 1, and use C(cnt, 2) = cnt * (cnt - 1) / 2 (and don't forget to multiply by the corresponding power of 2). - -**Complexity:** O(\\(N\log(\max(A_i))\\)) - -**Sample Solution:** [andsum.cpp] - -# **[Missile Silos](http://codeforces.com/problemset/problem/144/D)** -First use Dijkstra's algorithm to calculate the shortest path from starting -city \\(s\\). - -If a city happen to be \\(l\\) distance away from \\(s\\), then we have a silo -in that city. - -For roads, it is more complicated. Consider the endpoints of a road be -\\(u, v\\), and the length of the road be \\(w\\). -If shortest path \\(dist\\)from \\(u\\) to \\(s\\) is smaller than -\\(l\\), but \\(dist + w > l\\), then we know it is possible to have a silo -on this road. However, we also need to make sure the silo cannot have a -shorter path which goes the direction of \\(v\\). Otherwise, this silo location -is invalid. Same reasoning for the other city \\(v\\). Also it is possible -a silo, when goes either direction on the road, has a shortest path of length -\\(l\\) on both directions. We need to avoid double counting here. - -**Complexity:** O(\\(\|E\| + \|V\|\log\|V\|\\)) - -**Sample Solution:** [missile.cpp] - -# **[Most Distant Points](https://www.codechef.com/problems/MOSTDIST)** -To solve this problem, we need to know the following observation. Suppose we are having two points \\((x_1, y_1)\\) -and \\((x_2, y_2)\\). Then, the Manhattan distance between these points can be rewritten as -\begin{equation} - |x_1 - x_2| + |y_1 - y_2| = max\\{x_1 - x_2, x_2 - x_1\\} + max\\{y_1 - y_2, y_2 - y_1\\} -\end{equation} - -With such observation, we can maintain 4 priority queues \\(h_{x + y}, h_{x - y}, h_{y - x}, h_{-x - y}\\). Then, for -each type of query, we can: -- \\(+\\) \\(x\\) \\(y\\): When we have a new point \\((x, y)\\), we will add \\(x + y, x - y, y - x, -x - y\\) to the 4 queues -\\(h_{x + y}, h_{x - y}, h_{y - x}, h_{-x - y}\\) respectively. -- \\(-\\) \\(N\\): To remove a point, we basically will not do anything. We only remove the \\(N_{th}\\) point when it is -on top of the queue (any queue). That is, we only remove it when necessary. -- \\(?\\) \\(x\\) \\(y\\): To get the maximum Manhattan distance from \\((x, y)\\) to the current points, we get the maximum values of: -\\(x + y + h_{-x - y}.top\\), \\(x - y + h_{y - x}.top\\), \\(y - x + h_{x - y}.top\\), \\(-x - y + h_{x + y}.top\\). - -**Complexity:** O(\\(Q\log{N}\\)) - -**Sample Solution:** [mostdist.cpp] - -[petya.cpp]: /assets/ipl_solutions/season2/contest4/petya.cpp -[physicist.cpp]: /assets/ipl_solutions/season2/contest4/physicist.cpp -[words.cpp]: /assets/ipl_solutions/season2/contest4/words.cpp -[x.cpp]: /assets/ipl_solutions/season2/contest4/x.cpp -[document.cpp]: /assets/ipl_solutions/season2/contest4/document.cpp -[missile.cpp]: /assets/ipl_solutions/season2/contest4/missile.cpp -[andsum.cpp]: /assets/ipl_solutions/season2/contest4/andsum.cpp -[mostdist.cpp]: /assets/ipl_solutions/season2/contest4/mostdist.cpp +--- +layout: post +category: solutions +time: 20:00 PM +description: Solutions for both Freshman and Open Divisions. +--- +# **[Petya and Strings](http://codeforces.com/problemset/problem/112/A)** + +You are asked to compare two strings, without distinguishing upper and lower cases. You may first convert all characters in both strings to upper case without affecting the result. Since the two strings are of same length, simply iterate through the index and report the result on the first occurrence of disagreement between the strings. Report zero if no difference is found. + +**Complexity:** O(\\(n\\)) + +**Sample Solution:** [petya.cpp] + + +# **[Yound Physicists](http://codeforces.com/problemset/problem/69/A)** + +The sum vector is zero iff the sum of each component is zero. So the object is idle iff \\(\Sigma{x_i}, \Sigma{y_i}, Sigma{z_i}\\) are all zero. + +**Complexity:** O(\\(n\\)) + +**Sample Solution:** [physicist.cpp] + +# **[Way too long words](http://codeforces.com/problemset/problem/71/A)** + +If the word has <= 10 letters, print the string itself. Otherwise, print the first character, and then the length of input string minus 2, and then the last character. + +**Complexity:** O(\\(\|S\|\\)) + +**Sample Solution:** [words.cpp] + +# **[Valera and X](http://codeforces.com/problemset/problem/404/A)** + +Simply check whether all symbols on the two diagonals are the same, and that +all symbols off the diagonals are the same, also symbols on and off diagonals +are different. + +**Complexity:** O(\\(n^2\\)) + +**Sample Solution:** [x.cpp] + +# **[Dubious Document](http://arc071.contest.atcoder.jp/tasks/arc071_a)** +For each character, we are trying to find the maximum number \\(c\\) +such that this character appears in every string at least \\(c\\) times. + +Iterate through each string and count the frequency of each character. +Take the minimum frequency of each character across all strings. + +At last, print the lexicographically smallest string composed of these +characters, where each character appears its minimum frequency number of times. + +**Complexity:** O(\\(\|S\|\\)) where \\(\|S\|\\) is the total string length. + +**Sample Solution:** [document.cpp] + +# **[Pairwise And Sum](https://www.codechef.com/problems/AND)** + +It is impractical to take the AND value of every pair and add them up, since N=10^5 and the complexity will be O(N^2). \\ +In many bitwise operation problems, the bits can be regarded as independent. In particular, if each number can be represented by three bits, then \\(a_2 a_1 a_0 AND b_2 b_1 b_0 = a_2 0 0 AND b_2 0 0 + 0 a_1 0 AND 0 b_1 0 + 0 0 a_0 AND 0 0 b_0\\). Therefore, we can decompose every number into power-of-2's, compute the pairwise sum for each digit, and add them up. Computing pairwise sum for a specified digit is trivial: simply count the numbers in which that binary digit is 1, and use C(cnt, 2) = cnt * (cnt - 1) / 2 (and don't forget to multiply by the corresponding power of 2). + +**Complexity:** O(\\(N\log(\max(A_i))\\)) + +**Sample Solution:** [andsum.cpp] + +# **[Missile Silos](http://codeforces.com/problemset/problem/144/D)** +First use Dijkstra's algorithm to calculate the shortest path from starting +city \\(s\\). + +If a city happen to be \\(l\\) distance away from \\(s\\), then we have a silo +in that city. + +For roads, it is more complicated. Consider the endpoints of a road be +\\(u, v\\), and the length of the road be \\(w\\). +If shortest path \\(dist\\)from \\(u\\) to \\(s\\) is smaller than +\\(l\\), but \\(dist + w > l\\), then we know it is possible to have a silo +on this road. However, we also need to make sure the silo cannot have a +shorter path which goes the direction of \\(v\\). Otherwise, this silo location +is invalid. Same reasoning for the other city \\(v\\). Also it is possible +a silo, when goes either direction on the road, has a shortest path of length +\\(l\\) on both directions. We need to avoid double counting here. + +**Complexity:** O(\\(\|E\| + \|V\|\log\|V\|\\)) + +**Sample Solution:** [missile.cpp] + +# **[Most Distant Points](https://www.codechef.com/problems/MOSTDIST)** +To solve this problem, we need to know the following observation. Suppose we are having two points \\((x_1, y_1)\\) +and \\((x_2, y_2)\\). Then, the Manhattan distance between these points can be rewritten as +\begin{equation} + |x_1 - x_2| + |y_1 - y_2| = max\\{x_1 - x_2, x_2 - x_1\\} + max\\{y_1 - y_2, y_2 - y_1\\} +\end{equation} + +With such observation, we can maintain 4 priority queues \\(h_{x + y}, h_{x - y}, h_{y - x}, h_{-x - y}\\). Then, for +each type of query, we can: +- \\(+\\) \\(x\\) \\(y\\): When we have a new point \\((x, y)\\), we will add \\(x + y, x - y, y - x, -x - y\\) to the 4 queues +\\(h_{x + y}, h_{x - y}, h_{y - x}, h_{-x - y}\\) respectively. +- \\(-\\) \\(N\\): To remove a point, we basically will not do anything. We only remove the \\(N_{th}\\) point when it is +on top of the queue (any queue). That is, we only remove it when necessary. +- \\(?\\) \\(x\\) \\(y\\): To get the maximum Manhattan distance from \\((x, y)\\) to the current points, we get the maximum values of: +\\(x + y + h_{-x - y}.top\\), \\(x - y + h_{y - x}.top\\), \\(y - x + h_{x - y}.top\\), \\(-x - y + h_{x + y}.top\\). + +**Complexity:** O(\\(Q\log{N}\\)) + +**Sample Solution:** [mostdist.cpp] + +[petya.cpp]: /assets/ipl_solutions/season2/contest4/petya.cpp +[physicist.cpp]: /assets/ipl_solutions/season2/contest4/physicist.cpp +[words.cpp]: /assets/ipl_solutions/season2/contest4/words.cpp +[x.cpp]: /assets/ipl_solutions/season2/contest4/x.cpp +[document.cpp]: /assets/ipl_solutions/season2/contest4/document.cpp +[missile.cpp]: /assets/ipl_solutions/season2/contest4/missile.cpp +[andsum.cpp]: /assets/ipl_solutions/season2/contest4/andsum.cpp +[mostdist.cpp]: /assets/ipl_solutions/season2/contest4/mostdist.cpp diff --git a/_posts/2017-11-03-Season2-Contest-5.md b/_posts/2017-11-03-Season2-Contest-5.md index 3bbe0d0..b7a7a37 100644 --- a/_posts/2017-11-03-Season2-Contest-5.md +++ b/_posts/2017-11-03-Season2-Contest-5.md @@ -1,165 +1,165 @@ ---- -layout: post -category: solutions -time: 20:00 PM -description: Solutions for both Freshman and Open Divisions. ---- -# **[Chips](http://codeforces.com/problemset/problem/92/A)** -Simple simulation problem. Keep track of the number of chips you have (initially \\(m\\)). Then set a loop variable \\(i\\) to \\\(1\\), which stands for the number of the current walruse. Then repeat the following steps: -* Check if \\(i\\) is less than the current number of chips - - Yes: give \\(i\\) chips to the \\(i^{th}\\) walruse and deduct it from the current total - - No: output the current number of chips and terminate the program -* Increment \\(i\\) by \\(1\\) - - If \\(i = n\\), set \\(i\\) back to \\(1\\) - -**Complexity:** O(\\(\frac{m}{n}\\)) - -**Sample Solution:** [chips.cpp] - -# **[Cookies](http://codeforces.com/problemset/problem/129/A)** -First calculate the total number of cookies \\(s\\). In order for the number of cookies remaining to be -even, the number of cookies in the bag Olga steals must have the same parity with \\(s\\). -Simply count how many \\(a_i\\) has the same parity with \\(s\\) and we're done. - -**Complexity:** O(\\(n\\)) - -**Sample Solution:** [cookies.cpp] - - - -# **[Life Without Zeros](http://codeforces.com/problemset/problem/75/A)** -A straight forward way so solve this problem, is to implement a function remove_zeros that -takes an integer and returns the corresponding integer with all zeros removed. -This can be done by either -* Converting the integer to string, remove the zeros, and then convert it back -* Modular arithmetics - -Then you just need to check if remove_zeros(a + b) is equal to remove_zeros(a) + remove_zeros(b). - -**Complexity:** O(\\(\log (\max (a, b))\\)) - -**Sample Solution:** [zeros.cpp] - - -# **[Puzzles](http://codeforces.com/problemset/problem/337/A)** -First sort the array \\(f_i\\) in ascending order. Then for each \\(i\\), calculate \\(f_{i + n - 1} - f_{i}\\) -and the minimum one is the answer. Be careful with boundry cases. - -**Complexity:** O(\\(m \log m\\)) - -**Sample Solution:** [puzzles.cpp] - - - -# **[Mike and Strings](http://codeforces.com/problemset/problem/798/B)** -Notice that if a solution exists, then it is possible to obtain it by transforming the first string a certain number of times. -Therefore, we enumerate over the strings obtained by transorming the first string, and see if it is possible to -transform all the rest strings into the same form. If yes, do it in the way with lowest cost. - -**Complexity:** O(\\(m^3 n\\)) - -**Sample Solution:** [strings.cpp] - -**A More Compact Solution:** [strings.py] - - -# **[Robot Movings](https://www.codechef.com/problems/MOVES)** -This problem is in fact a combinatorics problem. -We try to find the number of ways we can make down turns, and also the -number of ways to we can make right turns. - -Consider \\(N, K\\). - -If \\(K\\) is odd, then we can either - -* Make more down turns than right turns. To be specific, we can -make \\((K + 1) / 2\\) down turns and \\((K - 1) / 2\\) right turns. -However since the last down turn will always happen at the last column, -we can only choose the positions of \\((K - 1) / 2\\) down turns - -* Make more right turns than down turns. This case is actually symmetric to the -previous one. - -If \\(K\\) is even, then we will always make the same number of -right turns and down turns. However be careful that the last turn is always -going to happen at the last column or last row, so we cannot choose the position -for that turn. - -Then the problem becomes to find the values of -\\(\binom{n}{k}\\) where \\(n, k \le 5000\\). Simply construct -Pascal's triangle level by level will have time complexity of O(\\(n^2\\)), -which is acceptable for this problem given \\(n\\) is at most 5000. - -In fact, we can also calculate \\(\binom{n}{k}\\) directly by using -the formula \\(\binom{n}{k} = \frac{n!}{k!(n - k)!}\\). Since we are working -under mod \\(p = 1000000007\\), we cannot do the calculation naively, because -\\(n! \mod p\\) might not be divisible by \\(k!(n - k)! \mod p\\). Instead, -we find the inverses of \\(k!\\) and \\((n - k)!\\) under mod \\(p\\). - -Since \\(p\\) is prime, by Fermat's Little Theorem, we have -\\(a^{p - 1} \equiv 1 \mod p\\) as long as \\(p\\) does not divide \\(a\\). -So we have \\((a)(a^{p - 2}) \equiv 1 \mod p\\). Then we have -\\(a^{p - 2}\\) to be the inverse of \\(a\\) under mod \\(p\\). - -Because we are working under mod \\(p\\) for all factorials, the value of -factorial will always be smaller than \\(p\\), -and so \\(p\\) does not divide the factorial. -Hence Fermat's Little Theorem is applicable and we can use the -aforementioned way to find the inverses of each factorial, -and finally apply the formula. - -Note the sample solution uses this faster linear solution. - -**Complexity:** O(\\(N + T\\)) where \\(T\\) is the number of test cases. - -**Sample Solution:** [robot.cpp] - - -# **[The Guessing Game](https://www.codechef.com/problems/A3)** -The key idea is to transform this problem into an interval problem. - -Take the first sample as an example. -Consider the response "> 100 No". This response can be seen as interval -[1, 100]. Similarly, the response "< 100 No" can be transformed into interval -[100, 1000000000]. - -After transforming all responses into intervals, the task -becomes to find the maximum number of intervals covering a single point. -Subtracting this number from the total number of hints -gives the minimum number of lies. - -In implementation, we only need to store the end points of each interval and -sort them. -At each endpoint, if it is the start of an interval, we increase the -counter by 1, otherwise, decrease by 1. This way, we only need \\(k\log k\\) -time for sorting, and linear time for processing each end point. - -**Complexity:** O(\\(k\log k\\)) for each test case. - -**Sample Solution:** [guessing.cpp] - -# **[Polygon](https://www.codechef.com/problems/CF224)** -Straightforward application of convex hull. The most common algorithms used -to calculate convex hull are [Graham's Algorithm] and its variants. - -The sample solution uses one of the variants [Monotone Chain]. -This variant will construct the upper hull and lower hull separately. But the -core idea is identical to the standard Graham Scan. - -**Compexity:** O(\\(n\log n\\)) - -**Sample Solution:** [polygon.cpp] - - -[chips.cpp]: /assets/ipl_solutions/season2/contest5/chips.cpp -[cookies.cpp]: /assets/ipl_solutions/season2/contest5/cookies.cpp -[zeros.cpp]: /assets/ipl_solutions/season2/contest5/zeros.cpp -[strings.cpp]: /assets/ipl_solutions/season2/contest5/strings.cpp -[strings.py]: /assets/ipl_solutions/season2/contest5/strings.py -[puzzles.cpp]: /assets/ipl_solutions/season2/contest5/puzzles.cpp -[robot.cpp]: /assets/ipl_solutions/season2/contest5/robot.cpp -[guessing.cpp]: /assets/ipl_solutions/season2/contest5/guessing.cpp -[polygon.cpp]: /assets/ipl_solutions/season2/contest5/polygon.cpp -[Graham's Algorithm]: https://en.wikipedia.org/wiki/Graham_scan -[Monotone Chain]: https://en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Convex_hull/Monotone_chain - +--- +layout: post +category: solutions +time: 20:00 PM +description: Solutions for both Freshman and Open Divisions. +--- +# **[Chips](http://codeforces.com/problemset/problem/92/A)** +Simple simulation problem. Keep track of the number of chips you have (initially \\(m\\)). Then set a loop variable \\(i\\) to \\\(1\\), which stands for the number of the current walruse. Then repeat the following steps: +* Check if \\(i\\) is less than the current number of chips + - Yes: give \\(i\\) chips to the \\(i^{th}\\) walruse and deduct it from the current total + - No: output the current number of chips and terminate the program +* Increment \\(i\\) by \\(1\\) + - If \\(i = n\\), set \\(i\\) back to \\(1\\) + +**Complexity:** O(\\(\frac{m}{n}\\)) + +**Sample Solution:** [chips.cpp] + +# **[Cookies](http://codeforces.com/problemset/problem/129/A)** +First calculate the total number of cookies \\(s\\). In order for the number of cookies remaining to be +even, the number of cookies in the bag Olga steals must have the same parity with \\(s\\). +Simply count how many \\(a_i\\) has the same parity with \\(s\\) and we're done. + +**Complexity:** O(\\(n\\)) + +**Sample Solution:** [cookies.cpp] + + + +# **[Life Without Zeros](http://codeforces.com/problemset/problem/75/A)** +A straight forward way so solve this problem, is to implement a function remove_zeros that +takes an integer and returns the corresponding integer with all zeros removed. +This can be done by either +* Converting the integer to string, remove the zeros, and then convert it back +* Modular arithmetics + +Then you just need to check if remove_zeros(a + b) is equal to remove_zeros(a) + remove_zeros(b). + +**Complexity:** O(\\(\log (\max (a, b))\\)) + +**Sample Solution:** [zeros.cpp] + + +# **[Puzzles](http://codeforces.com/problemset/problem/337/A)** +First sort the array \\(f_i\\) in ascending order. Then for each \\(i\\), calculate \\(f_{i + n - 1} - f_{i}\\) +and the minimum one is the answer. Be careful with boundry cases. + +**Complexity:** O(\\(m \log m\\)) + +**Sample Solution:** [puzzles.cpp] + + + +# **[Mike and Strings](http://codeforces.com/problemset/problem/798/B)** +Notice that if a solution exists, then it is possible to obtain it by transforming the first string a certain number of times. +Therefore, we enumerate over the strings obtained by transorming the first string, and see if it is possible to +transform all the rest strings into the same form. If yes, do it in the way with lowest cost. + +**Complexity:** O(\\(m^3 n\\)) + +**Sample Solution:** [strings.cpp] + +**A More Compact Solution:** [strings.py] + + +# **[Robot Movings](https://www.codechef.com/problems/MOVES)** +This problem is in fact a combinatorics problem. +We try to find the number of ways we can make down turns, and also the +number of ways to we can make right turns. + +Consider \\(N, K\\). + +If \\(K\\) is odd, then we can either + +* Make more down turns than right turns. To be specific, we can +make \\((K + 1) / 2\\) down turns and \\((K - 1) / 2\\) right turns. +However since the last down turn will always happen at the last column, +we can only choose the positions of \\((K - 1) / 2\\) down turns + +* Make more right turns than down turns. This case is actually symmetric to the +previous one. + +If \\(K\\) is even, then we will always make the same number of +right turns and down turns. However be careful that the last turn is always +going to happen at the last column or last row, so we cannot choose the position +for that turn. + +Then the problem becomes to find the values of +\\(\binom{n}{k}\\) where \\(n, k \le 5000\\). Simply construct +Pascal's triangle level by level will have time complexity of O(\\(n^2\\)), +which is acceptable for this problem given \\(n\\) is at most 5000. + +In fact, we can also calculate \\(\binom{n}{k}\\) directly by using +the formula \\(\binom{n}{k} = \frac{n!}{k!(n - k)!}\\). Since we are working +under mod \\(p = 1000000007\\), we cannot do the calculation naively, because +\\(n! \mod p\\) might not be divisible by \\(k!(n - k)! \mod p\\). Instead, +we find the inverses of \\(k!\\) and \\((n - k)!\\) under mod \\(p\\). + +Since \\(p\\) is prime, by Fermat's Little Theorem, we have +\\(a^{p - 1} \equiv 1 \mod p\\) as long as \\(p\\) does not divide \\(a\\). +So we have \\((a)(a^{p - 2}) \equiv 1 \mod p\\). Then we have +\\(a^{p - 2}\\) to be the inverse of \\(a\\) under mod \\(p\\). + +Because we are working under mod \\(p\\) for all factorials, the value of +factorial will always be smaller than \\(p\\), +and so \\(p\\) does not divide the factorial. +Hence Fermat's Little Theorem is applicable and we can use the +aforementioned way to find the inverses of each factorial, +and finally apply the formula. + +Note the sample solution uses this faster linear solution. + +**Complexity:** O(\\(N + T\\)) where \\(T\\) is the number of test cases. + +**Sample Solution:** [robot.cpp] + + +# **[The Guessing Game](https://www.codechef.com/problems/A3)** +The key idea is to transform this problem into an interval problem. + +Take the first sample as an example. +Consider the response "> 100 No". This response can be seen as interval +[1, 100]. Similarly, the response "< 100 No" can be transformed into interval +[100, 1000000000]. + +After transforming all responses into intervals, the task +becomes to find the maximum number of intervals covering a single point. +Subtracting this number from the total number of hints +gives the minimum number of lies. + +In implementation, we only need to store the end points of each interval and +sort them. +At each endpoint, if it is the start of an interval, we increase the +counter by 1, otherwise, decrease by 1. This way, we only need \\(k\log k\\) +time for sorting, and linear time for processing each end point. + +**Complexity:** O(\\(k\log k\\)) for each test case. + +**Sample Solution:** [guessing.cpp] + +# **[Polygon](https://www.codechef.com/problems/CF224)** +Straightforward application of convex hull. The most common algorithms used +to calculate convex hull are [Graham's Algorithm] and its variants. + +The sample solution uses one of the variants [Monotone Chain]. +This variant will construct the upper hull and lower hull separately. But the +core idea is identical to the standard Graham Scan. + +**Compexity:** O(\\(n\log n\\)) + +**Sample Solution:** [polygon.cpp] + + +[chips.cpp]: /assets/ipl_solutions/season2/contest5/chips.cpp +[cookies.cpp]: /assets/ipl_solutions/season2/contest5/cookies.cpp +[zeros.cpp]: /assets/ipl_solutions/season2/contest5/zeros.cpp +[strings.cpp]: /assets/ipl_solutions/season2/contest5/strings.cpp +[strings.py]: /assets/ipl_solutions/season2/contest5/strings.py +[puzzles.cpp]: /assets/ipl_solutions/season2/contest5/puzzles.cpp +[robot.cpp]: /assets/ipl_solutions/season2/contest5/robot.cpp +[guessing.cpp]: /assets/ipl_solutions/season2/contest5/guessing.cpp +[polygon.cpp]: /assets/ipl_solutions/season2/contest5/polygon.cpp +[Graham's Algorithm]: https://en.wikipedia.org/wiki/Graham_scan +[Monotone Chain]: https://en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Convex_hull/Monotone_chain + diff --git a/_posts/2017-11-15-Season2-Contest-8.md b/_posts/2017-11-15-Season2-Contest-8.md index c629f6c..71ec8af 100644 --- a/_posts/2017-11-15-Season2-Contest-8.md +++ b/_posts/2017-11-15-Season2-Contest-8.md @@ -1,50 +1,50 @@ ---- -layout: post -category: solutions -time: 20:00 PM -description: Solutions for both Freshman and Open Divisions. ---- - -# **[College and Gift](https://www.codechef.com/problems/CAG)** -Let as create a directed graph \\(G = (V, E)\\) as followed: -- \\(V = \\{ 1, 2, ..., N\\}\\) -- There is an edge from \\(u\\) to \\(v\\) in \\(E\\) if student \\(u\\) only accepts the gift if student \\(v\\) -also receives a gift. - -Since \\(N\\) is small, one way to solve this problem is for each student \\(u\\), we can find the number of gifts \\(p_u\\) -we have to distribute if \\(u\\) end up receiving a gift. We can see that, \\(p_u\\) is the number of node reachable from \\(u\\). -This can be found using BFS (or DFS) for each \\(u \in V\\). Then, the answer is \\(min \\{p_1, p_2, ..., p_n\\}\\). This solution -has the complexity O\\((N^2)\\). This is enough to pass this problem since \\(N \leq 1000\\). - -However, there is another solution which gives us even better complexity. We can first find the strongly connected components of \\(G\\). -(If you are not familiar with the term, you can read more [here](http://www.geeksforgeeks.org/tarjan-algorithm-find-strongly-connected-components/)) -Let us denote them \\(C_1, C_2, ..., C_m\\). Let us create a new graph \\(G' = (V', E')\\) where -- \\(V' = \\{C_1, C_2, ..., C_m\\}\\). That is, each node in \\(G'\\) represents a connected component of \\(G\\). -- There is an edge from \\(C_u\\) to \\(C_v\\) if there exists \\(u, v\\) in \\(C_u, C_v\\), respectively, and there is an edge \\(uv \in E\\). - -Notice that, if we give any student \\(u\\) a gift, then all students in the same connected component with \\(u\\) has to receive a gift. Similarly, -if there is an edge from \\(C_u\\) to \\(C_v\\) in \\(E'\\), if we give any student in \\(C_u\\) a gift, then all students in both \\(C_u\\) and \\(C_v\\) -needs to receive a gift. Moreover, since \\(C_1, C_2, ..., C_m\\) are strongly connected components, \\(G'\\) is a directed acyclic graph (which means \\(G'\\) -does not have any cycle). Thus, for each weakly connected component of \\(G'\\), there exists a node \\(C_t\\) that does not have any outgoing edge. Let \\(C_r\\) -be the one among such components with smallest size. Then, the size of \\(C_r\\) is our answer. - -**Complexity:** O(\\(N + M\\)) - -**Sample Solution:** [light.cpp] - -# **[Lights](https://www.codechef.com/problems/LIGHT)** - -We can observe that, given height \\(H\\), if we are not able to drive the aircraft from \\(L\\) to \\(R\\), the it is impossible -to do so for any given height \\(H' > H\\). Simlarly, if we manage to drive the aircraft from \\(L\\) to \\(R\\) at height \\(H\\), -then, we can always do so for any given height \\(H' < H\\). Thus, we can use binary search to find the optimal height. - -Our problem now is, given a fixed height \\(H\\), check if we are able to drive the drone fron \\(L\\) to \\(R\\). For each light, -we can easily calculate the segment \\((X_L, X_R\\)), that is of height \\(H\\) from the ground, that the light covers. Then, we only need -to check if all \\(N\\) segments cover every points in \\([L, R]\\). - -**Complexity:** O(\\(N\log{(Y_{max})}\\)) - -**Sample Solution:** [light.cpp] - -[gift.cpp]: /assets/ipl_solutions/season2/contest8/gift.cpp -[light.cpp]: /assets/ipl_solutions/season2/contest8/light.cpp +--- +layout: post +category: solutions +time: 20:00 PM +description: Solutions for both Freshman and Open Divisions. +--- + +# **[College and Gift](https://www.codechef.com/problems/CAG)** +Let as create a directed graph \\(G = (V, E)\\) as followed: +- \\(V = \\{ 1, 2, ..., N\\}\\) +- There is an edge from \\(u\\) to \\(v\\) in \\(E\\) if student \\(u\\) only accepts the gift if student \\(v\\) +also receives a gift. + +Since \\(N\\) is small, one way to solve this problem is for each student \\(u\\), we can find the number of gifts \\(p_u\\) +we have to distribute if \\(u\\) end up receiving a gift. We can see that, \\(p_u\\) is the number of node reachable from \\(u\\). +This can be found using BFS (or DFS) for each \\(u \in V\\). Then, the answer is \\(min \\{p_1, p_2, ..., p_n\\}\\). This solution +has the complexity O\\((N^2)\\). This is enough to pass this problem since \\(N \leq 1000\\). + +However, there is another solution which gives us even better complexity. We can first find the strongly connected components of \\(G\\). +(If you are not familiar with the term, you can read more [here](http://www.geeksforgeeks.org/tarjan-algorithm-find-strongly-connected-components/)) +Let us denote them \\(C_1, C_2, ..., C_m\\). Let us create a new graph \\(G' = (V', E')\\) where +- \\(V' = \\{C_1, C_2, ..., C_m\\}\\). That is, each node in \\(G'\\) represents a connected component of \\(G\\). +- There is an edge from \\(C_u\\) to \\(C_v\\) if there exists \\(u, v\\) in \\(C_u, C_v\\), respectively, and there is an edge \\(uv \in E\\). + +Notice that, if we give any student \\(u\\) a gift, then all students in the same connected component with \\(u\\) has to receive a gift. Similarly, +if there is an edge from \\(C_u\\) to \\(C_v\\) in \\(E'\\), if we give any student in \\(C_u\\) a gift, then all students in both \\(C_u\\) and \\(C_v\\) +needs to receive a gift. Moreover, since \\(C_1, C_2, ..., C_m\\) are strongly connected components, \\(G'\\) is a directed acyclic graph (which means \\(G'\\) +does not have any cycle). Thus, for each weakly connected component of \\(G'\\), there exists a node \\(C_t\\) that does not have any outgoing edge. Let \\(C_r\\) +be the one among such components with smallest size. Then, the size of \\(C_r\\) is our answer. + +**Complexity:** O(\\(N + M\\)) + +**Sample Solution:** [light.cpp] + +# **[Lights](https://www.codechef.com/problems/LIGHT)** + +We can observe that, given height \\(H\\), if we are not able to drive the aircraft from \\(L\\) to \\(R\\), the it is impossible +to do so for any given height \\(H' > H\\). Simlarly, if we manage to drive the aircraft from \\(L\\) to \\(R\\) at height \\(H\\), +then, we can always do so for any given height \\(H' < H\\). Thus, we can use binary search to find the optimal height. + +Our problem now is, given a fixed height \\(H\\), check if we are able to drive the drone fron \\(L\\) to \\(R\\). For each light, +we can easily calculate the segment \\((X_L, X_R\\)), that is of height \\(H\\) from the ground, that the light covers. Then, we only need +to check if all \\(N\\) segments cover every points in \\([L, R]\\). + +**Complexity:** O(\\(N\log{(Y_{max})}\\)) + +**Sample Solution:** [light.cpp] + +[gift.cpp]: /assets/ipl_solutions/season2/contest8/gift.cpp +[light.cpp]: /assets/ipl_solutions/season2/contest8/light.cpp diff --git a/_posts/2018-02-05-Season3-Practice.md b/_posts/2018-02-05-Season3-Practice.md index 169eb95..eb6b3b3 100644 --- a/_posts/2018-02-05-Season3-Practice.md +++ b/_posts/2018-02-05-Season3-Practice.md @@ -1,76 +1,76 @@ ---- -layout: post -category: solutions -time: 20:00 PM -description: Solutions for the practice contest ---- - -# **[A + B Problem](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1000)** - -**Sample Solution:** [ab.cpp] - -# **[Speed Limit](https://open.kattis.com/problems/speedlimit)** - -Note that the input time is cumulative. - -**Sample Solution:** [speed.cpp] - -# **[Puzzles](http://codeforces.com/problemset/problem/337/A)** -Let us first sort array \\(f\\) in increasing order. That is -\begin{equation} - f_1 \leq f_2 \leq \cdots \leq f_m -\end{equation} - -Then, obviously, the optimal way is to choose some \\(n\\) consecutive puzzles as our set. That is, -picking some \\(f_i, f_{i + 1}, f_{i + 2}, \cdots, f_{i + n - 1}\\) as our result. With this observation, -we can loop through all consecutive subarray of size \\(n\\) to get the answer. - -**Complexity:** O(\\(N\log N\\)) - -**Sample Solution:** [puzzle.cpp] - -# **[Team](http://codeforces.com/contest/401/problem/C)** -Since there should be no two consecutive zeroes, the number of ones should be at least -the number of zeros minus one (so that we can insert at least one "1" between two "0"). -Thus -\begin{equation} - m \geq n - 1 -\end{equation} - -Similarly, we have -\begin{equation} - 2(n + 1) \geq m -\end{equation} - -The way we construct the answer will be left for readers to practice. You can refer to -the code for hints. - -**Complexity:** O(\\(N\\)) - -**Sample Solution:** [team.cpp] - -# **[Queries on a Binary Tree](https://www.codechef.com/problems/BINTREEQ)** -Let \\((w, t)\\) be a pair which has the same path configuration as -\\((u, v)\\). Let \\(p = LCA(w, t)\\) be the lowest common ancestor of -\\((w, t)\\). The insight here is that we only need to find the largest \\(p\\) -possible under given constraints. - -Assume \\(v > u\\), then we can simply start from \\(n\\) and follow the same -path as \\(v\\) on its way back to \\(LCA(u, v)\\). Note such path from -\\(n\\) is not always possible, and we need to make minor adjustments during -the trace. - -let \\(n'\\) be the current node tracing from \\(n\\), -\\(v'\\) be the current node tracing from \\(v\\). If -\\(n'\\) cannot follow \\(v'\\) in the next step, then \\(n' - 1\\) must able -to follow (Hint: parity determines whether \\(n'\\) is able to follow or not). - -**Complexity:** O(\\(Q\log n\\)) - -**Sample Solution:** [btree.cpp] - -[ab.cpp]: /assets/ipl_solutions/season3/practice/ab.cpp -[speed.cpp]: /assets/ipl_solutions/season3/practice/speed.cpp -[btree.cpp]: /assets/ipl_solutions/season3/practice/btree.cpp -[puzzle.cpp]: /assets/ipl_solutions/season3/practice/puzzle.cpp -[team.cpp]: /assets/ipl_solutions/season3/practice/team.cpp +--- +layout: post +category: solutions +time: 20:00 PM +description: Solutions for the practice contest +--- + +# **[A + B Problem](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1000)** + +**Sample Solution:** [ab.cpp] + +# **[Speed Limit](https://open.kattis.com/problems/speedlimit)** + +Note that the input time is cumulative. + +**Sample Solution:** [speed.cpp] + +# **[Puzzles](http://codeforces.com/problemset/problem/337/A)** +Let us first sort array \\(f\\) in increasing order. That is +\begin{equation} + f_1 \leq f_2 \leq \cdots \leq f_m +\end{equation} + +Then, obviously, the optimal way is to choose some \\(n\\) consecutive puzzles as our set. That is, +picking some \\(f_i, f_{i + 1}, f_{i + 2}, \cdots, f_{i + n - 1}\\) as our result. With this observation, +we can loop through all consecutive subarray of size \\(n\\) to get the answer. + +**Complexity:** O(\\(N\log N\\)) + +**Sample Solution:** [puzzle.cpp] + +# **[Team](http://codeforces.com/contest/401/problem/C)** +Since there should be no two consecutive zeroes, the number of ones should be at least +the number of zeros minus one (so that we can insert at least one "1" between two "0"). +Thus +\begin{equation} + m \geq n - 1 +\end{equation} + +Similarly, we have +\begin{equation} + 2(n + 1) \geq m +\end{equation} + +The way we construct the answer will be left for readers to practice. You can refer to +the code for hints. + +**Complexity:** O(\\(N\\)) + +**Sample Solution:** [team.cpp] + +# **[Queries on a Binary Tree](https://www.codechef.com/problems/BINTREEQ)** +Let \\((w, t)\\) be a pair which has the same path configuration as +\\((u, v)\\). Let \\(p = LCA(w, t)\\) be the lowest common ancestor of +\\((w, t)\\). The insight here is that we only need to find the largest \\(p\\) +possible under given constraints. + +Assume \\(v > u\\), then we can simply start from \\(n\\) and follow the same +path as \\(v\\) on its way back to \\(LCA(u, v)\\). Note such path from +\\(n\\) is not always possible, and we need to make minor adjustments during +the trace. + +let \\(n'\\) be the current node tracing from \\(n\\), +\\(v'\\) be the current node tracing from \\(v\\). If +\\(n'\\) cannot follow \\(v'\\) in the next step, then \\(n' - 1\\) must able +to follow (Hint: parity determines whether \\(n'\\) is able to follow or not). + +**Complexity:** O(\\(Q\log n\\)) + +**Sample Solution:** [btree.cpp] + +[ab.cpp]: /assets/ipl_solutions/season3/practice/ab.cpp +[speed.cpp]: /assets/ipl_solutions/season3/practice/speed.cpp +[btree.cpp]: /assets/ipl_solutions/season3/practice/btree.cpp +[puzzle.cpp]: /assets/ipl_solutions/season3/practice/puzzle.cpp +[team.cpp]: /assets/ipl_solutions/season3/practice/team.cpp diff --git a/_posts/2018-02-17-Season3-Contest1.md b/_posts/2018-02-17-Season3-Contest1.md index 9fecc0f..b68f428 100644 --- a/_posts/2018-02-17-Season3-Contest1.md +++ b/_posts/2018-02-17-Season3-Contest1.md @@ -1,52 +1,52 @@ ---- -layout: post -category: solutions -time: 20:00 PM -description: Solutions for both Freshman and Open Divisions. ---- -# **[A - Relational Operator](https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2113)** - -Check if the two numbers satisfy either of the three relations, and print the corresponding operator as string. - -**Sample Solution:** [uva11172.cpp] - -# **[B1 - Division of Nlogonia](https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2493)** - -Be sure to correctly cover all cases. - -**Sample Solution:** [uva11498.cpp] - -# **[B2 - Diversity](http://codeforces.com/problemset/problem/844/A)** - -Count the number of different chars in the original string. If the count already exceeds k, then no change is need. Otherwise, we can change (k - count) chars if k does not exceed the length of the string. Otherwise it's impossible. - -**Sample Solution:** [cf844a.cpp] - -# **[C - GukiZ and Contest](http://codeforces.com/problemset/problem/551/A)** - -The problem reduces to finding the rank of each number in an array. Given the small input range, one of the easiest way is to use counting sort. You may also keep record of the original location of each number, sort them, and then assign ranks. - -**Sample Solution:** [cf551a.cpp] - -# **[D - Driving Test](http://codeforces.com/problemset/problem/845/D)** - -Let's notice that you should never say that you didn't notice signs "no speed limit" and "overtake is allowed". Also if you drive with speed sp, you don't want to remove signs "speed limit" with number greater or equal to sp. - -Thus, greedy solution will work. Process all the events in chronological order. We should maintain stack of signs "speed limit" and amount of signs "no overtake allowed". - -If we meet sign "speed limit", we push its limit to stack, sign "no overtake allowed" — increase cnt, "no speed limit" — clear stack, "overtake is allowed" — assign cnt to zero. After every event we should check if our speed is fine. While value of sign on the top of the stack is less than current speed, pop it and increase answer. If we overtake someone, we add cnt to answer and assign cnt to zero. - -**Sample Solution:** [cf845d.cpp] - -# **[E - Pashmak and Buses](http://codeforces.com/problemset/problem/459/C)** - -The bus numbers over d days for a specific student form a sequence of base k and length d. Your construction would suffice if all sequences are distinct. This is possible iff n<=k^d. Pick the first n numbers of base k and length d to form the construction. - -**Sample Solution:** [cf459c.cpp] - -[uva11172.cpp]: /assets/ipl_solutions/season3/contest1/uva11172.cpp -[uva11498.cpp]: /assets/ipl_solutions/season3/contest1/uva11498.cpp -[cf844a.cpp]: /assets/ipl_solutions/season3/contest1/cf844a.cpp -[cf551a.cpp]: /assets/ipl_solutions/season3/contest1/cf551a.cpp -[cf845d.cpp]: /assets/ipl_solutions/season3/contest1/cf845d.cpp -[cf459c.cpp]: /assets/ipl_solutions/season3/contest1/cf459c.cpp +--- +layout: post +category: solutions +time: 20:00 PM +description: Solutions for both Freshman and Open Divisions. +--- +# **[A - Relational Operator](https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2113)** + +Check if the two numbers satisfy either of the three relations, and print the corresponding operator as string. + +**Sample Solution:** [uva11172.cpp] + +# **[B1 - Division of Nlogonia](https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2493)** + +Be sure to correctly cover all cases. + +**Sample Solution:** [uva11498.cpp] + +# **[B2 - Diversity](http://codeforces.com/problemset/problem/844/A)** + +Count the number of different chars in the original string. If the count already exceeds k, then no change is need. Otherwise, we can change (k - count) chars if k does not exceed the length of the string. Otherwise it's impossible. + +**Sample Solution:** [cf844a.cpp] + +# **[C - GukiZ and Contest](http://codeforces.com/problemset/problem/551/A)** + +The problem reduces to finding the rank of each number in an array. Given the small input range, one of the easiest way is to use counting sort. You may also keep record of the original location of each number, sort them, and then assign ranks. + +**Sample Solution:** [cf551a.cpp] + +# **[D - Driving Test](http://codeforces.com/problemset/problem/845/D)** + +Let's notice that you should never say that you didn't notice signs "no speed limit" and "overtake is allowed". Also if you drive with speed sp, you don't want to remove signs "speed limit" with number greater or equal to sp. + +Thus, greedy solution will work. Process all the events in chronological order. We should maintain stack of signs "speed limit" and amount of signs "no overtake allowed". + +If we meet sign "speed limit", we push its limit to stack, sign "no overtake allowed" — increase cnt, "no speed limit" — clear stack, "overtake is allowed" — assign cnt to zero. After every event we should check if our speed is fine. While value of sign on the top of the stack is less than current speed, pop it and increase answer. If we overtake someone, we add cnt to answer and assign cnt to zero. + +**Sample Solution:** [cf845d.cpp] + +# **[E - Pashmak and Buses](http://codeforces.com/problemset/problem/459/C)** + +The bus numbers over d days for a specific student form a sequence of base k and length d. Your construction would suffice if all sequences are distinct. This is possible iff n<=k^d. Pick the first n numbers of base k and length d to form the construction. + +**Sample Solution:** [cf459c.cpp] + +[uva11172.cpp]: /assets/ipl_solutions/season3/contest1/uva11172.cpp +[uva11498.cpp]: /assets/ipl_solutions/season3/contest1/uva11498.cpp +[cf844a.cpp]: /assets/ipl_solutions/season3/contest1/cf844a.cpp +[cf551a.cpp]: /assets/ipl_solutions/season3/contest1/cf551a.cpp +[cf845d.cpp]: /assets/ipl_solutions/season3/contest1/cf845d.cpp +[cf459c.cpp]: /assets/ipl_solutions/season3/contest1/cf459c.cpp diff --git a/_posts/2018-02-18-Season3-Contest2.md b/_posts/2018-02-18-Season3-Contest2.md index 121fab1..259f834 100644 --- a/_posts/2018-02-18-Season3-Contest2.md +++ b/_posts/2018-02-18-Season3-Contest2.md @@ -1,41 +1,41 @@ ---- -layout: post -category: solutions -time: 20:00 PM -description: Solutions for both Freshman and Open Divisions. ---- -# **[A - Jolly Jumpers](https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=979)** - -Take difference between all adjacent pairs and check if 1~(n-1) all exist. - -**Sample Solution:** [uva10038.cpp] - -# **[B2 - Tricky Sum](http://codeforces.com/problemset/problem/598/A)** - -Let m be the largest power of 2 not exceeding n. Answer is 1+...+n - 2*(1+2+4+...+m). - -**Sample Solution:** [cf598a.cpp] - -# **[C - Coder](http://codeforces.com/problemset/problem/384/A)** - -By simple math the answer is (n*n+1)//2. Put on all even diagonals (aka (i+j) mod 2 = 0). - -**Sample Solution:** [cf384a.cpp] - -# **[D - Party](http://codeforces.com/problemset/problem/116/C)** - -Superior relations can be represented by a tree. Note that there can be more than one tree, so this is a forest. In a single tree, employees in the longest path from root to leave must be in distinct groups. So the answer is the max depth among all trees. - -**Sample Solution:** [cf116c.cpp] - -# **[E - Present](http://codeforces.com/problemset/problem/460/C)** - -First note that answer lies in [min{a}, min{a}+m], so we can binary search the answer. For each fixed target minimum height, scan the flowers from left to right: if a flower is below target, then dedicate a day watering a segment starting from it and extend right-ward. Check if total number of days needed does not exceed m. - -**Sample Solution:** [cf460c.cpp] - -[uva10038.cpp]: /assets/ipl_solutions/season3/contest2/uva10038.cpp -[cf598a.cpp]: /assets/ipl_solutions/season3/contest2/cf598a.cpp -[cf384a.cpp]: /assets/ipl_solutions/season3/contest2/cf384a.cpp -[cf116c.cpp]: /assets/ipl_solutions/season3/contest2/cf116c.cpp -[cf460c.cpp]: /assets/ipl_solutions/season3/contest2/cf460c.cpp +--- +layout: post +category: solutions +time: 20:00 PM +description: Solutions for both Freshman and Open Divisions. +--- +# **[A - Jolly Jumpers](https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=979)** + +Take difference between all adjacent pairs and check if 1~(n-1) all exist. + +**Sample Solution:** [uva10038.cpp] + +# **[B2 - Tricky Sum](http://codeforces.com/problemset/problem/598/A)** + +Let m be the largest power of 2 not exceeding n. Answer is 1+...+n - 2*(1+2+4+...+m). + +**Sample Solution:** [cf598a.cpp] + +# **[C - Coder](http://codeforces.com/problemset/problem/384/A)** + +By simple math the answer is (n*n+1)//2. Put on all even diagonals (aka (i+j) mod 2 = 0). + +**Sample Solution:** [cf384a.cpp] + +# **[D - Party](http://codeforces.com/problemset/problem/116/C)** + +Superior relations can be represented by a tree. Note that there can be more than one tree, so this is a forest. In a single tree, employees in the longest path from root to leave must be in distinct groups. So the answer is the max depth among all trees. + +**Sample Solution:** [cf116c.cpp] + +# **[E - Present](http://codeforces.com/problemset/problem/460/C)** + +First note that answer lies in [min{a}, min{a}+m], so we can binary search the answer. For each fixed target minimum height, scan the flowers from left to right: if a flower is below target, then dedicate a day watering a segment starting from it and extend right-ward. Check if total number of days needed does not exceed m. + +**Sample Solution:** [cf460c.cpp] + +[uva10038.cpp]: /assets/ipl_solutions/season3/contest2/uva10038.cpp +[cf598a.cpp]: /assets/ipl_solutions/season3/contest2/cf598a.cpp +[cf384a.cpp]: /assets/ipl_solutions/season3/contest2/cf384a.cpp +[cf116c.cpp]: /assets/ipl_solutions/season3/contest2/cf116c.cpp +[cf460c.cpp]: /assets/ipl_solutions/season3/contest2/cf460c.cpp diff --git a/_posts/2018-02-19-Season3-Contest3.md b/_posts/2018-02-19-Season3-Contest3.md index d15732a..34be069 100644 --- a/_posts/2018-02-19-Season3-Contest3.md +++ b/_posts/2018-02-19-Season3-Contest3.md @@ -1,58 +1,58 @@ ---- -layout: post -category: solutions -time: 20:59 PM -description: Solutions for both Freshman and Open Divisions. ---- -# **[A - Caisa and Sugar](http://codeforces.com/problemset/problem/463/A)** - -Among pairs with \\(x_i\\) less than \\(s\\), pick the type of sugar with least \\(y_i\\). If there is none, look for sugar with \\(x_i = s\\) and \\(y_i = 0\\), and output zero. Otherwise, output -1. - -# **[B1 - Love Triangle](http://codeforces.com/problemset/problem/939/A)** - -Use brute force and check if there exists $i$ such that \\(f[f[f[i]]] = i\\). Time complexity is \\(O(n)\\). - -**Sample Solution:** [cf939a.cpp] - -# **[B2 - Caisa and Pylons](http://codeforces.com/problemset/problem/463/B)** - -Observe that energy is conserved in this process, and you really just need enough energy to conquer the highest pylon in order to conquer all of them. So our strategy is to raise the zeroth pylon by \\(max\{h_i\}\\). Time complexity is \\(O(n)\\). - -**Sample Solution:** [cf463b.cpp] - -# **[C - Convenient for Everybody](http://codeforces.com/problemset/problem/939/C)** - -This is a problem involving tricky but basic math. First observe that the contest can cover only \\(f - s\\) timezones, so we enumerate sequences starting from each timezone and find the one with max sum. Using brute force will TLE (\\(O(n(f-s))\\)), but we can use a sliding window to quickly update the sum when we move by one index: \\(sum[i+1] = sum[i] - a[i] + a[i+(f-s)]\\), up to some index wrapping. - -Then convert this range of timezones to the beginning time in time zone 1. Be careful with the math but you should be able to figure this out! - -**Sample Solution:** [cf939c.cpp] - -# **[D - Gargari and Bishops](http://codeforces.com/problemset/problem/463/C)** - -Source: Codeforces - -We preprocess the sum for all the diagonals(principals and secondary diagonals) in two arrays(so that for every element i,j we can find sum of elements which are attacked in O(1) time).Also for avoiding the intersection,we need to find two cells so that for one the sum of row and column is even and for the other one the sum of row and column is odd.Finally,we analyze every cell ,we see if the sum of row and column is even or odd,and update that two positions(solutions). - -# **[E - Love Rescue](http://codeforces.com/problemset/problem/939/D)** - -If two characters in the same index differs, then they must be convertible to each other. Convertibility is defined as reachable to each other by following a sequence of spells: a spell \\((c_1, c_2)\\) can convert \\(c_1\\) to \\(c_2\\), and also \\(c_2\\) to \\(c_1\\). - -So build an undirected graph where nodes represent the alphabet letters and each edge \\((X, Y)\\) denotes that X and Y should be convertible. For each connected component of size \\(k\\), we just have to pick \\(k-1\\) edges to build a tree to make it connected. These edges will be a valid answer. - -**Sample Solution:** [cf939d.cpp] - -# **[F - Maximize!](http://codeforces.com/problemset/problem/939/E)** - -The bigger the max number, the better results you get. So pick the last (biggest) number so far. -Then pick some of the smallest numbers to lower the mean. So given the value of the max number, keep adding small numbers to the set in increasing order until adding one more will increase the mean, or you run out of numbers. Do this by keeping record of the count and sum of smallest numbers you pick. -Note that with increasing maximum value, the number of small numbers you pick should be strictly non-decreasing, so you can build from the set from last query. That will amortize the complexity of each query to \\(O(1)\\). -And watch out for overflow. Bad implementation even cause long long to overflow. - -**Sample Solution:** [cf939e.cpp] - -[cf939a.cpp]: /assets/ipl_solutions/season3/contest3/cf939a.cpp -[cf939c.cpp]: /assets/ipl_solutions/season3/contest3/cf939c.cpp -[cf939d.cpp]: /assets/ipl_solutions/season3/contest3/cf939d.cpp -[cf939e.cpp]: /assets/ipl_solutions/season3/contest3/cf939e.cpp -[cf463b.cpp]: /assets/ipl_solutions/season3/contest3/cf463b.cpp +--- +layout: post +category: solutions +time: 20:59 PM +description: Solutions for both Freshman and Open Divisions. +--- +# **[A - Caisa and Sugar](http://codeforces.com/problemset/problem/463/A)** + +Among pairs with \\(x_i\\) less than \\(s\\), pick the type of sugar with least \\(y_i\\). If there is none, look for sugar with \\(x_i = s\\) and \\(y_i = 0\\), and output zero. Otherwise, output -1. + +# **[B1 - Love Triangle](http://codeforces.com/problemset/problem/939/A)** + +Use brute force and check if there exists $i$ such that \\(f[f[f[i]]] = i\\). Time complexity is \\(O(n)\\). + +**Sample Solution:** [cf939a.cpp] + +# **[B2 - Caisa and Pylons](http://codeforces.com/problemset/problem/463/B)** + +Observe that energy is conserved in this process, and you really just need enough energy to conquer the highest pylon in order to conquer all of them. So our strategy is to raise the zeroth pylon by \\(max\{h_i\}\\). Time complexity is \\(O(n)\\). + +**Sample Solution:** [cf463b.cpp] + +# **[C - Convenient for Everybody](http://codeforces.com/problemset/problem/939/C)** + +This is a problem involving tricky but basic math. First observe that the contest can cover only \\(f - s\\) timezones, so we enumerate sequences starting from each timezone and find the one with max sum. Using brute force will TLE (\\(O(n(f-s))\\)), but we can use a sliding window to quickly update the sum when we move by one index: \\(sum[i+1] = sum[i] - a[i] + a[i+(f-s)]\\), up to some index wrapping. + +Then convert this range of timezones to the beginning time in time zone 1. Be careful with the math but you should be able to figure this out! + +**Sample Solution:** [cf939c.cpp] + +# **[D - Gargari and Bishops](http://codeforces.com/problemset/problem/463/C)** + +Source: Codeforces + +We preprocess the sum for all the diagonals(principals and secondary diagonals) in two arrays(so that for every element i,j we can find sum of elements which are attacked in O(1) time).Also for avoiding the intersection,we need to find two cells so that for one the sum of row and column is even and for the other one the sum of row and column is odd.Finally,we analyze every cell ,we see if the sum of row and column is even or odd,and update that two positions(solutions). + +# **[E - Love Rescue](http://codeforces.com/problemset/problem/939/D)** + +If two characters in the same index differs, then they must be convertible to each other. Convertibility is defined as reachable to each other by following a sequence of spells: a spell \\((c_1, c_2)\\) can convert \\(c_1\\) to \\(c_2\\), and also \\(c_2\\) to \\(c_1\\). + +So build an undirected graph where nodes represent the alphabet letters and each edge \\((X, Y)\\) denotes that X and Y should be convertible. For each connected component of size \\(k\\), we just have to pick \\(k-1\\) edges to build a tree to make it connected. These edges will be a valid answer. + +**Sample Solution:** [cf939d.cpp] + +# **[F - Maximize!](http://codeforces.com/problemset/problem/939/E)** + +The bigger the max number, the better results you get. So pick the last (biggest) number so far. +Then pick some of the smallest numbers to lower the mean. So given the value of the max number, keep adding small numbers to the set in increasing order until adding one more will increase the mean, or you run out of numbers. Do this by keeping record of the count and sum of smallest numbers you pick. +Note that with increasing maximum value, the number of small numbers you pick should be strictly non-decreasing, so you can build from the set from last query. That will amortize the complexity of each query to \\(O(1)\\). +And watch out for overflow. Bad implementation even cause long long to overflow. + +**Sample Solution:** [cf939e.cpp] + +[cf939a.cpp]: /assets/ipl_solutions/season3/contest3/cf939a.cpp +[cf939c.cpp]: /assets/ipl_solutions/season3/contest3/cf939c.cpp +[cf939d.cpp]: /assets/ipl_solutions/season3/contest3/cf939d.cpp +[cf939e.cpp]: /assets/ipl_solutions/season3/contest3/cf939e.cpp +[cf463b.cpp]: /assets/ipl_solutions/season3/contest3/cf463b.cpp diff --git a/_posts/_archive/2014-08-28-meeting-times.md b/_posts/_archive/2014-08-28-meeting-times.md index 639e48d..03fd37a 100644 --- a/_posts/_archive/2014-08-28-meeting-times.md +++ b/_posts/_archive/2014-08-28-meeting-times.md @@ -1,20 +1,20 @@ ---- -layout: post -category: announcements -time: 8:00 PM -description: Information about our weekly schedule and practices. ---- - -Hi all, our practices will be held weekly on Tuesdays from 6-8 PM. We -will hold lecture-style walkthroughs of various algorithm and data structures -topics that will appear during the Regionals and World Finals competitions and -go over problems for each topic. - -
- -We have heard that some of you may not be able to make the meeting time -given above. We will be sending out a poll soon to determine if we -need to change the meeting time. - -
-For an up-to-date schedule and information on other events throughout the semester, please refer to the calendar page. +--- +layout: post +category: announcements +time: 8:00 PM +description: Information about our weekly schedule and practices. +--- + +Hi all, our practices will be held weekly on Tuesdays from 6-8 PM. We +will hold lecture-style walkthroughs of various algorithm and data structures +topics that will appear during the Regionals and World Finals competitions and +go over problems for each topic. + +
+ +We have heard that some of you may not be able to make the meeting time +given above. We will be sending out a poll soon to determine if we +need to change the meeting time. + +
+For an up-to-date schedule and information on other events throughout the semester, please refer to the calendar page. diff --git a/_posts/_archive/2014-09-02-fall-2014-practice-1-summary.md b/_posts/_archive/2014-09-02-fall-2014-practice-1-summary.md index 71ed344..65263a1 100644 --- a/_posts/_archive/2014-09-02-fall-2014-practice-1-summary.md +++ b/_posts/_archive/2014-09-02-fall-2014-practice-1-summary.md @@ -1,35 +1,35 @@ ---- -layout: post -category: practices -time: 8:00 PM -description: Summary of our first weekly practice of the Fall 2014 semester. ---- - -In today's practice, we covered some problems that do not require any -specifically complex algorithms. All the problems we covered can be solved -using basic algorithms such as sorting and binary search. - -
- -Here is the list of problems from the last practice: - - * [http://community.topcoder.com/stat?c=problem_statement&pm=13277](http://community.topcoder.com/stat?c=problem_statement&pm=13277) - * [http://community.topcoder.com/stat?c=problem_statement&pm=13211](http://community.topcoder.com/stat?c=problem_statement&pm=13211) - * [http://community.topcoder.com/stat?c=problem_statement&pm=11454](http://community.topcoder.com/stat?c=problem_statement&pm=11454) - -
- -We didn’t get a chance to cover the third problem, but we suggest everyone -to try to solve the third problem on their own. It is definitely more -difficult than the first two, but it is possible to solve it using only the -basic algorithms we covered in the meeting. - -
- -Don't forget to send Mike (netid: jmseo2) your SPOJ username if you haven't already! We will -be using SPOJ to host practice problems. - -
- -In the next meeting, we will be covering basic math skills such as basic -combinatorics and probability. As always, pizza will be served. +--- +layout: post +category: practices +time: 8:00 PM +description: Summary of our first weekly practice of the Fall 2014 semester. +--- + +In today's practice, we covered some problems that do not require any +specifically complex algorithms. All the problems we covered can be solved +using basic algorithms such as sorting and binary search. + +
+ +Here is the list of problems from the last practice: + + * [http://community.topcoder.com/stat?c=problem_statement&pm=13277](http://community.topcoder.com/stat?c=problem_statement&pm=13277) + * [http://community.topcoder.com/stat?c=problem_statement&pm=13211](http://community.topcoder.com/stat?c=problem_statement&pm=13211) + * [http://community.topcoder.com/stat?c=problem_statement&pm=11454](http://community.topcoder.com/stat?c=problem_statement&pm=11454) + +
+ +We didn’t get a chance to cover the third problem, but we suggest everyone +to try to solve the third problem on their own. It is definitely more +difficult than the first two, but it is possible to solve it using only the +basic algorithms we covered in the meeting. + +
+ +Don't forget to send Mike (netid: jmseo2) your SPOJ username if you haven't already! We will +be using SPOJ to host practice problems. + +
+ +In the next meeting, we will be covering basic math skills such as basic +combinatorics and probability. As always, pizza will be served. diff --git a/_posts/_archive/2014-09-03-meeting-times-poll.md b/_posts/_archive/2014-09-03-meeting-times-poll.md index c6dc5ae..3fd152d 100644 --- a/_posts/_archive/2014-09-03-meeting-times-poll.md +++ b/_posts/_archive/2014-09-03-meeting-times-poll.md @@ -1,24 +1,24 @@ ---- -layout: post -category: announcements -time: 2:21 PM -description: Update regarding rescheduling our weekly practices. ---- - -A few of you have mentioned that Tuesdays from 6-8 PM are not as convenient -for you, or that you had a conflict with another SIG meeting at that time. -We have created a poll that we will use to decide when to hold our weekly -practices. Please note that the available times reflect the days when we are -available to hold practices, so we will not be able to accommodate arbitrary -dates or times. We will accept responses until Sunday night, after which point -we will send out an announcement on the final practice time. - -
- -[Click here to access the poll](https://docs.google.com/forms/d/1BJ1U8yqXBv1vZFkw8d6w2leAmMGIZ2Xs9ps943QIOjw/viewform). - -
- -Please fill out the poll **even if you are fine with the current meeting time**. -Otherwise, the meeting time could change due to the submissions of people who -currently have conflicts. +--- +layout: post +category: announcements +time: 2:21 PM +description: Update regarding rescheduling our weekly practices. +--- + +A few of you have mentioned that Tuesdays from 6-8 PM are not as convenient +for you, or that you had a conflict with another SIG meeting at that time. +We have created a poll that we will use to decide when to hold our weekly +practices. Please note that the available times reflect the days when we are +available to hold practices, so we will not be able to accommodate arbitrary +dates or times. We will accept responses until Sunday night, after which point +we will send out an announcement on the final practice time. + +
+ +[Click here to access the poll](https://docs.google.com/forms/d/1BJ1U8yqXBv1vZFkw8d6w2leAmMGIZ2Xs9ps943QIOjw/viewform). + +
+ +Please fill out the poll **even if you are fine with the current meeting time**. +Otherwise, the meeting time could change due to the submissions of people who +currently have conflicts. diff --git a/_posts/_archive/2014-09-07-practice-materials.md b/_posts/_archive/2014-09-07-practice-materials.md index 229c928..b51a197 100644 --- a/_posts/_archive/2014-09-07-practice-materials.md +++ b/_posts/_archive/2014-09-07-practice-materials.md @@ -1,31 +1,31 @@ ---- -layout: post -category: announcements -time: 7:45 PM -description: Practice materials have been added! ---- - -New practice materials have been added to the [Learn](/learn.html) page! -These include a problem classifier for SPOJ, more online judge sites, algorithm -tutorial sites, and a link to the best book to use to prepare for ICPC, -Competitive Programming by Steven Halim. - -
- -If you want to be competitive at a World Finals level, we highly recommend that -you check out the [Competitive Programming](https://sites.google.com/site/stevenhalim/) -book and try to complete all of the Volume 1 problems at (http://acm.sgu.ru). You -should also practice increasing your coding speed by attempting to score over -240 points on TopCoder Division 1 250-point problems in the practice rooms -available through the TopCoder Arena. - -
- -In addition to practicing [the problems from our weekly practices](/practices.html), -you can try your hand at weekly competitions hosted by TopCoder and Codeforces. -Check out our [calendar](/calendar.html) to see when the next TopCoder SRMs and -Codeforces competitions will be held. - -
- -*Happy coding!* +--- +layout: post +category: announcements +time: 7:45 PM +description: Practice materials have been added! +--- + +New practice materials have been added to the [Learn](/learn.html) page! +These include a problem classifier for SPOJ, more online judge sites, algorithm +tutorial sites, and a link to the best book to use to prepare for ICPC, +Competitive Programming by Steven Halim. + +
+ +If you want to be competitive at a World Finals level, we highly recommend that +you check out the [Competitive Programming](https://sites.google.com/site/stevenhalim/) +book and try to complete all of the Volume 1 problems at (http://acm.sgu.ru). You +should also practice increasing your coding speed by attempting to score over +240 points on TopCoder Division 1 250-point problems in the practice rooms +available through the TopCoder Arena. + +
+ +In addition to practicing [the problems from our weekly practices](/practices.html), +you can try your hand at weekly competitions hosted by TopCoder and Codeforces. +Check out our [calendar](/calendar.html) to see when the next TopCoder SRMs and +Codeforces competitions will be held. + +
+ +*Happy coding!* diff --git a/_posts/_archive/2014-09-08-meeting-times-update.md b/_posts/_archive/2014-09-08-meeting-times-update.md index 86560cd..9d579c3 100644 --- a/_posts/_archive/2014-09-08-meeting-times-update.md +++ b/_posts/_archive/2014-09-08-meeting-times-update.md @@ -1,26 +1,26 @@ ---- -layout: post -category: announcements -time: 2:13 PM -description: Weekly practice meeting time update. ---- - -Of the 22 responses we received to the meeting times poll, only one student -was unable to attend a practice on Tuesdays. As a result, we will be continuing -to hold our weekly practices on Tuesdays from 6-8 PM in 0218 Siebel Center. If -you are one of the few students for whom Tuesdays do not work, please continue -to check this website every week for a practice summary and the set of -problems we solved during the practice, and try your hand at them outside of -practice. If you have any questions or need more guidance, let us know through -the mailing list or by contacting me directly (netid: thakore1). - -
- -As a reminder, our next practice will be tomorrow, Tuesday, September 8th. -Mike will be going over math-based problems, with topics including -combinatorics and number theory. As always, pizza will be provided. We look -forward to seeing you there! - -
- -Uttam +--- +layout: post +category: announcements +time: 2:13 PM +description: Weekly practice meeting time update. +--- + +Of the 22 responses we received to the meeting times poll, only one student +was unable to attend a practice on Tuesdays. As a result, we will be continuing +to hold our weekly practices on Tuesdays from 6-8 PM in 0218 Siebel Center. If +you are one of the few students for whom Tuesdays do not work, please continue +to check this website every week for a practice summary and the set of +problems we solved during the practice, and try your hand at them outside of +practice. If you have any questions or need more guidance, let us know through +the mailing list or by contacting me directly (netid: thakore1). + +
+ +As a reminder, our next practice will be tomorrow, Tuesday, September 8th. +Mike will be going over math-based problems, with topics including +combinatorics and number theory. As always, pizza will be provided. We look +forward to seeing you there! + +
+ +Uttam diff --git a/_posts/_archive/2014-09-09-fall-2014-practice-2-summary.md b/_posts/_archive/2014-09-09-fall-2014-practice-2-summary.md index 3b30349..04f784a 100644 --- a/_posts/_archive/2014-09-09-fall-2014-practice-2-summary.md +++ b/_posts/_archive/2014-09-09-fall-2014-practice-2-summary.md @@ -1,43 +1,43 @@ ---- -layout: post -category: practices -time: 8:00 PM -description: Summary of our second weekly practice of the Fall 2014 semester. ---- - -In the last practice, we covered some basic number theory concepts and related -problems. Everyone should know what GCD and LCM are, and know how to compute -them quickly using the Euclidean algorithm. - -Everyone should know the formula gcd(a, b)lcm[a,b] = ab. - -We also covered how to find a list of primes using the Sieve of Eratosthenes -and went over some basic properties of the Euler phi (totient) function. - -
- -We then solved some easy problems using concepts of GCD and LCM. - -
- - * [http://community.topcoder.com/stat?c=problem_statement&pm=11364](http://community.topcoder.com/stat?c=problem_statement&pm=11364) - * [http://community.topcoder.com/stat?c=problem_statement&pm=12918](http://community.topcoder.com/stat?c=problem_statement&pm=12918) - -
- -Aim to be able to solve problems of this level of difficulty less than 10 -minutes. - -
- -Also, try to solve practice problems in the math section uploaded on our SPOJ -practice website ([available here](http://www.spoj.com/UIUC/problems/math)). -(If you cannot submit a problem on our SPOJ practice website, please send your -SPOJ username to Mike (netid: jmseo2).) - -
- -In the next meeting, we will cover some basic search algorithms such as depth -first search and breadth first search. Many problems in our regional involve -using these two algorithms, so don’t miss it! As always, free pizza will be -provided. +--- +layout: post +category: practices +time: 8:00 PM +description: Summary of our second weekly practice of the Fall 2014 semester. +--- + +In the last practice, we covered some basic number theory concepts and related +problems. Everyone should know what GCD and LCM are, and know how to compute +them quickly using the Euclidean algorithm. + +Everyone should know the formula gcd(a, b)lcm[a,b] = ab. + +We also covered how to find a list of primes using the Sieve of Eratosthenes +and went over some basic properties of the Euler phi (totient) function. + +
+ +We then solved some easy problems using concepts of GCD and LCM. + +
+ + * [http://community.topcoder.com/stat?c=problem_statement&pm=11364](http://community.topcoder.com/stat?c=problem_statement&pm=11364) + * [http://community.topcoder.com/stat?c=problem_statement&pm=12918](http://community.topcoder.com/stat?c=problem_statement&pm=12918) + +
+ +Aim to be able to solve problems of this level of difficulty less than 10 +minutes. + +
+ +Also, try to solve practice problems in the math section uploaded on our SPOJ +practice website ([available here](http://www.spoj.com/UIUC/problems/math)). +(If you cannot submit a problem on our SPOJ practice website, please send your +SPOJ username to Mike (netid: jmseo2).) + +
+ +In the next meeting, we will cover some basic search algorithms such as depth +first search and breadth first search. Many problems in our regional involve +using these two algorithms, so don’t miss it! As always, free pizza will be +provided. diff --git a/_posts/_archive/2014-09-11-tryouts-announcement.md b/_posts/_archive/2014-09-11-tryouts-announcement.md index 3089261..74546ac 100644 --- a/_posts/_archive/2014-09-11-tryouts-announcement.md +++ b/_posts/_archive/2014-09-11-tryouts-announcement.md @@ -1,50 +1,50 @@ ---- -layout: post -category: announcements -time: 7:30 PM -description: IMPORTANT!!! Information about tryouts! ---- - -Tryouts for the ACM ICPC Regionals competition will be held on Sunday, -September 14th from 12-5 PM, and on Saturday, September 20th from 12-5 PM. Both -tryouts will be held in room 520 of the Digital Computer Laboratory (DCL), -which is an EWS Linux lab. We will be providing lunch for competitors only at -11:30 AM, and there will be snacks and water for consumption during the -competition. Please make sure you arrive before 12 PM to get situated for the -competition, as we will begin promptly at 12 PM. - -
- -*If you would like to represent UIUC at the Mid-Central Regionals competition -with a chance to advance to the World Finals competition, you must -participate in one of the two tryouts!* - -
- -We *strongly* encourage anyone interested in being part of the Regionals teams -to compete in as many of the tryouts as you can. Each tryout will have a -unique problem set, so your performance on one set may be different than your -performance on the other. If you compete in both tryouts, we will factor -your performance in both into our decisions when deciding teams. Even if you -are not planning on competing at Regionals this year, we encourage you to -participate in the tryouts to get a feel for ICPC-style competitions. - -
- -In order to make sure that you have a login for the tryouts contest -environment, please fill out the poll available [here](https://docs.google.com/forms/d/1qi1LQvW7qnh3lHmWqdO4xU-P1M0Zd5_iWEUWv589FUg/viewform?usp=send_form). -Registration here will also be important to ensure that your participation is -properly factored into the team deciding process for Regionals. - -
- -Except for API documentation (such as cplusplus.com or the Java API), no -outside materials will be allowed during the tryouts competition. Please -practice ahead of time and familiarize yourself with the implementation of -various common algorithms. - -
- -If you have any questions regarding tryouts, please e-mail Uttam -(netid: thakore1). Good luck with your preparation, and we'll see you at the -tryouts! +--- +layout: post +category: announcements +time: 7:30 PM +description: IMPORTANT!!! Information about tryouts! +--- + +Tryouts for the ACM ICPC Regionals competition will be held on Sunday, +September 14th from 12-5 PM, and on Saturday, September 20th from 12-5 PM. Both +tryouts will be held in room 520 of the Digital Computer Laboratory (DCL), +which is an EWS Linux lab. We will be providing lunch for competitors only at +11:30 AM, and there will be snacks and water for consumption during the +competition. Please make sure you arrive before 12 PM to get situated for the +competition, as we will begin promptly at 12 PM. + +
+ +*If you would like to represent UIUC at the Mid-Central Regionals competition +with a chance to advance to the World Finals competition, you must +participate in one of the two tryouts!* + +
+ +We *strongly* encourage anyone interested in being part of the Regionals teams +to compete in as many of the tryouts as you can. Each tryout will have a +unique problem set, so your performance on one set may be different than your +performance on the other. If you compete in both tryouts, we will factor +your performance in both into our decisions when deciding teams. Even if you +are not planning on competing at Regionals this year, we encourage you to +participate in the tryouts to get a feel for ICPC-style competitions. + +
+ +In order to make sure that you have a login for the tryouts contest +environment, please fill out the poll available [here](https://docs.google.com/forms/d/1qi1LQvW7qnh3lHmWqdO4xU-P1M0Zd5_iWEUWv589FUg/viewform?usp=send_form). +Registration here will also be important to ensure that your participation is +properly factored into the team deciding process for Regionals. + +
+ +Except for API documentation (such as cplusplus.com or the Java API), no +outside materials will be allowed during the tryouts competition. Please +practice ahead of time and familiarize yourself with the implementation of +various common algorithms. + +
+ +If you have any questions regarding tryouts, please e-mail Uttam +(netid: thakore1). Good luck with your preparation, and we'll see you at the +tryouts! diff --git a/_posts/_archive/2014-09-14-tryouts-#1-results.md b/_posts/_archive/2014-09-14-tryouts-#1-results.md index df8418b..293e8f2 100644 --- a/_posts/_archive/2014-09-14-tryouts-#1-results.md +++ b/_posts/_archive/2014-09-14-tryouts-#1-results.md @@ -1,37 +1,37 @@ ---- -layout: post -category: announcements -time: 6:00 PM -description: Results from the first tryouts. ---- - -Congratulations to Mike Seo for winning the first tryout competition by solving -7 of the 9 problems. Also congratulations to Ruihan Shan and Hao Gao for -placing second and third, respectively, by solving 4 problems. Everyone did a -wonderful job, and only one problem remained unsolved at the end of the -competition. - -
- -The final scoreboard is available at [http://domjudge.cs.illinois.edu/public/](http://domjudge.cs.illinois.edu/public/) -and will remain up until the end of day Friday. I have also opened the contest -to submissions until end of day Friday for those of you who would like to try -their hand at the problems or solve the problems you weren’t able to get -during the tryout. The contest environment can be accessed at -[http://domjudge.cs.illinois.edu/team/](http://domjudge.cs.illinois.edu/team/) -using the username and password you received in your e-mail. If you did not -register for the tryout but would like to try your hand at the problems, -please e-mail Uttam (netid: thakore1). - -
- -Our second and final tryout will be next Saturday, September 20th from 12-5 PM. -If you did not perform as well as you had hoped or were not able to make this -tryout, you still have another chance at making it onto a regionals team! **If -you would like to participate in next week’s tryout, make sure to fill out the -Google docs poll [available here](https://docs.google.com/forms/d/1qi1LQvW7qnh3lHmWqdO4xU-P1M0Zd5_iWEUWv589FUg/viewform?usp=send_form)!!!** - -
- -As a reminder, there will be a meeting this Tuesday on search problems. We look -forward to seeing you all there! +--- +layout: post +category: announcements +time: 6:00 PM +description: Results from the first tryouts. +--- + +Congratulations to Mike Seo for winning the first tryout competition by solving +7 of the 9 problems. Also congratulations to Ruihan Shan and Hao Gao for +placing second and third, respectively, by solving 4 problems. Everyone did a +wonderful job, and only one problem remained unsolved at the end of the +competition. + +
+ +The final scoreboard is available at [http://domjudge.cs.illinois.edu/public/](http://domjudge.cs.illinois.edu/public/) +and will remain up until the end of day Friday. I have also opened the contest +to submissions until end of day Friday for those of you who would like to try +their hand at the problems or solve the problems you weren’t able to get +during the tryout. The contest environment can be accessed at +[http://domjudge.cs.illinois.edu/team/](http://domjudge.cs.illinois.edu/team/) +using the username and password you received in your e-mail. If you did not +register for the tryout but would like to try your hand at the problems, +please e-mail Uttam (netid: thakore1). + +
+ +Our second and final tryout will be next Saturday, September 20th from 12-5 PM. +If you did not perform as well as you had hoped or were not able to make this +tryout, you still have another chance at making it onto a regionals team! **If +you would like to participate in next week’s tryout, make sure to fill out the +Google docs poll [available here](https://docs.google.com/forms/d/1qi1LQvW7qnh3lHmWqdO4xU-P1M0Zd5_iWEUWv589FUg/viewform?usp=send_form)!!!** + +
+ +As a reminder, there will be a meeting this Tuesday on search problems. We look +forward to seeing you all there! diff --git a/_posts/_archive/2014-09-16-fall-2014-practice-3-summary.md b/_posts/_archive/2014-09-16-fall-2014-practice-3-summary.md index 6bc41f1..489c113 100644 --- a/_posts/_archive/2014-09-16-fall-2014-practice-3-summary.md +++ b/_posts/_archive/2014-09-16-fall-2014-practice-3-summary.md @@ -1,37 +1,37 @@ ---- -layout: post -category: practices -time: 8:00 PM -description: Summary of our third weekly practice of the Fall 2014 semester. ---- - -In the last practice, we had a free practice session where we discussed the problems -from our first tryouts. We had originally planned to cover search algorithms, but -due to our busy schedules, we were unable to prepare a lecture. - -
- -As a reminder, our second and final tryouts will be this Saturday, September 20th. If -you intend to participate, please visit the Announcements page and make sure you -follow the instructions provided in the tryouts announcements to register for the -tryouts. - -
- -In our next practice, we will announce the Regionals teams based on the tryouts -results and discuss competition strategy. This will include how to triage a problem -set at the beginning of a competition, how to distribute problems among team members, -how to work as a team using only one computer, and how to practice in preparation -for our Regionals competition. - -
- -To help us cover these topics, we will have a guest speaker, Jingbo Shang, who has -come in 2nd place at World Finals in the past! Even if you will not be -attending Regionals, this meeting will be a great chance to pick the brain of a -veteran. Additionally, these skills will help you in other ICPC-style competitions, -so we encourage you to attend. - -
- -Happy coding, and good luck at this weekend's tryouts! +--- +layout: post +category: practices +time: 8:00 PM +description: Summary of our third weekly practice of the Fall 2014 semester. +--- + +In the last practice, we had a free practice session where we discussed the problems +from our first tryouts. We had originally planned to cover search algorithms, but +due to our busy schedules, we were unable to prepare a lecture. + +
+ +As a reminder, our second and final tryouts will be this Saturday, September 20th. If +you intend to participate, please visit the Announcements page and make sure you +follow the instructions provided in the tryouts announcements to register for the +tryouts. + +
+ +In our next practice, we will announce the Regionals teams based on the tryouts +results and discuss competition strategy. This will include how to triage a problem +set at the beginning of a competition, how to distribute problems among team members, +how to work as a team using only one computer, and how to practice in preparation +for our Regionals competition. + +
+ +To help us cover these topics, we will have a guest speaker, Jingbo Shang, who has +come in 2nd place at World Finals in the past! Even if you will not be +attending Regionals, this meeting will be a great chance to pick the brain of a +veteran. Additionally, these skills will help you in other ICPC-style competitions, +so we encourage you to attend. + +
+ +Happy coding, and good luck at this weekend's tryouts! diff --git a/_posts/_archive/2014-09-18-tryouts-reminder.md b/_posts/_archive/2014-09-18-tryouts-reminder.md index 844b05b..0dc6d3c 100644 --- a/_posts/_archive/2014-09-18-tryouts-reminder.md +++ b/_posts/_archive/2014-09-18-tryouts-reminder.md @@ -1,50 +1,50 @@ ---- -layout: post -category: announcements -time: 5:00 PM -description: IMPORTANT!!! Information about the second and final tryouts! ---- - -Our final tryouts for the ACM ICPC Regionals competition will be held this Saturday, -September 20th from 12-5 PM. As was the case with the first tryout, this tryout will -be held in room 520 of the Digital Computer Laboratory (DCL), which is an EWS Linux -lab. We will be providing lunch for competitors at 11:30 AM, and there will be -snacks and water for consumption during the competition. Please make sure you arrive -before 12 PM to get situated for the competition, as we will begin promptly at 12 PM. -If you are not familiar with EWS Linux labs or would like to know which IDEs will be -available during the competition, please visit the lab room before Saturday. - -
- -*If you would like to represent UIUC at the Mid-Central Regionals competition -with a chance to advance to the World Finals competition, you must -participate in one of the two tryouts!* - -
- -If you did not perform as well in the first tryout as you had hoped, this tryout will -be your chance to improve your performance and secure a spot on a top team. The -problem set for this tryout will be unique, so your performance on this set may be -different than your performance on the first. If you compete in both tryouts, we will -factor your performance in both into our decisions when deciding teams. Even if you -are not planning on competing at Regionals this year, we encourage you to -participate in the tryouts to get a feel for ICPC-style competitions. - -
- -As a reminder, you must fill out the poll available [here](https://docs.google.com/forms/d/1qi1LQvW7qnh3lHmWqdO4xU-P1M0Zd5_iWEUWv589FUg/viewform?usp=send_form) -before Friday morning. Only those who are registered by that time will be given a -username and allowed to compete. - -
- -Except for API documentation (such as cplusplus.com or the Java API), no -outside materials will be allowed during the tryouts competition. Please -practice ahead of time and familiarize yourself with the implementation of -various common algorithms. - -
- -If you have any questions regarding tryouts, please e-mail Uttam -(netid: thakore1). Good luck with your preparation, and we'll see you at the -tryouts! +--- +layout: post +category: announcements +time: 5:00 PM +description: IMPORTANT!!! Information about the second and final tryouts! +--- + +Our final tryouts for the ACM ICPC Regionals competition will be held this Saturday, +September 20th from 12-5 PM. As was the case with the first tryout, this tryout will +be held in room 520 of the Digital Computer Laboratory (DCL), which is an EWS Linux +lab. We will be providing lunch for competitors at 11:30 AM, and there will be +snacks and water for consumption during the competition. Please make sure you arrive +before 12 PM to get situated for the competition, as we will begin promptly at 12 PM. +If you are not familiar with EWS Linux labs or would like to know which IDEs will be +available during the competition, please visit the lab room before Saturday. + +
+ +*If you would like to represent UIUC at the Mid-Central Regionals competition +with a chance to advance to the World Finals competition, you must +participate in one of the two tryouts!* + +
+ +If you did not perform as well in the first tryout as you had hoped, this tryout will +be your chance to improve your performance and secure a spot on a top team. The +problem set for this tryout will be unique, so your performance on this set may be +different than your performance on the first. If you compete in both tryouts, we will +factor your performance in both into our decisions when deciding teams. Even if you +are not planning on competing at Regionals this year, we encourage you to +participate in the tryouts to get a feel for ICPC-style competitions. + +
+ +As a reminder, you must fill out the poll available [here](https://docs.google.com/forms/d/1qi1LQvW7qnh3lHmWqdO4xU-P1M0Zd5_iWEUWv589FUg/viewform?usp=send_form) +before Friday morning. Only those who are registered by that time will be given a +username and allowed to compete. + +
+ +Except for API documentation (such as cplusplus.com or the Java API), no +outside materials will be allowed during the tryouts competition. Please +practice ahead of time and familiarize yourself with the implementation of +various common algorithms. + +
+ +If you have any questions regarding tryouts, please e-mail Uttam +(netid: thakore1). Good luck with your preparation, and we'll see you at the +tryouts! diff --git a/_posts/_archive/2014-09-20-tryouts-#2-results.md b/_posts/_archive/2014-09-20-tryouts-#2-results.md index d666db4..7c634da 100644 --- a/_posts/_archive/2014-09-20-tryouts-#2-results.md +++ b/_posts/_archive/2014-09-20-tryouts-#2-results.md @@ -1,48 +1,48 @@ ---- -layout: post -category: announcements -time: 11:30 PM -description: Results from the second tryouts. ---- - -Congratulations to Timothy Smith for winning Saturday’s tryouts by solving 6 of the 9 -problems! Also congratulations to Ryan Jian and Yong Hong for placing second and -third by solving 5 and 3 problems, respectively. Everyone did a great job, with -almost everyone solving at least one problem, and only two of the problems remained -unsolved at the end of the competition. The final scoreboard is up at -[http://domjudge.cs.illinois.edu/public](http://domjudge.cs.illinois.edu/public), and -as with the first tryout, the competition is open to submissions if you want to try -the problems you missed during the tryout. - -
- -We had a grand total of 30 people try out this year! This meant that competition for -the top spots was intense. This year, the cutoff for making one of the 5 teams was 2 -problems in the first tryout or 3 problems in the second tryout. Congratulations to -everyone who qualified! - -
- -Depending on how many teams register for our Regionals site, we might be able to take -a sixth team, so if you were one of the people who solved 2 problems in the second -tryout, keep posted for more information. Also, if you cannot attend Regionals -(Saturday, November 1st) for any reason or would not be able to attend World Finals -(May 16 – 21 in Morocco) if you qualified, please let Uttam (netid: thakore1) know -immediately so we can extend the chance to the next qualifying person. It is -important that you let us know within the next week, as it would be unfair both to -your would-be teammates and to others who would be interested in participating if -you drop out at the last minute. - -
- -**We are deciding teams now, so if you have a preference for teammates, please let -Uttam know by tomorrow before the practice.** We cannot promise to accommodate -everyone, but we will use your input in deciding the teams. The teams will be -announced and finalized at tomorrow’s practice, so if you qualified, you must -be present at tomorrow’s practice!!! We will also be going over competition -strategy and the solutions to the tryouts problems tomorrow with a two time World -Finals gold medalist (one of those times his team was in 2nd place!) and subsequent -coach for his school’s World Finals teams, so it is *STRONGLY* encouraged to attend, -even if you did not make any teams but want to do better in the future. If you -qualified but cannot be at the practice for any reason, please let us know -immediately. +--- +layout: post +category: announcements +time: 11:30 PM +description: Results from the second tryouts. +--- + +Congratulations to Timothy Smith for winning Saturday’s tryouts by solving 6 of the 9 +problems! Also congratulations to Ryan Jian and Yong Hong for placing second and +third by solving 5 and 3 problems, respectively. Everyone did a great job, with +almost everyone solving at least one problem, and only two of the problems remained +unsolved at the end of the competition. The final scoreboard is up at +[http://domjudge.cs.illinois.edu/public](http://domjudge.cs.illinois.edu/public), and +as with the first tryout, the competition is open to submissions if you want to try +the problems you missed during the tryout. + +
+ +We had a grand total of 30 people try out this year! This meant that competition for +the top spots was intense. This year, the cutoff for making one of the 5 teams was 2 +problems in the first tryout or 3 problems in the second tryout. Congratulations to +everyone who qualified! + +
+ +Depending on how many teams register for our Regionals site, we might be able to take +a sixth team, so if you were one of the people who solved 2 problems in the second +tryout, keep posted for more information. Also, if you cannot attend Regionals +(Saturday, November 1st) for any reason or would not be able to attend World Finals +(May 16 – 21 in Morocco) if you qualified, please let Uttam (netid: thakore1) know +immediately so we can extend the chance to the next qualifying person. It is +important that you let us know within the next week, as it would be unfair both to +your would-be teammates and to others who would be interested in participating if +you drop out at the last minute. + +
+ +**We are deciding teams now, so if you have a preference for teammates, please let +Uttam know by tomorrow before the practice.** We cannot promise to accommodate +everyone, but we will use your input in deciding the teams. The teams will be +announced and finalized at tomorrow’s practice, so if you qualified, you must +be present at tomorrow’s practice!!! We will also be going over competition +strategy and the solutions to the tryouts problems tomorrow with a two time World +Finals gold medalist (one of those times his team was in 2nd place!) and subsequent +coach for his school’s World Finals teams, so it is *STRONGLY* encouraged to attend, +even if you did not make any teams but want to do better in the future. If you +qualified but cannot be at the practice for any reason, please let us know +immediately. diff --git a/_posts/_archive/2014-09-23-fall-2014-practice-4-summary.md b/_posts/_archive/2014-09-23-fall-2014-practice-4-summary.md index 8ada6a3..1d0226b 100644 --- a/_posts/_archive/2014-09-23-fall-2014-practice-4-summary.md +++ b/_posts/_archive/2014-09-23-fall-2014-practice-4-summary.md @@ -1,47 +1,47 @@ ---- -layout: post -category: practices -time: 8:00 PM -description: Summary of our fourth weekly practice of the Fall 2014 semester. ---- - -In the last practice, we announced the teams for Regionals and went over the problems -from the tryouts. We also discussed various elements of competition strategy, which -included the importance of triaging a problem set, how to triage, how to distribute -problems among team members, and how to work as a team using only one computer. - -
- -Triaging involves reading through a problem set and identifying the difficulties and -types of algorithms required for each problem. In individual competitions, triaging -should be done before coding any problems, as it is possible that the first easy -problem you see is not the easiest and fastest problem to code. For team competitions, -while one person is coding the easiest problem, the others should be triaging the -remaining set before attempting to solve any problems. - -
- -At the practice, we practiced triaging using the 2012 Mid-Central ICPC Regionals -problem set. We encourage everyone who did not attend the practice to attempt to -triage the problem set, which is located [here](http://mcicpc.cs.atu.edu/archives/2012/mcpc2012/browse.html). -We also encourage everyone to practice triaging with last year's Regionals problem -set, which is located [here](http://mcicpc.cs.atu.edu/archives/2013/mcpc2013/browse.html). -After you have come up with a ranking of difficulties and types of problems, you can -evaluate your answers using the "general notes on the problem set" and the "judge's -notes" available on the contest materials page. - -
- -Additionally, we went over the reference materials teams are allowed to bring to -Regionals and gave some recommendations on what to include in your team's set. Visit -the Mid-Central region's [rules page](http://mcicpc.cs.atu.edu/rules.html#ref) for -the full information on what reference materials you can take with you. We require -that each team spend the time preparing their own reference materials before the -competition, as this can be the difference between solving 4 problems and solving 6. - -
- -At next week's practice, we will go over simulation problems, which make up a -considerable portion of our Regionals problem set. If you are on a Regionals team, -we highly recommend that you attend this practice. Of course, the practice is open -to anyone who is interested in learning. +--- +layout: post +category: practices +time: 8:00 PM +description: Summary of our fourth weekly practice of the Fall 2014 semester. +--- + +In the last practice, we announced the teams for Regionals and went over the problems +from the tryouts. We also discussed various elements of competition strategy, which +included the importance of triaging a problem set, how to triage, how to distribute +problems among team members, and how to work as a team using only one computer. + +
+ +Triaging involves reading through a problem set and identifying the difficulties and +types of algorithms required for each problem. In individual competitions, triaging +should be done before coding any problems, as it is possible that the first easy +problem you see is not the easiest and fastest problem to code. For team competitions, +while one person is coding the easiest problem, the others should be triaging the +remaining set before attempting to solve any problems. + +
+ +At the practice, we practiced triaging using the 2012 Mid-Central ICPC Regionals +problem set. We encourage everyone who did not attend the practice to attempt to +triage the problem set, which is located [here](http://mcicpc.cs.atu.edu/archives/2012/mcpc2012/browse.html). +We also encourage everyone to practice triaging with last year's Regionals problem +set, which is located [here](http://mcicpc.cs.atu.edu/archives/2013/mcpc2013/browse.html). +After you have come up with a ranking of difficulties and types of problems, you can +evaluate your answers using the "general notes on the problem set" and the "judge's +notes" available on the contest materials page. + +
+ +Additionally, we went over the reference materials teams are allowed to bring to +Regionals and gave some recommendations on what to include in your team's set. Visit +the Mid-Central region's [rules page](http://mcicpc.cs.atu.edu/rules.html#ref) for +the full information on what reference materials you can take with you. We require +that each team spend the time preparing their own reference materials before the +competition, as this can be the difference between solving 4 problems and solving 6. + +
+ +At next week's practice, we will go over simulation problems, which make up a +considerable portion of our Regionals problem set. If you are on a Regionals team, +we highly recommend that you attend this practice. Of course, the practice is open +to anyone who is interested in learning. diff --git a/_posts/_archive/2014-09-23-regionals-team-announcements.md b/_posts/_archive/2014-09-23-regionals-team-announcements.md index bf7094a..1000d15 100644 --- a/_posts/_archive/2014-09-23-regionals-team-announcements.md +++ b/_posts/_archive/2014-09-23-regionals-team-announcements.md @@ -1,56 +1,56 @@ ---- -layout: post -category: announcements -time: 8:00 PM -description: Announcement of the teams for the 2014 Regionals. ---- - -Congratulations to the following people, who made it onto teams for regionals! - -
- -**Team 1:** - - * Mike Seo - * Ruihan Shan - * Timothy Smith - -
- -**Team 2:** - - * Timur Barkaev - * Hao Gao - * Ryan Jian - -
- -**Team 3:** - - * Shivam Gupta - * Yong Hong - * Phakpoom Chinprutthiwong - -
- -**Team 4:** - - * Yan Han - * Phillip Harris - * Arshdeep Sabharwal - -
- -**Team 5:** - - * Seung Hyun Kim - * Zhengqi Yang - * Xusheng Zhang - -
- -As was mentioned at the last practice, due to limited space at our Regionals site, -we can only guarantee that the first three teams will be able to attend Regionals. -We will know by October 18th how many more of the teams will be able to attend, but -until then, all of the students mentioned above should be practicing with their team -with the expectation that they will be attending Regionals. +--- +layout: post +category: announcements +time: 8:00 PM +description: Announcement of the teams for the 2014 Regionals. +--- + +Congratulations to the following people, who made it onto teams for regionals! + +
+ +**Team 1:** + + * Mike Seo + * Ruihan Shan + * Timothy Smith + +
+ +**Team 2:** + + * Timur Barkaev + * Hao Gao + * Ryan Jian + +
+ +**Team 3:** + + * Shivam Gupta + * Yong Hong + * Phakpoom Chinprutthiwong + +
+ +**Team 4:** + + * Yan Han + * Phillip Harris + * Arshdeep Sabharwal + +
+ +**Team 5:** + + * Seung Hyun Kim + * Zhengqi Yang + * Xusheng Zhang + +
+ +As was mentioned at the last practice, due to limited space at our Regionals site, +we can only guarantee that the first three teams will be able to attend Regionals. +We will know by October 18th how many more of the teams will be able to attend, but +until then, all of the students mentioned above should be practicing with their team +with the expectation that they will be attending Regionals. diff --git a/_posts/_archive/2014-09-24-practice-contest-registration.md b/_posts/_archive/2014-09-24-practice-contest-registration.md index 37db5f9..c80c4b7 100644 --- a/_posts/_archive/2014-09-24-practice-contest-registration.md +++ b/_posts/_archive/2014-09-24-practice-contest-registration.md @@ -1,43 +1,43 @@ ---- -layout: post -category: announcements -time: 8:15 PM -description: IMPORTANT!!! Information regarding registration for Saturday's practice contest. ---- - -As a reminder, there will be a practice contest this Saturday in DCL 520 from 2 – 7 -PM. The contest is actually the [ACM-ICPC North America Qualification Contest](http://cs.ecs.baylor.edu/~hamerly/icpc/qualifier_2014/), -which we are using this year for practice. All regionals teams should compete as -teams, but anyone is welcome to request a login and participate individually or as a -group for practice. - -
- -If you are interested in participating in the practice contest this Saturday, please -register on the ICPC site (not our website), located at [https://icpc.baylor.edu](https://icpc.baylor.edu), -and e-mail me (netid: thakore1) by Friday afternoon. Use your Illinois e-mail address -for registration unless you have a strong reason to do otherwise. Please make sure -your registration is complete before you e-mail me, as if I cannot find you in the -ICPC system (either by your e-mail address or full name) when I get your e-mail, I -will disregard it and you will not have a username for the competition on Saturday. - -
- -For those of you on Regionals teams, you will need to register on the ICPC site as -well both for this contest and to be registered for Regionals. Please make sure you -do this by this Saturday and let me know once you have. You are already registered -for the practice contest and do not need to e-mail me to receive your login -information. If you have any trouble, let me know as soon as possible. - -
- -Once I receive the login information for the contest, I will forward it to everyone -who is registered. This should happen by Friday. I will not be present or available -on Saturday to hand out additional usernames and passwords, so if you want to -participate, you must e-mail me by Friday. - -
- -Thanks, - -Uttam +--- +layout: post +category: announcements +time: 8:15 PM +description: IMPORTANT!!! Information regarding registration for Saturday's practice contest. +--- + +As a reminder, there will be a practice contest this Saturday in DCL 520 from 2 – 7 +PM. The contest is actually the [ACM-ICPC North America Qualification Contest](http://cs.ecs.baylor.edu/~hamerly/icpc/qualifier_2014/), +which we are using this year for practice. All regionals teams should compete as +teams, but anyone is welcome to request a login and participate individually or as a +group for practice. + +
+ +If you are interested in participating in the practice contest this Saturday, please +register on the ICPC site (not our website), located at [https://icpc.baylor.edu](https://icpc.baylor.edu), +and e-mail me (netid: thakore1) by Friday afternoon. Use your Illinois e-mail address +for registration unless you have a strong reason to do otherwise. Please make sure +your registration is complete before you e-mail me, as if I cannot find you in the +ICPC system (either by your e-mail address or full name) when I get your e-mail, I +will disregard it and you will not have a username for the competition on Saturday. + +
+ +For those of you on Regionals teams, you will need to register on the ICPC site as +well both for this contest and to be registered for Regionals. Please make sure you +do this by this Saturday and let me know once you have. You are already registered +for the practice contest and do not need to e-mail me to receive your login +information. If you have any trouble, let me know as soon as possible. + +
+ +Once I receive the login information for the contest, I will forward it to everyone +who is registered. This should happen by Friday. I will not be present or available +on Saturday to hand out additional usernames and passwords, so if you want to +participate, you must e-mail me by Friday. + +
+ +Thanks, + +Uttam diff --git a/_posts/_archive/2014-09-30-fall-2014-practice-5-summary.md b/_posts/_archive/2014-09-30-fall-2014-practice-5-summary.md index fe10226..0953775 100644 --- a/_posts/_archive/2014-09-30-fall-2014-practice-5-summary.md +++ b/_posts/_archive/2014-09-30-fall-2014-practice-5-summary.md @@ -1,24 +1,24 @@ ---- -layout: post -category: practices -time: 8:00 PM -description: Summary of our fifth weekly practice of the Fall 2014 semester. ---- - -Last practice, we covered simulation problems from the past regionals. We went over -one easy and one easy-moderate level problem. - - * [http://mcicpc.cs.atu.edu/archives/2008/mcpc2008/firefly/firefly.html](http://mcicpc.cs.atu.edu/archives/2008/mcpc2008/firefly/firefly.html) - * [http://mcicpc.cs.atu.edu/archives/2009/mcpc2009/dull/dull.html](http://mcicpc.cs.atu.edu/archives/2009/mcpc2009/dull/dull.html) - -
- -Make sure you are comfortable solving simulation problems, as they are the most -common problems in our region. You should be able to solve them quickly enough so -that you can focus on harder problems. - -
- -At our next practice, we will go over graph algorithms, including search (BFS and -DFS) and other general purpose algorithms (shortest path, minimum spanning tree, -etc.). +--- +layout: post +category: practices +time: 8:00 PM +description: Summary of our fifth weekly practice of the Fall 2014 semester. +--- + +Last practice, we covered simulation problems from the past regionals. We went over +one easy and one easy-moderate level problem. + + * [http://mcicpc.cs.atu.edu/archives/2008/mcpc2008/firefly/firefly.html](http://mcicpc.cs.atu.edu/archives/2008/mcpc2008/firefly/firefly.html) + * [http://mcicpc.cs.atu.edu/archives/2009/mcpc2009/dull/dull.html](http://mcicpc.cs.atu.edu/archives/2009/mcpc2009/dull/dull.html) + +
+ +Make sure you are comfortable solving simulation problems, as they are the most +common problems in our region. You should be able to solve them quickly enough so +that you can focus on harder problems. + +
+ +At our next practice, we will go over graph algorithms, including search (BFS and +DFS) and other general purpose algorithms (shortest path, minimum spanning tree, +etc.). diff --git a/_posts/_archive/2014-10-07-fall-2014-practice-6-summary.md b/_posts/_archive/2014-10-07-fall-2014-practice-6-summary.md index c86478d..463a370 100644 --- a/_posts/_archive/2014-10-07-fall-2014-practice-6-summary.md +++ b/_posts/_archive/2014-10-07-fall-2014-practice-6-summary.md @@ -1,21 +1,21 @@ ---- -layout: post -category: practices -time: 8:00 PM -description: Summary of our sixth weekly practice of the Fall 2014 semester. ---- - -Today’s practice was less well-attended, so we spent a lot of time covering -basic graph concepts, such as the definition of a graph, how to represent it -in your code, interesting properties of graphs, and types of graphs. We -covered the basic graph (and grid) searching algorithms breadth-first search -(BFS) and depth-first search (DFS), and went over problem I from the second -tryout (available [here](http://domjudge.cs.illinois.edu/public/problem.php?id=tryTwoI)), -which requires the use of BFS. - -
- -At the next practice, we will be going over geometry problems, which always -appear at our regionals. We will go over basic geometry concepts as well as -techniques to solve computational geometry problems like the ones you might -see at regionals. As always, pizza will be provided. +--- +layout: post +category: practices +time: 8:00 PM +description: Summary of our sixth weekly practice of the Fall 2014 semester. +--- + +Today’s practice was less well-attended, so we spent a lot of time covering +basic graph concepts, such as the definition of a graph, how to represent it +in your code, interesting properties of graphs, and types of graphs. We +covered the basic graph (and grid) searching algorithms breadth-first search +(BFS) and depth-first search (DFS), and went over problem I from the second +tryout (available [here](http://domjudge.cs.illinois.edu/public/problem.php?id=tryTwoI)), +which requires the use of BFS. + +
+ +At the next practice, we will be going over geometry problems, which always +appear at our regionals. We will go over basic geometry concepts as well as +techniques to solve computational geometry problems like the ones you might +see at regionals. As always, pizza will be provided. diff --git a/_posts/_archive/2014-10-14-fall-2014-practice-7-summary.md b/_posts/_archive/2014-10-14-fall-2014-practice-7-summary.md index d853fed..c60cb32 100644 --- a/_posts/_archive/2014-10-14-fall-2014-practice-7-summary.md +++ b/_posts/_archive/2014-10-14-fall-2014-practice-7-summary.md @@ -1,44 +1,44 @@ ---- -layout: post -category: practices -time: 8:00 PM -description: Summary of our seventh weekly practice of the Fall 2014 semester. ---- - -At today's practice, we discussed basic geometry concepts and their relation -to ICPC-style problems. In particular, we covered basics of lines, circles, -and their intersections. We also discussed basic vector concepts and -operations, and their applications to ICPC-style problems. - -
- -In addition, we went over computational geometry problems that have appeared -at regionals in previous years. The problems we discussed included: - -
- -Medium difficulty (solution should not be too difficult): - - * [Crash and Go(relians)](http://mcicpc.cs.atu.edu/archives/2011/mcpc2011/crash/crash.html) - * [Cell Towers](http://mcicpc.cs.atu.edu/archives/2009/mcpc2009/cell/cell.html) - -
- -Hard (also good practice but will require significantly more effort): - - * [Line & Circle Maze](http://mcicpc.cs.atu.edu/archives/2008/mcpc2008/maze/maze.html) - * [Laser Tag](http://mcicpc.cs.atu.edu/archives/2011/mcpc2011/laser/laser.html) - -
- -For additional reference, you can find a deck of slides that describes the -concepts and algorithms at [this link](https://www.dropbox.com/s/ill6u28dfguzqn9/Lecture%207%20-%20Computational%20Geometry.pdf?dl=0). -We did not use this slide deck during today's practice, but it was used last year to -cover the same geometry concepts. - -
- -At next week's practice, we will go over dynamic programming (DP) in its -various forms and show how it can be used to solve certain types of problems. -Please attend, as using DP in competitions can be a tricky topic for many -people! As always, pizza will be provided. +--- +layout: post +category: practices +time: 8:00 PM +description: Summary of our seventh weekly practice of the Fall 2014 semester. +--- + +At today's practice, we discussed basic geometry concepts and their relation +to ICPC-style problems. In particular, we covered basics of lines, circles, +and their intersections. We also discussed basic vector concepts and +operations, and their applications to ICPC-style problems. + +
+ +In addition, we went over computational geometry problems that have appeared +at regionals in previous years. The problems we discussed included: + +
+ +Medium difficulty (solution should not be too difficult): + + * [Crash and Go(relians)](http://mcicpc.cs.atu.edu/archives/2011/mcpc2011/crash/crash.html) + * [Cell Towers](http://mcicpc.cs.atu.edu/archives/2009/mcpc2009/cell/cell.html) + +
+ +Hard (also good practice but will require significantly more effort): + + * [Line & Circle Maze](http://mcicpc.cs.atu.edu/archives/2008/mcpc2008/maze/maze.html) + * [Laser Tag](http://mcicpc.cs.atu.edu/archives/2011/mcpc2011/laser/laser.html) + +
+ +For additional reference, you can find a deck of slides that describes the +concepts and algorithms at [this link](https://www.dropbox.com/s/ill6u28dfguzqn9/Lecture%207%20-%20Computational%20Geometry.pdf?dl=0). +We did not use this slide deck during today's practice, but it was used last year to +cover the same geometry concepts. + +
+ +At next week's practice, we will go over dynamic programming (DP) in its +various forms and show how it can be used to solve certain types of problems. +Please attend, as using DP in competitions can be a tricky topic for many +people! As always, pizza will be provided. diff --git a/_posts/_archive/2014-10-20-regionals-updates.md b/_posts/_archive/2014-10-20-regionals-updates.md index 2387f74..9436678 100644 --- a/_posts/_archive/2014-10-20-regionals-updates.md +++ b/_posts/_archive/2014-10-20-regionals-updates.md @@ -1,17 +1,17 @@ ---- -layout: post -category: announcements -time: 8:00 AM -description: Exciting news about regionals teams! ---- - -We have some great news -- all five of our teams were accepted by the Mid-Central -regional director, which means that all of our teams will be able to attend the -regionals at the University of Chicago on November 1st! If you are on one of the -regionals teams, you should already be practicing. Make sure you are ready and have -compiled your reference materials before the competition. - -
- -If you are on one of the teams, we will be sending out more information about the -logistics of the regionals later this week. Good luck with your preparation! +--- +layout: post +category: announcements +time: 8:00 AM +description: Exciting news about regionals teams! +--- + +We have some great news -- all five of our teams were accepted by the Mid-Central +regional director, which means that all of our teams will be able to attend the +regionals at the University of Chicago on November 1st! If you are on one of the +regionals teams, you should already be practicing. Make sure you are ready and have +compiled your reference materials before the competition. + +
+ +If you are on one of the teams, we will be sending out more information about the +logistics of the regionals later this week. Good luck with your preparation! diff --git a/_posts/_archive/2014-10-21-fall-2014-practice-8-summary.md b/_posts/_archive/2014-10-21-fall-2014-practice-8-summary.md index 03f9453..26919d6 100644 --- a/_posts/_archive/2014-10-21-fall-2014-practice-8-summary.md +++ b/_posts/_archive/2014-10-21-fall-2014-practice-8-summary.md @@ -1,37 +1,37 @@ ---- -layout: post -category: practices -time: 8:00 PM -description: Summary of our eighth weekly practice of the Fall 2014 semester. ---- - -At today's practice, Jingbo gave a guest lecture on basic dynamic programming (DP) -problems using the slide deck available [here](https://www.dropbox.com/s/92ziliavshtn28s/Lecture%208%20-%20Dynamic%20Programming.pdf?dl=0). -Specifically, we went over the following major types of DP problems: - - * linear DP (e.g., the knapsack problem and its variations; example 1 in the slides) - * interval-based DP (example 3 in the slides) - * DP over trees (e.g., the minimum dominating set problem on a tree; example 4 in -the slides) - * DP over sets (examples 5 and 6 in the slides), and some tricks to efficiently -enumerate all possible subsets - -
- -In addition to the DP problems, we examined a problem that looked quite similar to -an example DP problem, but actually required the shortest path algorithm instead -(example 2 in the slides). - -
- -We have provided practice problems for you to try for most of the types of DP -problems. Please look at the [slide deck](https://www.dropbox.com/s/92ziliavshtn28s/Lecture%208%20-%20Dynamic%20Programming.pdf?dl=0) -for details. - -
- -Next week will be our last practice before Regionals. We will be rehashing contest -strategy and providing additional tricks for doing well at the competition. If time -allows, we will also cover some fundamental graph algorithms, including shortest -path and minimum spanning tree. If you are on a regionals team, please make sure -to attend! +--- +layout: post +category: practices +time: 8:00 PM +description: Summary of our eighth weekly practice of the Fall 2014 semester. +--- + +At today's practice, Jingbo gave a guest lecture on basic dynamic programming (DP) +problems using the slide deck available [here](https://www.dropbox.com/s/92ziliavshtn28s/Lecture%208%20-%20Dynamic%20Programming.pdf?dl=0). +Specifically, we went over the following major types of DP problems: + + * linear DP (e.g., the knapsack problem and its variations; example 1 in the slides) + * interval-based DP (example 3 in the slides) + * DP over trees (e.g., the minimum dominating set problem on a tree; example 4 in +the slides) + * DP over sets (examples 5 and 6 in the slides), and some tricks to efficiently +enumerate all possible subsets + +
+ +In addition to the DP problems, we examined a problem that looked quite similar to +an example DP problem, but actually required the shortest path algorithm instead +(example 2 in the slides). + +
+ +We have provided practice problems for you to try for most of the types of DP +problems. Please look at the [slide deck](https://www.dropbox.com/s/92ziliavshtn28s/Lecture%208%20-%20Dynamic%20Programming.pdf?dl=0) +for details. + +
+ +Next week will be our last practice before Regionals. We will be rehashing contest +strategy and providing additional tricks for doing well at the competition. If time +allows, we will also cover some fundamental graph algorithms, including shortest +path and minimum spanning tree. If you are on a regionals team, please make sure +to attend! diff --git a/_posts/_archive/2014-10-28-fall-2014-practice-9-summary.md b/_posts/_archive/2014-10-28-fall-2014-practice-9-summary.md index 7b3dd66..f8406a3 100644 --- a/_posts/_archive/2014-10-28-fall-2014-practice-9-summary.md +++ b/_posts/_archive/2014-10-28-fall-2014-practice-9-summary.md @@ -1,32 +1,32 @@ ---- -layout: post -category: practices -time: 8:00 PM -description: Summary of our ninth weekly practice of the Fall 2014 semester. ---- - -At today's practice, we went over contest strategy again, discussing some topics that -we were not able to cover at our previous contest strategy meeting. Specifically, we -went through how to read input from files (if it happens to be necessary) in all -three languages allowed in ICPC competitions (C, C++, and Java), revisited the -importance of triaging, talked about how to divide up problems between -teammates and make effective use of the computer, and introduced the concept of -analyzing the bounds on the problem to determine what algorithm complexities are -feasible. - -
- -As Regionals are upon us (this Saturday!), we also went over the contest environment -that will be available at Regionals and made sure all Regionals teams were prepared -with their reference material packets. - -
- -Next week will be our final meeting of the semester! We will have some fun, discuss -problems from the Regionals competition, and talk about how you can practice on your -own in the time that we are not meeting. We are also looking for people interested in -becoming part of the leadership of SIG-ICPC in the coming year, and more urgently, -for a chair for the SIG starting January who will be our liason to the ACM office. If -you are interested, please let Uttam know via e-mail (netid: thakore1) and come to -next week's meeting. - +--- +layout: post +category: practices +time: 8:00 PM +description: Summary of our ninth weekly practice of the Fall 2014 semester. +--- + +At today's practice, we went over contest strategy again, discussing some topics that +we were not able to cover at our previous contest strategy meeting. Specifically, we +went through how to read input from files (if it happens to be necessary) in all +three languages allowed in ICPC competitions (C, C++, and Java), revisited the +importance of triaging, talked about how to divide up problems between +teammates and make effective use of the computer, and introduced the concept of +analyzing the bounds on the problem to determine what algorithm complexities are +feasible. + +
+ +As Regionals are upon us (this Saturday!), we also went over the contest environment +that will be available at Regionals and made sure all Regionals teams were prepared +with their reference material packets. + +
+ +Next week will be our final meeting of the semester! We will have some fun, discuss +problems from the Regionals competition, and talk about how you can practice on your +own in the time that we are not meeting. We are also looking for people interested in +becoming part of the leadership of SIG-ICPC in the coming year, and more urgently, +for a chair for the SIG starting January who will be our liason to the ACM office. If +you are interested, please let Uttam know via e-mail (netid: thakore1) and come to +next week's meeting. + diff --git a/_posts/_archive/2014-10-28-regionals-are-upon-us!.md b/_posts/_archive/2014-10-28-regionals-are-upon-us!.md index 42f111e..61f5779 100644 --- a/_posts/_archive/2014-10-28-regionals-are-upon-us!.md +++ b/_posts/_archive/2014-10-28-regionals-are-upon-us!.md @@ -1,15 +1,15 @@ ---- -layout: post -category: announcements -time: 11:45 AM -description: The ICPC Mid-Central Regionals are this Saturday! ---- - -Good luck to all five teams who will be participating in the ACM ICPC Mid-Central -Regionals competition this Saturday at the University of Chicago! We wish them all -the best! - -
- -We will announce the results of the Regionals on this website as soon as the -contest is over on Saturday evening. +--- +layout: post +category: announcements +time: 11:45 AM +description: The ICPC Mid-Central Regionals are this Saturday! +--- + +Good luck to all five teams who will be participating in the ACM ICPC Mid-Central +Regionals competition this Saturday at the University of Chicago! We wish them all +the best! + +
+ +We will announce the results of the Regionals on this website as soon as the +contest is over on Saturday evening. diff --git a/_posts/_archive/2014-11-01-regionals-results.md b/_posts/_archive/2014-11-01-regionals-results.md index b585c1b..ca99a87 100644 --- a/_posts/_archive/2014-11-01-regionals-results.md +++ b/_posts/_archive/2014-11-01-regionals-results.md @@ -1,58 +1,58 @@ ---- -layout: post -category: announcements -time: 8:30 PM -description: Results from the 2014 ACM ICPC Mid-Central Regionals! ---- - -We had a stellar performance at regionals this year! There were over 150 teams -competing in our region this year, and we took 4 of the top 20 and 5 of the -top 30 spots, which is a great accomplishment! Out of the 9 total problems, -team Quadrature Rules solved 8 problems, placing 3rd in the region. Teams -Arimura-Arikawa-Kasai-Lee-Park, A*, and Brute Force solved 6 problems each, -placing 15th, 16th, and 17th in the region, and team Bogosort solved 5 to -place 29. Congratulations to all of our teams for an amazing job! - -
- -This year's regionals were quite a nail-biter. Going into the last hour, -Quadrature Rules had 6 of 9 problems, IIT and UChicago had 7, and Northwestern -had 8. It was pretty clear that 8 problems would be needed to land a spot in -the top 3 and qualify for World Finals, but it wasn't clear which three teams -would make it. The team really worked furiously during that last hour, solving -2 more problems and taking 3rd place. Their last solve was just 3 minutes -before the end of the contest! - -
- -Historically, the top 3 teams from our region are invited to the World Finals -competition. While it hasn't yet been confirmed, there is a strong chance that -team Quadrature Rules will be invited to represent UIUC and the Mid-Central -region at the World Finals this May in Morocco! Congratulations to the members -of team Quadrature Rules, Timothy Smith, Mike Seo, and Ruihan Shan! - -
- -I really want to thank all of the people who helped things go as smoothly as -they did this semester. Mike Seo, Timothy Smith, and Jingbo Shang all did a -tremendous job in helping to lead the practices and prepare our students for -the regionals. Most of the pizza at the meetings would not have been possible -without Yong Hong’s help in coordinating with the ACM. And of course, our -faculty advisor Darko Marinov helped out immensely behind the scenes, helping -us get funding and making sure we didn’t hit any hiccups in getting our judge -server, website, room reservations, or transportation to the regionals. - -
- -We will be having our final meeting of the Fall semester on Tuesday from 6-8 -PM in 0218 Siebel Center. We will spend some time going over the regionals -problems and taking feedback on the practices this semester, which we will use -going forward. - -
- -Thanks again to everyone for a great semester! - -
- --Uttam +--- +layout: post +category: announcements +time: 8:30 PM +description: Results from the 2014 ACM ICPC Mid-Central Regionals! +--- + +We had a stellar performance at regionals this year! There were over 150 teams +competing in our region this year, and we took 4 of the top 20 and 5 of the +top 30 spots, which is a great accomplishment! Out of the 9 total problems, +team Quadrature Rules solved 8 problems, placing 3rd in the region. Teams +Arimura-Arikawa-Kasai-Lee-Park, A*, and Brute Force solved 6 problems each, +placing 15th, 16th, and 17th in the region, and team Bogosort solved 5 to +place 29. Congratulations to all of our teams for an amazing job! + +
+ +This year's regionals were quite a nail-biter. Going into the last hour, +Quadrature Rules had 6 of 9 problems, IIT and UChicago had 7, and Northwestern +had 8. It was pretty clear that 8 problems would be needed to land a spot in +the top 3 and qualify for World Finals, but it wasn't clear which three teams +would make it. The team really worked furiously during that last hour, solving +2 more problems and taking 3rd place. Their last solve was just 3 minutes +before the end of the contest! + +
+ +Historically, the top 3 teams from our region are invited to the World Finals +competition. While it hasn't yet been confirmed, there is a strong chance that +team Quadrature Rules will be invited to represent UIUC and the Mid-Central +region at the World Finals this May in Morocco! Congratulations to the members +of team Quadrature Rules, Timothy Smith, Mike Seo, and Ruihan Shan! + +
+ +I really want to thank all of the people who helped things go as smoothly as +they did this semester. Mike Seo, Timothy Smith, and Jingbo Shang all did a +tremendous job in helping to lead the practices and prepare our students for +the regionals. Most of the pizza at the meetings would not have been possible +without Yong Hong’s help in coordinating with the ACM. And of course, our +faculty advisor Darko Marinov helped out immensely behind the scenes, helping +us get funding and making sure we didn’t hit any hiccups in getting our judge +server, website, room reservations, or transportation to the regionals. + +
+ +We will be having our final meeting of the Fall semester on Tuesday from 6-8 +PM in 0218 Siebel Center. We will spend some time going over the regionals +problems and taking feedback on the practices this semester, which we will use +going forward. + +
+ +Thanks again to everyone for a great semester! + +
+ +-Uttam diff --git a/_posts/_archive/2014-11-04-fall-2014-practice-10-summary.md b/_posts/_archive/2014-11-04-fall-2014-practice-10-summary.md index 6396a86..da094a8 100644 --- a/_posts/_archive/2014-11-04-fall-2014-practice-10-summary.md +++ b/_posts/_archive/2014-11-04-fall-2014-practice-10-summary.md @@ -1,43 +1,43 @@ ---- -layout: post -category: practices -time: 8:00 PM -description: Summary of our tenth weekly practice of the Fall 2014 semester. ---- - -At today's meeting, we went over the Regionals problems and explained the solutions. -The problems, input and output, and the judges' code are all available on the -Mid-Central's ICPC website under the Archives section. - -
- -Today's meeting is the last for this semester. As such, in order to make sure that -everyone can continue to practice on their own over the break, we showed how to log -into the TopCoder Arena and use the practice rooms. We encourage everyone to both -practice using the TopCoder Arena practice rooms (this is also where you can practice -solving any of the TopCoder problems we have assigned during practices) and -participate in the TopCoder Single Round Matches (SRMs) that occur once every two -weeks or so. The schedule of TopCoder SRMs is provided on our calendar. - -
- -Finally, we are looking for new officers for SIG-ICPC! Our current ACM liaison/vice -chair, Yong Hong, is graduating this semester, and we need someone to take his place -in the spring. We are also looking for students who are interested in taking the -positions of team captain, which involves leading some of the practices and -encouraging students to participate actively, and treasurer, which involves managing -the finances of the SIG. If you are interested in any of the positions and are -willing to dedicate the time required to do a good job, please e-mail Uttam (netid: -thakore1) immediately! - -
- -Regular SIG-ICPC meetings will pick back up in the Spring, so keep your eyes peeled -for an e-mail on the ICPC mailing list. In the meantime, keep practicing on your own -using SPOJ, TopCoder SRMs, Codeforces, and any of the other practice resources that -are listed on our Learn page. - -
- -Have a great remainder of the semester and holiday break, and -happy coding! +--- +layout: post +category: practices +time: 8:00 PM +description: Summary of our tenth weekly practice of the Fall 2014 semester. +--- + +At today's meeting, we went over the Regionals problems and explained the solutions. +The problems, input and output, and the judges' code are all available on the +Mid-Central's ICPC website under the Archives section. + +
+ +Today's meeting is the last for this semester. As such, in order to make sure that +everyone can continue to practice on their own over the break, we showed how to log +into the TopCoder Arena and use the practice rooms. We encourage everyone to both +practice using the TopCoder Arena practice rooms (this is also where you can practice +solving any of the TopCoder problems we have assigned during practices) and +participate in the TopCoder Single Round Matches (SRMs) that occur once every two +weeks or so. The schedule of TopCoder SRMs is provided on our calendar. + +
+ +Finally, we are looking for new officers for SIG-ICPC! Our current ACM liaison/vice +chair, Yong Hong, is graduating this semester, and we need someone to take his place +in the spring. We are also looking for students who are interested in taking the +positions of team captain, which involves leading some of the practices and +encouraging students to participate actively, and treasurer, which involves managing +the finances of the SIG. If you are interested in any of the positions and are +willing to dedicate the time required to do a good job, please e-mail Uttam (netid: +thakore1) immediately! + +
+ +Regular SIG-ICPC meetings will pick back up in the Spring, so keep your eyes peeled +for an e-mail on the ICPC mailing list. In the meantime, keep practicing on your own +using SPOJ, TopCoder SRMs, Codeforces, and any of the other practice resources that +are listed on our Learn page. + +
+ +Have a great remainder of the semester and holiday break, and +happy coding! diff --git a/_posts/_archive/2015-01-22-welcome-back!.md b/_posts/_archive/2015-01-22-welcome-back!.md index c8fb14c..fa2fca8 100644 --- a/_posts/_archive/2015-01-22-welcome-back!.md +++ b/_posts/_archive/2015-01-22-welcome-back!.md @@ -1,32 +1,32 @@ ---- -layout: post -category: announcements -time: 8:00 PM -description: Information about the Spring 2015 practice schedule. ---- - -Welcome back from winter break! We will be starting back up for the spring semester -next week on Tuesday, January 27th from 6-8 PM in 0218 Siebel center (in the -basement). - -
- -Our practices this semester will be held on Tuesdays from 6-8 PM, but there -will be some deviations from this schedule from time to time. Keep checking our -calendar throughout the semester for all up-to-date official practice and meeting -information. - -
- -This semester, our practices will be designed to teach you how to solve -algorithmic programming problems of different varieties at different difficulty -levels. Unlike the fall semester, we will not be training for a specific contest, so -the practices will be much more -hands-on and geared to everyone's individual skill levels. If you were deterred from -our practices last semester due to the pace, you should find our practices this -semester more approachable and valuable. - -
- -We look forward to seeing everyone at our meeting next Tuesday! Don't forget to -invite your friends! +--- +layout: post +category: announcements +time: 8:00 PM +description: Information about the Spring 2015 practice schedule. +--- + +Welcome back from winter break! We will be starting back up for the spring semester +next week on Tuesday, January 27th from 6-8 PM in 0218 Siebel center (in the +basement). + +
+ +Our practices this semester will be held on Tuesdays from 6-8 PM, but there +will be some deviations from this schedule from time to time. Keep checking our +calendar throughout the semester for all up-to-date official practice and meeting +information. + +
+ +This semester, our practices will be designed to teach you how to solve +algorithmic programming problems of different varieties at different difficulty +levels. Unlike the fall semester, we will not be training for a specific contest, so +the practices will be much more +hands-on and geared to everyone's individual skill levels. If you were deterred from +our practices last semester due to the pace, you should find our practices this +semester more approachable and valuable. + +
+ +We look forward to seeing everyone at our meeting next Tuesday! Don't forget to +invite your friends! diff --git a/_posts/_archive/2015-01-27-spring-2015-practice-1-summary.md b/_posts/_archive/2015-01-27-spring-2015-practice-1-summary.md index abc1556..6a1f82d 100644 --- a/_posts/_archive/2015-01-27-spring-2015-practice-1-summary.md +++ b/_posts/_archive/2015-01-27-spring-2015-practice-1-summary.md @@ -1,49 +1,49 @@ ---- -layout: post -category: practices -time: 8:00 PM -description: Summary of our first weekly practice of the Spring 2015 semester. ---- - -In today's practice, we welcomed some new students and practiced some -problems from previous regionals competitions. Here is the list of -problems from the practice: - - * [Word Cloud, Problem E from 2014's regional](http://mcicpc.cs.atu.edu/archives/2014/mcpc2014/cloud/cloud.html) - * [Sokoban, Problem G from 2011's regional](http://mcicpc.cs.atu.edu/archives/2011/mcpc2011/sokoban/sokoban.html) - -
- -If you weren't able to finish solving the problems at the practice, we -encourage you to attempt to get the problem correct on your own before -looking at the judges' solutions. If you are getting stuck on a test case, -try working out the example on paper to see if you can find the bug in -your code. - -
- -Once you feel that you have solved the problem, try running your code on -the judge data available [here](http://mcicpc.cs.atu.edu/archives/2014/mcpc2014/cloud/io.html) -for Word Cloud and [here](http://mcicpc.cs.atu.edu/archives/2011/mcpc2011/sokoban/io.html) -for Sokoban. Try first to debug your code without looking at the specific -test cases on which you failed. If you get stuck, feel free to e-mail -[the mailing list](mailto:icpc-l@acm.uiuc.edu) or Uttam (netid: [thakore1](mailto:thakore1@illinois.edu)). -Try to solve both problems if you can! - -
- -At the end of the meeting, we also took a poll on the topics you are -interested in learning about this semester. We will be releasing the -practice schedule soon. Keep posted on the website for details! - -
- -Next Tuesday, we will be having a special repeat of this meeting for -those who just learned of ICPC through the ACM open house. We will be -covering the same information. If you attended this week's meeting, -you don't need to attend next week's. Regular meetings will resume -the following week. - -
- -Happy coding! +--- +layout: post +category: practices +time: 8:00 PM +description: Summary of our first weekly practice of the Spring 2015 semester. +--- + +In today's practice, we welcomed some new students and practiced some +problems from previous regionals competitions. Here is the list of +problems from the practice: + + * [Word Cloud, Problem E from 2014's regional](http://mcicpc.cs.atu.edu/archives/2014/mcpc2014/cloud/cloud.html) + * [Sokoban, Problem G from 2011's regional](http://mcicpc.cs.atu.edu/archives/2011/mcpc2011/sokoban/sokoban.html) + +
+ +If you weren't able to finish solving the problems at the practice, we +encourage you to attempt to get the problem correct on your own before +looking at the judges' solutions. If you are getting stuck on a test case, +try working out the example on paper to see if you can find the bug in +your code. + +
+ +Once you feel that you have solved the problem, try running your code on +the judge data available [here](http://mcicpc.cs.atu.edu/archives/2014/mcpc2014/cloud/io.html) +for Word Cloud and [here](http://mcicpc.cs.atu.edu/archives/2011/mcpc2011/sokoban/io.html) +for Sokoban. Try first to debug your code without looking at the specific +test cases on which you failed. If you get stuck, feel free to e-mail +[the mailing list](mailto:icpc-l@acm.uiuc.edu) or Uttam (netid: [thakore1](mailto:thakore1@illinois.edu)). +Try to solve both problems if you can! + +
+ +At the end of the meeting, we also took a poll on the topics you are +interested in learning about this semester. We will be releasing the +practice schedule soon. Keep posted on the website for details! + +
+ +Next Tuesday, we will be having a special repeat of this meeting for +those who just learned of ICPC through the ACM open house. We will be +covering the same information. If you attended this week's meeting, +you don't need to attend next week's. Regular meetings will resume +the following week. + +
+ +Happy coding! diff --git a/_posts/_archive/2015-01-27-spring-2015-practice-info.md b/_posts/_archive/2015-01-27-spring-2015-practice-info.md index 8442354..16c47fb 100644 --- a/_posts/_archive/2015-01-27-spring-2015-practice-info.md +++ b/_posts/_archive/2015-01-27-spring-2015-practice-info.md @@ -1,19 +1,19 @@ ---- -layout: post -category: announcements -time: 8:00 PM -description: Updates on the Spring 2015 practice schedule. ---- - -As mentioned at last Tuesday's meeting, this semester, our practices will be -more hands-on. We plan to release problemsets the week before a practice, -which you can work on individually or collaboratively. At the following -practice, we will go over the topic, potentially working through an example -problem. We will then open the practice to questions and discussion, at which -point you can continue working on the problems or get help from one of the -practice leaders. - -
- -We will release the schedule for this semester's practices sometime within the -next week or two. Keep posted here for updates! +--- +layout: post +category: announcements +time: 8:00 PM +description: Updates on the Spring 2015 practice schedule. +--- + +As mentioned at last Tuesday's meeting, this semester, our practices will be +more hands-on. We plan to release problemsets the week before a practice, +which you can work on individually or collaboratively. At the following +practice, we will go over the topic, potentially working through an example +problem. We will then open the practice to questions and discussion, at which +point you can continue working on the problems or get help from one of the +practice leaders. + +
+ +We will release the schedule for this semester's practices sometime within the +next week or two. Keep posted here for updates! diff --git a/_posts/_archive/2015-02-03-spring-2015-practice-2-summary.md b/_posts/_archive/2015-02-03-spring-2015-practice-2-summary.md index e9312b8..de8e310 100644 --- a/_posts/_archive/2015-02-03-spring-2015-practice-2-summary.md +++ b/_posts/_archive/2015-02-03-spring-2015-practice-2-summary.md @@ -1,65 +1,65 @@ ---- -layout: post -category: practices -time: 8:00 PM -description: Summary of our first weekly practice of the Spring 2015 semester. ---- - -At today's practice, we introduced SIG-ICPC and the ACM ICPC competition, in which we -compete each year. The competition is structured into a Regionals competition in -November and a World Finals competition around May. Only the top 3 teams in our -region (at most 1 from UIUC) can advance to the World Finals competition each year. -We take between 4 and 6 teams of 3 students each to Regionals each year, so we hold -individual tryouts for the regionals teams in September. - -
- -We also went over some sample problems and practiced a couple during the meeting. We -first went through [Lampyridae Teleportae, Problem B from 2008's Mid-Central regional](https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=334&page=show_problem&problem=2169) -and discussed how to break down an ICPC problem and understand the requirements. We -then practiced the following problems: - - * [Reverse Rot, Problem G from 2014's regional](https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=662&page=show_problem&problem=4830) - * [Word Cloud, Problem E from 2014's regional](https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=662&page=show_problem&problem=4828) - -
- -NOTE: In order to practice these problems, you will need to [create an account](https://icpcarchive.ecs.baylor.edu/index.php?option=com_comprofiler&task=registers) -on the ACM-ICPC Live Archive. To submit a solution for judging, click on the 'Submit' -link in the top right hand corner of the page and copy-paste your code into the -submission box (Java users will need to name their class 'Main'). Your program should -use standard input/output. - -
- -If you weren't able to finish solving the problems at the practice, we encourage you -to attempt to get the problem correct on your own before looking for the official -solutions. If you are getting stuck on a test case, try working out the example on -paper to see if you can find the bug in your code or way of thinking. - -
- -IMPORTANT: At the end of practice, we had everyone register for the -[Sphere Online Judge](http://www.spoj.com), [University of Valladoid Online Judge](http://uva.onlinejudge.org), -and [TopCoder](http://www.topcoder.com/tc). Please make sure you register for all -three of these online judges in addition to the ACM-ICPC Live Archive given above, -as you will need accounts on these sites for the practices. - -
- -Once you have registered, please add your username information [here](http://goo.gl/forms/s65PX7rPps). - -
- -Next week, Mike Seo will be covering basic dynamic programming (DP) problems. The -problemset is available in the Announcements section of the website, in [this](/announcements/2015/02/04/practice-problems-for-the-week-of-feb-03.html) -post. Please attempt as many of these problems as you can on your own before coming -to practice, as we will not be going over all of the problems there. Instead, at the -practice, Mike will give a short overview of DP problems, go over a problem or two, -and answer any questions you may have. You can also use the practice time to discuss -solutions with other SIG-ICPC members. - -
- -We look forward to seeing everyone at next week's meeting. Until then, happy -coding! +--- +layout: post +category: practices +time: 8:00 PM +description: Summary of our first weekly practice of the Spring 2015 semester. +--- + +At today's practice, we introduced SIG-ICPC and the ACM ICPC competition, in which we +compete each year. The competition is structured into a Regionals competition in +November and a World Finals competition around May. Only the top 3 teams in our +region (at most 1 from UIUC) can advance to the World Finals competition each year. +We take between 4 and 6 teams of 3 students each to Regionals each year, so we hold +individual tryouts for the regionals teams in September. + +
+ +We also went over some sample problems and practiced a couple during the meeting. We +first went through [Lampyridae Teleportae, Problem B from 2008's Mid-Central regional](https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=334&page=show_problem&problem=2169) +and discussed how to break down an ICPC problem and understand the requirements. We +then practiced the following problems: + + * [Reverse Rot, Problem G from 2014's regional](https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=662&page=show_problem&problem=4830) + * [Word Cloud, Problem E from 2014's regional](https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=662&page=show_problem&problem=4828) + +
+ +NOTE: In order to practice these problems, you will need to [create an account](https://icpcarchive.ecs.baylor.edu/index.php?option=com_comprofiler&task=registers) +on the ACM-ICPC Live Archive. To submit a solution for judging, click on the 'Submit' +link in the top right hand corner of the page and copy-paste your code into the +submission box (Java users will need to name their class 'Main'). Your program should +use standard input/output. + +
+ +If you weren't able to finish solving the problems at the practice, we encourage you +to attempt to get the problem correct on your own before looking for the official +solutions. If you are getting stuck on a test case, try working out the example on +paper to see if you can find the bug in your code or way of thinking. + +
+ +IMPORTANT: At the end of practice, we had everyone register for the +[Sphere Online Judge](http://www.spoj.com), [University of Valladoid Online Judge](http://uva.onlinejudge.org), +and [TopCoder](http://www.topcoder.com/tc). Please make sure you register for all +three of these online judges in addition to the ACM-ICPC Live Archive given above, +as you will need accounts on these sites for the practices. + +
+ +Once you have registered, please add your username information [here](http://goo.gl/forms/s65PX7rPps). + +
+ +Next week, Mike Seo will be covering basic dynamic programming (DP) problems. The +problemset is available in the Announcements section of the website, in [this](/announcements/2015/02/04/practice-problems-for-the-week-of-feb-03.html) +post. Please attempt as many of these problems as you can on your own before coming +to practice, as we will not be going over all of the problems there. Instead, at the +practice, Mike will give a short overview of DP problems, go over a problem or two, +and answer any questions you may have. You can also use the practice time to discuss +solutions with other SIG-ICPC members. + +
+ +We look forward to seeing everyone at next week's meeting. Until then, happy +coding! diff --git a/_posts/_archive/2015-02-04-practice-problems-for-the-week-of-feb-03.md b/_posts/_archive/2015-02-04-practice-problems-for-the-week-of-feb-03.md index 55aeb08..8b7c8ee 100644 --- a/_posts/_archive/2015-02-04-practice-problems-for-the-week-of-feb-03.md +++ b/_posts/_archive/2015-02-04-practice-problems-for-the-week-of-feb-03.md @@ -1,46 +1,46 @@ ---- -layout: post -category: announcements -time: 8:00 PM -description: Here are the practice problems for next week's practice! ---- - -Next week (February 10th), Mike Seo will be holding a practice on simple dynamic -programming problems. He will be referring to the following problemset: - - * [Bytelandian Coins](http://www.spoj.com/problems/COINS/) - * [Coin Change](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=615) - * [What Goes Up](http://uva.onlinejudge.org/external/4/481.html) - * [Party Schedule](http://www.spoj.com/problems/PARTY/) - * [Edit Distance](http://www.spoj.com/problems/EDIST/) - * [Chop Ahoy! Revisited](http://www.spoj.com/problems/ANARC05H/) - * [Partitioning by Palindromes](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=show_problem&problem=2631) - * [Wavio Sequence](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=show_problem&problem=1475) - * [The Tower of Babylon](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=show_problem&problem=378) - * [Scheduling Lectures](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=show_problem&problem=383) - * [The Priest Mathematician](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=show_problem&problem=548) - * [Raucous Rockers](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=show_problem&problem=1195) - * [Matrix Chain Multiplication](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=show_problem&problem=414) - * [Fewest Flops](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=show_problem&problem=2547) - -
- -Attempt these problems before next week's practice. Going forward, as mentioned in -[last week's announcement](/announcements/2015/01/27/spring-2015-practice-info.html) -and [this week's practice summary](/practices/2015/02/03/spring-2015-practice-2-summary.html), -we will be releasing problem sets like this one at the end of a practice for you to -work on until the following practice. - -
- -The problems above are listed roughly in increasing order of difficulty, so start -with the first problem and work your way down the list if you are unfamiliar with -dynamic programming problems. For your reference, there is a dynamic programming -section in the Competitive Programming book by Steven Halim, available [here](http://www.comp.nus.edu.sg/~stevenha/myteaching/competitive_programming/cp1.pdf), -and a tutorial on DP on TopCoder, available [here](http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=dynProg). - -
- -Come to next week's practice with your code and questions for Mike. You will not gain -as much coming empty-handed as you will if you at least attempt the problems before -the practice! +--- +layout: post +category: announcements +time: 8:00 PM +description: Here are the practice problems for next week's practice! +--- + +Next week (February 10th), Mike Seo will be holding a practice on simple dynamic +programming problems. He will be referring to the following problemset: + + * [Bytelandian Coins](http://www.spoj.com/problems/COINS/) + * [Coin Change](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=615) + * [What Goes Up](http://uva.onlinejudge.org/external/4/481.html) + * [Party Schedule](http://www.spoj.com/problems/PARTY/) + * [Edit Distance](http://www.spoj.com/problems/EDIST/) + * [Chop Ahoy! Revisited](http://www.spoj.com/problems/ANARC05H/) + * [Partitioning by Palindromes](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=show_problem&problem=2631) + * [Wavio Sequence](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=show_problem&problem=1475) + * [The Tower of Babylon](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=show_problem&problem=378) + * [Scheduling Lectures](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=show_problem&problem=383) + * [The Priest Mathematician](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=show_problem&problem=548) + * [Raucous Rockers](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=show_problem&problem=1195) + * [Matrix Chain Multiplication](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=show_problem&problem=414) + * [Fewest Flops](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=show_problem&problem=2547) + +
+ +Attempt these problems before next week's practice. Going forward, as mentioned in +[last week's announcement](/announcements/2015/01/27/spring-2015-practice-info.html) +and [this week's practice summary](/practices/2015/02/03/spring-2015-practice-2-summary.html), +we will be releasing problem sets like this one at the end of a practice for you to +work on until the following practice. + +
+ +The problems above are listed roughly in increasing order of difficulty, so start +with the first problem and work your way down the list if you are unfamiliar with +dynamic programming problems. For your reference, there is a dynamic programming +section in the Competitive Programming book by Steven Halim, available [here](http://www.comp.nus.edu.sg/~stevenha/myteaching/competitive_programming/cp1.pdf), +and a tutorial on DP on TopCoder, available [here](http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=dynProg). + +
+ +Come to next week's practice with your code and questions for Mike. You will not gain +as much coming empty-handed as you will if you at least attempt the problems before +the practice! diff --git a/_posts/_archive/2015-02-10-spring-2015-practice-3-summary.md b/_posts/_archive/2015-02-10-spring-2015-practice-3-summary.md index 8eafef9..1e2cf71 100644 --- a/_posts/_archive/2015-02-10-spring-2015-practice-3-summary.md +++ b/_posts/_archive/2015-02-10-spring-2015-practice-3-summary.md @@ -1,36 +1,36 @@ ---- -layout: post -category: practices -time: 8:00 PM -description: Summary of our third weekly practice of the Spring 2015 semester. ---- - -In today's practice, we briefly went over what dynamic programming is and solved two -simple dynamic programming problems: coin change and longest increasing subsequence. -We solved two versions of coin change: minimization and counting. After that, we had -a free practice session for another hour. The problems for the practice are available -[here](/announcements/2015/02/04/practice-problems-for-the-week-of-feb-03.html); if -you haven't already, try to solve as many of them as you can. - -
- -As we mentioned at the end of today's practice, next week, we will be having a -special practice in which we guide you through a TopCoder single round match (SRM). -TopCoder can be a great practice resource, so if you haven’t already started using -it, we encourage you to attend the practice to get familiarized with the contest -arena and competition format. TopCoder is also rated, so you can see how well you -fare in a competitive environment and try to boost your skills through regular -participation in SRMs. - -
- -Note: The SRM we will be participating in starts at 8 PM and runs until 9:45, -so we will be meeting at 7 PM instead of the usual 6. See our [calendar](/calendar.html) -for the correct meeting information for the practice. We will spend the first hour -going over the competition arena and doing a practice problem together, then start -the SRM promptly at 8 PM. You must register to compete in the SRM, so make sure to -arrive by 7:30 at the latest if you want to participate! - -
- -Happy coding! +--- +layout: post +category: practices +time: 8:00 PM +description: Summary of our third weekly practice of the Spring 2015 semester. +--- + +In today's practice, we briefly went over what dynamic programming is and solved two +simple dynamic programming problems: coin change and longest increasing subsequence. +We solved two versions of coin change: minimization and counting. After that, we had +a free practice session for another hour. The problems for the practice are available +[here](/announcements/2015/02/04/practice-problems-for-the-week-of-feb-03.html); if +you haven't already, try to solve as many of them as you can. + +
+ +As we mentioned at the end of today's practice, next week, we will be having a +special practice in which we guide you through a TopCoder single round match (SRM). +TopCoder can be a great practice resource, so if you haven’t already started using +it, we encourage you to attend the practice to get familiarized with the contest +arena and competition format. TopCoder is also rated, so you can see how well you +fare in a competitive environment and try to boost your skills through regular +participation in SRMs. + +
+ +Note: The SRM we will be participating in starts at 8 PM and runs until 9:45, +so we will be meeting at 7 PM instead of the usual 6. See our [calendar](/calendar.html) +for the correct meeting information for the practice. We will spend the first hour +going over the competition arena and doing a practice problem together, then start +the SRM promptly at 8 PM. You must register to compete in the SRM, so make sure to +arrive by 7:30 at the latest if you want to participate! + +
+ +Happy coding! diff --git a/_posts/_archive/2015-02-17-practice-problems-for-the-week-of-feb-17.md b/_posts/_archive/2015-02-17-practice-problems-for-the-week-of-feb-17.md index 5c48f57..49ba1cf 100644 --- a/_posts/_archive/2015-02-17-practice-problems-for-the-week-of-feb-17.md +++ b/_posts/_archive/2015-02-17-practice-problems-for-the-week-of-feb-17.md @@ -1,48 +1,48 @@ ---- -layout: post -category: announcements -time: 6:30 PM -description: Here are the practice problems for next week's practice! ---- - -Next week (February 23rd), Timothy Smith will be holding a practice on graph search -problems (breadth-first search and depth-first search). He will be referring to the -following problemset: - -
- -BFS: - - * [Word Transformation](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=370) - * [Spreading the News](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=865) - * [Bombs! NO they are Mines!!](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1594) - * [Robot](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=250) - * [Mall Mania](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2042) - * [Unlock the Lock](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=3312) - -
- -DFS: - - * [Knight in a War Grid](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=3057) - * [Battleships](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=3104) - * [Continents](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2035) - * [Ordering Tasks](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1246) - * [Ordering](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=813) - -
- -Attempt these problems before next week's practice. The problems within each category -are listed somewhat in increasing order of difficulty, so start -with the first problems and work your way down the lists if you are unfamiliar with -graph search problems. For your reference, graph search is covered in sections 4.2 -and 4.3 of the Competitive Programming book by Steven Halim, available [here](http://www.comp.nus.edu.sg/~stevenha/myteaching/competitive_programming/cp1.pdf), -and a [graph tutorial](http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=graphsDataStrucs1) -and [graph search tutorial](http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=graphsDataStrucs2) -are available on TopCoder. - -
- -Come to next week's practice with your code and questions for Timothy. You will not gain -as much coming empty-handed as you will if you at least attempt the problems before -the practice! +--- +layout: post +category: announcements +time: 6:30 PM +description: Here are the practice problems for next week's practice! +--- + +Next week (February 23rd), Timothy Smith will be holding a practice on graph search +problems (breadth-first search and depth-first search). He will be referring to the +following problemset: + +
+ +BFS: + + * [Word Transformation](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=370) + * [Spreading the News](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=865) + * [Bombs! NO they are Mines!!](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1594) + * [Robot](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=250) + * [Mall Mania](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2042) + * [Unlock the Lock](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=3312) + +
+ +DFS: + + * [Knight in a War Grid](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=3057) + * [Battleships](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=3104) + * [Continents](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2035) + * [Ordering Tasks](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1246) + * [Ordering](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=813) + +
+ +Attempt these problems before next week's practice. The problems within each category +are listed somewhat in increasing order of difficulty, so start +with the first problems and work your way down the lists if you are unfamiliar with +graph search problems. For your reference, graph search is covered in sections 4.2 +and 4.3 of the Competitive Programming book by Steven Halim, available [here](http://www.comp.nus.edu.sg/~stevenha/myteaching/competitive_programming/cp1.pdf), +and a [graph tutorial](http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=graphsDataStrucs1) +and [graph search tutorial](http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=graphsDataStrucs2) +are available on TopCoder. + +
+ +Come to next week's practice with your code and questions for Timothy. You will not gain +as much coming empty-handed as you will if you at least attempt the problems before +the practice! diff --git a/_posts/_archive/2015-02-17-spring-2015-practice-4-summary.md b/_posts/_archive/2015-02-17-spring-2015-practice-4-summary.md index 215ca44..f3691d0 100644 --- a/_posts/_archive/2015-02-17-spring-2015-practice-4-summary.md +++ b/_posts/_archive/2015-02-17-spring-2015-practice-4-summary.md @@ -1,40 +1,40 @@ ---- -layout: post -category: practices -time: 8:00 PM -description: Summary of our fourth weekly practice of the Spring 2015 semester. ---- - -In today's practice, -we went over the TopCoder Arena and competing in a TopCoder SRM. We discussed how to -launch the arena and enter contests, how to use the practice rooms to practice old -TopCoder contest problems, and how single round matches (SRMs) are structured. We -then competed in SRM 650 together. At the end of the SRM, all new members received -TopCoder ratings! Congratulations to everyone who participated in the SRM for a great -performance! - -
- -We encourage everyone to register for TopCoder and use the practice rooms to practice, -even if you weren't able to make today's meeting. We also encourage you to participate -in upcoming SRMs on your own. All upcoming SRMs through the end of March have been -added to our [calendar](/calendar.html), so check it out and plan ahead. - -
- -Next week, Timothy Smith will be covering graph search (breadth-first search and -depth-first search) problems. The -problemset is available in the Announcements section of the website, in [this](/announcements/2015/02/17/practice-problems-for-the-week-of-feb-17.html) -post. Please attempt as many of these problems as you can on your own before coming -to practice, as we will not be going over all of the problems there. Instead, at the -practice, Timothy will give a short overview of graph search problems, go over a -problem or two, -and answer any questions you may have. You can also use the practice time to discuss -solutions with other SIG-ICPC members. - -
- -We look forward to seeing everyone at next week's meeting. Until then, happy -coding! - - +--- +layout: post +category: practices +time: 8:00 PM +description: Summary of our fourth weekly practice of the Spring 2015 semester. +--- + +In today's practice, +we went over the TopCoder Arena and competing in a TopCoder SRM. We discussed how to +launch the arena and enter contests, how to use the practice rooms to practice old +TopCoder contest problems, and how single round matches (SRMs) are structured. We +then competed in SRM 650 together. At the end of the SRM, all new members received +TopCoder ratings! Congratulations to everyone who participated in the SRM for a great +performance! + +
+ +We encourage everyone to register for TopCoder and use the practice rooms to practice, +even if you weren't able to make today's meeting. We also encourage you to participate +in upcoming SRMs on your own. All upcoming SRMs through the end of March have been +added to our [calendar](/calendar.html), so check it out and plan ahead. + +
+ +Next week, Timothy Smith will be covering graph search (breadth-first search and +depth-first search) problems. The +problemset is available in the Announcements section of the website, in [this](/announcements/2015/02/17/practice-problems-for-the-week-of-feb-17.html) +post. Please attempt as many of these problems as you can on your own before coming +to practice, as we will not be going over all of the problems there. Instead, at the +practice, Timothy will give a short overview of graph search problems, go over a +problem or two, +and answer any questions you may have. You can also use the practice time to discuss +solutions with other SIG-ICPC members. + +
+ +We look forward to seeing everyone at next week's meeting. Until then, happy +coding! + + diff --git a/_posts/_archive/2015-02-24-spring-2015-practice-5-summary.md b/_posts/_archive/2015-02-24-spring-2015-practice-5-summary.md index 86f8da7..76505bc 100644 --- a/_posts/_archive/2015-02-24-spring-2015-practice-5-summary.md +++ b/_posts/_archive/2015-02-24-spring-2015-practice-5-summary.md @@ -1,41 +1,41 @@ ---- -layout: post -category: practices -time: 8:00 PM -description: UPDATED! Summary of our fifth weekly practice of the Spring 2015 semester. ---- - -At today's practice, we discussed BFS and DFS, focusing on 4 of the problems from the -[practice set](/announcements/2015/02/17/practice-problems-for-the-week-of-feb-17.html), -which we went through in detail, including complete code. We discussed various -approaches to BFS/DFS and their advantages and disadvantages. We also answered -specific student questions and discussed some contest strategies. - -
- - -Next week, Uttam will be going over built-in data structures in Java and C++11 and -the language constructs and libraries you should know for programming competitions. -Problems will be posted by the end of the week. Until then, continue to work on any -of the problems you have not yet finished from the last 2 content practices. - - -
- -UPDATE (Feb 26 at 10 PM): - -Due to time constraints, Uttam will not be holding the built-in data structures -practice next week. -Instead, we will be having a collaborative problem solving session in which you can -work on the problems from the last 2 sessions together with other students in the -SIG. If you haven't yet finished solving all of the problems, this is a great way -to get help from others and share ideas on how to implement these kinds of problems -more efficiently. For your reference, the problemsets are available [here][1] and -[here][2]. - -
- -Happy coding! - -[1]:/announcements/2015/02/04/practice-problems-for-the-week-of-feb-03.html "Simple DP Problemset" -[2]:/announcements/2015/02/17/practice-problems-for-the-week-of-feb-17.html "Graph Search Problemset" +--- +layout: post +category: practices +time: 8:00 PM +description: UPDATED! Summary of our fifth weekly practice of the Spring 2015 semester. +--- + +At today's practice, we discussed BFS and DFS, focusing on 4 of the problems from the +[practice set](/announcements/2015/02/17/practice-problems-for-the-week-of-feb-17.html), +which we went through in detail, including complete code. We discussed various +approaches to BFS/DFS and their advantages and disadvantages. We also answered +specific student questions and discussed some contest strategies. + +
+ + +Next week, Uttam will be going over built-in data structures in Java and C++11 and +the language constructs and libraries you should know for programming competitions. +Problems will be posted by the end of the week. Until then, continue to work on any +of the problems you have not yet finished from the last 2 content practices. + + +
+ +UPDATE (Feb 26 at 10 PM): + +Due to time constraints, Uttam will not be holding the built-in data structures +practice next week. +Instead, we will be having a collaborative problem solving session in which you can +work on the problems from the last 2 sessions together with other students in the +SIG. If you haven't yet finished solving all of the problems, this is a great way +to get help from others and share ideas on how to implement these kinds of problems +more efficiently. For your reference, the problemsets are available [here][1] and +[here][2]. + +
+ +Happy coding! + +[1]:/announcements/2015/02/04/practice-problems-for-the-week-of-feb-03.html "Simple DP Problemset" +[2]:/announcements/2015/02/17/practice-problems-for-the-week-of-feb-17.html "Graph Search Problemset" diff --git a/_posts/_archive/2015-03-04-practice-problems-for-the-week-of-mar-03.md b/_posts/_archive/2015-03-04-practice-problems-for-the-week-of-mar-03.md index 7aba129..fa0373b 100644 --- a/_posts/_archive/2015-03-04-practice-problems-for-the-week-of-mar-03.md +++ b/_posts/_archive/2015-03-04-practice-problems-for-the-week-of-mar-03.md @@ -1,60 +1,60 @@ ---- -layout: post -category: announcements -time: 6:30 PM -description: Here are the practice problems for next week's practice! ---- - -Next week (March 10th), Timothy Smith will be holding a practice on simple -computational geometry problems. He will be referring to the following -problemset: - - * [Colourful Flowers][1] - * [Soya Milk][2] - * [The Grazing Cow][3] - * [Elevator][4] - * [Overlapping Rectangles][5] - * [Sunny Mountains][6] - * [Trash Removal][7] - * [The Sultan's Problem][8] - * [Bounding Box][9] - -
- -As always, attempt these problems before next week's practice. The problems -within each category are listed somewhat in increasing order of difficulty, -so start with the first problems and work your way down the lists if you are -unfamiliar with computational geometry problems. For your reference, -computational geometry is covered in chapter 7 of the Competitive Programming -book by Steven Halim, available [here][Halim], a series of wonderful geometry -tutorials (parts [1][TopCoder1], [2][TopCoder2], and [3][TopCoder3]) on -TopCoder, and a great [slide deck][CompGeomSlides] on the University of -Alberta's programming team website (you'll need to ignore the snark). - -
- -One important note: priority will be given at the practice to helping -students through any issues they have experienced while attempting to solve -the problems, so do not come to practice expecting a full lecture on -computational geometry concepts. Use the resources provided above and try -to solve the problems yourself before attending, as you will gain the -most from the practice by doing so! - -
- -Happy coding! - -[Halim]: http://www.comp.nus.edu.sg/~stevenha/myteaching/competitive_programming/cp1.pdf -[TopCoder1]: http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=geometry1 "TopCoder Tutorials -- Geometry Concepts: Basic Concepts" -[TopCoder2]: http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=geometry2 "TopCoder Tutorials -- Geometry Concepts: Line Intersection and its Applications" -[TopCoder3]: http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=geometry3 "TopCoder Tutorials -- Geometry Concepts: Using Geometry in TopCoder Problems" -[CompGeomSlides]: http://webdocs.cs.ualberta.ca/~contest/6-geometry.pdf -[1]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2093 -[2]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=3060 -[3]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1619 -[4]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2934 -[5]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=401 -[6]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=861 -[7]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=3552 -[8]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2232 -[9]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1518 +--- +layout: post +category: announcements +time: 6:30 PM +description: Here are the practice problems for next week's practice! +--- + +Next week (March 10th), Timothy Smith will be holding a practice on simple +computational geometry problems. He will be referring to the following +problemset: + + * [Colourful Flowers][1] + * [Soya Milk][2] + * [The Grazing Cow][3] + * [Elevator][4] + * [Overlapping Rectangles][5] + * [Sunny Mountains][6] + * [Trash Removal][7] + * [The Sultan's Problem][8] + * [Bounding Box][9] + +
+ +As always, attempt these problems before next week's practice. The problems +within each category are listed somewhat in increasing order of difficulty, +so start with the first problems and work your way down the lists if you are +unfamiliar with computational geometry problems. For your reference, +computational geometry is covered in chapter 7 of the Competitive Programming +book by Steven Halim, available [here][Halim], a series of wonderful geometry +tutorials (parts [1][TopCoder1], [2][TopCoder2], and [3][TopCoder3]) on +TopCoder, and a great [slide deck][CompGeomSlides] on the University of +Alberta's programming team website (you'll need to ignore the snark). + +
+ +One important note: priority will be given at the practice to helping +students through any issues they have experienced while attempting to solve +the problems, so do not come to practice expecting a full lecture on +computational geometry concepts. Use the resources provided above and try +to solve the problems yourself before attending, as you will gain the +most from the practice by doing so! + +
+ +Happy coding! + +[Halim]: http://www.comp.nus.edu.sg/~stevenha/myteaching/competitive_programming/cp1.pdf +[TopCoder1]: http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=geometry1 "TopCoder Tutorials -- Geometry Concepts: Basic Concepts" +[TopCoder2]: http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=geometry2 "TopCoder Tutorials -- Geometry Concepts: Line Intersection and its Applications" +[TopCoder3]: http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=geometry3 "TopCoder Tutorials -- Geometry Concepts: Using Geometry in TopCoder Problems" +[CompGeomSlides]: http://webdocs.cs.ualberta.ca/~contest/6-geometry.pdf +[1]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2093 +[2]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=3060 +[3]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1619 +[4]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2934 +[5]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=401 +[6]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=861 +[7]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=3552 +[8]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2232 +[9]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1518 diff --git a/_posts/_archive/2015-03-10-practice-problems-for-the-week-of-mar-10.md b/_posts/_archive/2015-03-10-practice-problems-for-the-week-of-mar-10.md index 4b6e5d8..5c6267b 100644 --- a/_posts/_archive/2015-03-10-practice-problems-for-the-week-of-mar-10.md +++ b/_posts/_archive/2015-03-10-practice-problems-for-the-week-of-mar-10.md @@ -1,67 +1,67 @@ ---- -layout: post -category: announcements -time: 6:30 PM -description: Here are the practice problems for next week's practice! ---- - -Next week (March 17th), Mike Seo will be holding a practice on -intermediate graph problems. He will be referring to the following -problemset: - -
- -Minimum/Maximum Spanning Trees: - - * [Freckles][1] - * [Heavy Cargo][2] - * [Re-connecting Computer Sites][3] - -Shortest path: - - * [Sending Email][4] - * [Fire Station][5] - * [Full Tank][6] - -Strongly Connected Components: - - * [Trust groups][7] - * [Dominos][8] - * [Lighting Away][9] - -
- -As always, attempt these problems before next week's practice. The problems -within each category are listed somewhat in increasing order of difficulty, -so start with the first problems and work your way down the lists. For mid- -central regional, it is essential for you to at least know how to solve MST and -shortest path problems. For your reference, MST and shortest path are covered -in chapter 4 of the Competitive Programming book by Steven Halim, available -[here][Halim]. Also check out a great [slide deck][StanfordGraph] on the Stanford University -competitive programming course covering various basic graph algorithms including SCC. -For sample codes, search on Google and find ones that are easy to understand for you. - -
- -One important note: priority will be given at the practice to helping -students through any issues they have experienced while attempting to solve -the problems, so do not come to practice expecting a full lecture on -computational geometry concepts. Use the resources provided above and try -to solve the problems yourself before attending, as you will gain the -most from the practice by doing so! - -
- -Happy coding! - -[Halim]: http://www.comp.nus.edu.sg/~stevenha/myteaching/competitive_programming/cp1.pdf -[StanfordGraph]: http://web.stanford.edu/class/cs97si/06-basic-graph-algorithms.pdf -[1]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=12&page=show_problem&problem=975 -[2]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=7&page=show_problem&problem=485 -[3]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=11&page=show_problem&problem=849 -[4]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=21&page=show_problem&problem=1927 -[5]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=14&page=show_problem&problem=1219 -[6]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=25&page=show_problem&problem=2352 -[7]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=117&page=show_problem&problem=2756 -[8]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=27&page=show_problem&problem=2499 -[9]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=117&page=show_problem&problem=2870 +--- +layout: post +category: announcements +time: 6:30 PM +description: Here are the practice problems for next week's practice! +--- + +Next week (March 17th), Mike Seo will be holding a practice on +intermediate graph problems. He will be referring to the following +problemset: + +
+ +Minimum/Maximum Spanning Trees: + + * [Freckles][1] + * [Heavy Cargo][2] + * [Re-connecting Computer Sites][3] + +Shortest path: + + * [Sending Email][4] + * [Fire Station][5] + * [Full Tank][6] + +Strongly Connected Components: + + * [Trust groups][7] + * [Dominos][8] + * [Lighting Away][9] + +
+ +As always, attempt these problems before next week's practice. The problems +within each category are listed somewhat in increasing order of difficulty, +so start with the first problems and work your way down the lists. For mid- +central regional, it is essential for you to at least know how to solve MST and +shortest path problems. For your reference, MST and shortest path are covered +in chapter 4 of the Competitive Programming book by Steven Halim, available +[here][Halim]. Also check out a great [slide deck][StanfordGraph] on the Stanford University +competitive programming course covering various basic graph algorithms including SCC. +For sample codes, search on Google and find ones that are easy to understand for you. + +
+ +One important note: priority will be given at the practice to helping +students through any issues they have experienced while attempting to solve +the problems, so do not come to practice expecting a full lecture on +computational geometry concepts. Use the resources provided above and try +to solve the problems yourself before attending, as you will gain the +most from the practice by doing so! + +
+ +Happy coding! + +[Halim]: http://www.comp.nus.edu.sg/~stevenha/myteaching/competitive_programming/cp1.pdf +[StanfordGraph]: http://web.stanford.edu/class/cs97si/06-basic-graph-algorithms.pdf +[1]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=12&page=show_problem&problem=975 +[2]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=7&page=show_problem&problem=485 +[3]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=11&page=show_problem&problem=849 +[4]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=21&page=show_problem&problem=1927 +[5]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=14&page=show_problem&problem=1219 +[6]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=25&page=show_problem&problem=2352 +[7]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=117&page=show_problem&problem=2756 +[8]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=27&page=show_problem&problem=2499 +[9]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=117&page=show_problem&problem=2870 diff --git a/_posts/_archive/2015-03-10-spring-2015-practice-6-summary.md b/_posts/_archive/2015-03-10-spring-2015-practice-6-summary.md index 36705bd..1dc708c 100644 --- a/_posts/_archive/2015-03-10-spring-2015-practice-6-summary.md +++ b/_posts/_archive/2015-03-10-spring-2015-practice-6-summary.md @@ -1,24 +1,24 @@ ---- -layout: post -category: practices -time: 8:00 PM -description: Summary of our sixth weekly practice of the Spring 2015 semester. ---- - -At today's practice, we discussed computational geometry, focusing on the problems from the -[practice set](/announcements/2015/03/04/practice-problems-for-the-week-of-mar-03.html), -most of which we went through in detail, including complete code. We discussed -various geometry formulas and algorithms, including convex hull. We also answered -specific student questions and discussed some contest strategies. - -
- -Next week, Mike will be going over intermediate graph algorithms, including shortest -path and minimum spanning tree. -Problems will be posted by the end of the week. Until then, continue to work on any -of the problems you have not yet finished from the last few content practices. - -
- -Happy coding! - +--- +layout: post +category: practices +time: 8:00 PM +description: Summary of our sixth weekly practice of the Spring 2015 semester. +--- + +At today's practice, we discussed computational geometry, focusing on the problems from the +[practice set](/announcements/2015/03/04/practice-problems-for-the-week-of-mar-03.html), +most of which we went through in detail, including complete code. We discussed +various geometry formulas and algorithms, including convex hull. We also answered +specific student questions and discussed some contest strategies. + +
+ +Next week, Mike will be going over intermediate graph algorithms, including shortest +path and minimum spanning tree. +Problems will be posted by the end of the week. Until then, continue to work on any +of the problems you have not yet finished from the last few content practices. + +
+ +Happy coding! + diff --git a/_posts/_archive/2015-03-17-spring-2015-practice-7-summary.md b/_posts/_archive/2015-03-17-spring-2015-practice-7-summary.md index d96e7bd..d4fdd1b 100644 --- a/_posts/_archive/2015-03-17-spring-2015-practice-7-summary.md +++ b/_posts/_archive/2015-03-17-spring-2015-practice-7-summary.md @@ -1,23 +1,23 @@ ---- -layout: post -category: practices -time: 8:00 PM -description: Summary of our seventh weekly practice of the Spring 2015 semester. ---- - -At today's practice, we discussed intermediate graph algorithms, focusing on the problems from the -[practice set](/announcements/2015/03/10/practice-problems-for-the-week-of-mar-10.html). -We discussed solutions to all of the problems in the problem set and also briefly went over -various graph algorithms including Kruskal's algorithm. -We also answered specific questions some students had. - -
- -Next week is going to be a Spring break, so there will be no practice. However, we want to -remind you that the NAIPC will be held during the Spring break. Anyone who wants an additional -practice is encouraged to participate in it. - -
- -Happy coding! - +--- +layout: post +category: practices +time: 8:00 PM +description: Summary of our seventh weekly practice of the Spring 2015 semester. +--- + +At today's practice, we discussed intermediate graph algorithms, focusing on the problems from the +[practice set](/announcements/2015/03/10/practice-problems-for-the-week-of-mar-10.html). +We discussed solutions to all of the problems in the problem set and also briefly went over +various graph algorithms including Kruskal's algorithm. +We also answered specific questions some students had. + +
+ +Next week is going to be a Spring break, so there will be no practice. However, we want to +remind you that the NAIPC will be held during the Spring break. Anyone who wants an additional +practice is encouraged to participate in it. + +
+ +Happy coding! + diff --git a/_posts/_archive/2015-03-18-announcing-the-dropbox-open!.md b/_posts/_archive/2015-03-18-announcing-the-dropbox-open!.md index 240d4cc..a9748d0 100644 --- a/_posts/_archive/2015-03-18-announcing-the-dropbox-open!.md +++ b/_posts/_archive/2015-03-18-announcing-the-dropbox-open!.md @@ -1,45 +1,45 @@ ---- -layout: post -category: announcements -time: 6:30 PM -description: We will be holding an open programming contest with prizes! ---- - -This semester, we will be holding our first official programming contest open to the -entire UIUC student body! - -
- -The SIG-ICPC Dropbox Open Programming Contest, or the Dropbox Open for short, is a -5-hour, semi-ICPC-style contest open to all UIUC students eligible to participate in -the 2015 Mid-Central Regionals contest. Full eligibility rules are available -[here](/contest/rules.html#Eligibility). The contest will be on April 18th from -10:30 AM to 6:00 PM, and is already visible on our [calendar](/calendar.html). - -
- -Dropbox has provided over $500 in prizes for the top teams! We are creating a -completely brand new problem set for this competition, and we have worked to make -the problems fun and challenging, but doable. We will also be providing dinner after -the contest. (We know how much you love free food. =D) - -
- -Students can compete in teams of their own choosing of 3 students. Students who -cannot find a team before the date of the contest will be matched to other students -on a first-registered first-serve basis on the date of the competition. Unlike ICPC -contests, we are allowing students to use their own computers (one per person) and -have full access to any physical materials or online resources (except people -outside your team) during the contest. Teams will be scored using the standard -ICPC scoring rules. - -
- -If you are interested in registering for the contest (and you should all be -interested), visit the [contest webpage](/contest/about.html). Registration is -currently open at [this link](/contest/register.html)! (Google login required) - -
- -We have worked hard to make sure this will be a fun event for everyone. Invite -your friends to participate and start forming your teams today! +--- +layout: post +category: announcements +time: 6:30 PM +description: We will be holding an open programming contest with prizes! +--- + +This semester, we will be holding our first official programming contest open to the +entire UIUC student body! + +
+ +The SIG-ICPC Dropbox Open Programming Contest, or the Dropbox Open for short, is a +5-hour, semi-ICPC-style contest open to all UIUC students eligible to participate in +the 2015 Mid-Central Regionals contest. Full eligibility rules are available +[here](/contest/rules.html#Eligibility). The contest will be on April 18th from +10:30 AM to 6:00 PM, and is already visible on our [calendar](/calendar.html). + +
+ +Dropbox has provided over $500 in prizes for the top teams! We are creating a +completely brand new problem set for this competition, and we have worked to make +the problems fun and challenging, but doable. We will also be providing dinner after +the contest. (We know how much you love free food. =D) + +
+ +Students can compete in teams of their own choosing of 3 students. Students who +cannot find a team before the date of the contest will be matched to other students +on a first-registered first-serve basis on the date of the competition. Unlike ICPC +contests, we are allowing students to use their own computers (one per person) and +have full access to any physical materials or online resources (except people +outside your team) during the contest. Teams will be scored using the standard +ICPC scoring rules. + +
+ +If you are interested in registering for the contest (and you should all be +interested), visit the [contest webpage](/contest/about.html). Registration is +currently open at [this link](/contest/register.html)! (Google login required) + +
+ +We have worked hard to make sure this will be a fun event for everyone. Invite +your friends to participate and start forming your teams today! diff --git a/_posts/_archive/2015-04-06-practice-problems-for-the-week-of-mar-31.md b/_posts/_archive/2015-04-06-practice-problems-for-the-week-of-mar-31.md index b46d2e3..b5ff27d 100644 --- a/_posts/_archive/2015-04-06-practice-problems-for-the-week-of-mar-31.md +++ b/_posts/_archive/2015-04-06-practice-problems-for-the-week-of-mar-31.md @@ -1,93 +1,93 @@ ---- -layout: post -category: announcements -time: 7:30 PM -description: Here are the practice problems for next week's practice! ---- - -This week (April 7th), Jingbo Shang will be holding a practice on -advanced graph problems. Specifically, he will be covering advanced connected -components, flow, and matching problems. He will be referring to the following -problemset: - -
- -Strong Connected Component (SCC): - - * [Popular Cows][1] - -Biconnected Component (edges): - - * [Redundant Paths][2] - -Max Flow: - - * [Drainage Ditches][3] - -Minimum Bipartite Matching: - - * [Ants][4] - - -
- -Try to attempt these problems before the practice. Since there is limited time -between today and the practice, Jingbo will spend some time going over the concepts -at the practice and will answer questions, but priority will still be given to -those with specific questions about their solutions. - -
- -While these problems may not necessarily come up at the Mid-Central Regionals, being -able to solve these types of problems is essential to performing well at World Finals -and many other programming competitions, so do put in the effort. - -
- -For your reference, many of the algorithms required to solve these problems are -explained in chapter 4 of the Competitive Programming book by Steven Halim, available -[here][Halim]. -TopCoder also has a wide array of advanced graph problem tutorials, including an -incredibly vast selection of tutorials on network flow algorithms. They are -available here: - -Max flow: - - * [Max Flow - Part 1][5] - * [Max Flow - Part 2][6] - * [Comparison of Augmenting Path Algos][7] - * [Push-Relabel Approach to Max Flow][8] - -Min-Cost Flow: - - * [Min-Cost Flow - Part 1][9] - * [Min-Cost Flow - Part 2][10] - * [Min-Cost Flow - Part 3][11] - -Bipartite Matching: - - * [Assignment Problem and the Hungarian Algorithm][12] - -
- -Note: These tutorials are a little advanced, so you may find more value by -first looking at the Competitive Programming book and referring to the tutorials only -if you understand the concepts fairly well. - -
- -Happy coding! - -[Halim]: http://www.comp.nus.edu.sg/~stevenha/myteaching/competitive_programming/cp1.pdf -[1]: http://poj.org/problem?id=2186 -[2]: http://poj.org/problem?id=3177 -[3]: http://poj.org/problem?id=1273 -[4]: http://poj.org/problem?id=3565 -[5]: https://www.topcoder.com/community/data-science/data-science-tutorials/maximum-flow-section-1/ -[6]: https://www.topcoder.com/community/data-science/data-science-tutorials/maximum-flow-section-2/ -[7]: https://www.topcoder.com/community/data-science/data-science-tutorials/maximum-flow-augmenting-path-algorithms-comparison/ -[8]: https://www.topcoder.com/community/data-science/data-science-tutorials/push-relabel-approach-to-the-maximum-flow-problem/ -[9]: https://www.topcoder.com/community/data-science/data-science-tutorials/minimum-cost-flow-part-one-key-concepts/ -[10]: https://www.topcoder.com/community/data-science/data-science-tutorials/minimum-cost-flow-part-two-algorithms/ -[11]: https://www.topcoder.com/community/data-science/data-science-tutorials/minimum-cost-flow-part-three-applications/ -[12]: https://www.topcoder.com/community/data-science/data-science-tutorials/assignment-problem-and-hungarian-algorithm/ +--- +layout: post +category: announcements +time: 7:30 PM +description: Here are the practice problems for next week's practice! +--- + +This week (April 7th), Jingbo Shang will be holding a practice on +advanced graph problems. Specifically, he will be covering advanced connected +components, flow, and matching problems. He will be referring to the following +problemset: + +
+ +Strong Connected Component (SCC): + + * [Popular Cows][1] + +Biconnected Component (edges): + + * [Redundant Paths][2] + +Max Flow: + + * [Drainage Ditches][3] + +Minimum Bipartite Matching: + + * [Ants][4] + + +
+ +Try to attempt these problems before the practice. Since there is limited time +between today and the practice, Jingbo will spend some time going over the concepts +at the practice and will answer questions, but priority will still be given to +those with specific questions about their solutions. + +
+ +While these problems may not necessarily come up at the Mid-Central Regionals, being +able to solve these types of problems is essential to performing well at World Finals +and many other programming competitions, so do put in the effort. + +
+ +For your reference, many of the algorithms required to solve these problems are +explained in chapter 4 of the Competitive Programming book by Steven Halim, available +[here][Halim]. +TopCoder also has a wide array of advanced graph problem tutorials, including an +incredibly vast selection of tutorials on network flow algorithms. They are +available here: + +Max flow: + + * [Max Flow - Part 1][5] + * [Max Flow - Part 2][6] + * [Comparison of Augmenting Path Algos][7] + * [Push-Relabel Approach to Max Flow][8] + +Min-Cost Flow: + + * [Min-Cost Flow - Part 1][9] + * [Min-Cost Flow - Part 2][10] + * [Min-Cost Flow - Part 3][11] + +Bipartite Matching: + + * [Assignment Problem and the Hungarian Algorithm][12] + +
+ +Note: These tutorials are a little advanced, so you may find more value by +first looking at the Competitive Programming book and referring to the tutorials only +if you understand the concepts fairly well. + +
+ +Happy coding! + +[Halim]: http://www.comp.nus.edu.sg/~stevenha/myteaching/competitive_programming/cp1.pdf +[1]: http://poj.org/problem?id=2186 +[2]: http://poj.org/problem?id=3177 +[3]: http://poj.org/problem?id=1273 +[4]: http://poj.org/problem?id=3565 +[5]: https://www.topcoder.com/community/data-science/data-science-tutorials/maximum-flow-section-1/ +[6]: https://www.topcoder.com/community/data-science/data-science-tutorials/maximum-flow-section-2/ +[7]: https://www.topcoder.com/community/data-science/data-science-tutorials/maximum-flow-augmenting-path-algorithms-comparison/ +[8]: https://www.topcoder.com/community/data-science/data-science-tutorials/push-relabel-approach-to-the-maximum-flow-problem/ +[9]: https://www.topcoder.com/community/data-science/data-science-tutorials/minimum-cost-flow-part-one-key-concepts/ +[10]: https://www.topcoder.com/community/data-science/data-science-tutorials/minimum-cost-flow-part-two-algorithms/ +[11]: https://www.topcoder.com/community/data-science/data-science-tutorials/minimum-cost-flow-part-three-applications/ +[12]: https://www.topcoder.com/community/data-science/data-science-tutorials/assignment-problem-and-hungarian-algorithm/ diff --git a/_posts/_archive/2015-04-07-spring-2015-practice-8-summary.md b/_posts/_archive/2015-04-07-spring-2015-practice-8-summary.md index 2d5be29..cd9baf0 100644 --- a/_posts/_archive/2015-04-07-spring-2015-practice-8-summary.md +++ b/_posts/_archive/2015-04-07-spring-2015-practice-8-summary.md @@ -1,21 +1,21 @@ ---- -layout: post -category: practices -time: 8:00 PM -description: Summary of our eighth weekly practice of the Spring 2015 semester. ---- - -There was very low attendance at today's practice, so we have combined this week's -topic with next week's. Next week, Jingbo will be covering advanced graph problems -and advanced dynamic programming (DP) problems. Make sure to check out and attempt -[this week's problemset](/announcements/2015/04/06/practice-problems-for-the-week-of-mar-31.html) -and [next week's problemset](/announcements/2015/04/09/practice-problems-for-the-week-of-apr-07.html) -before the practice, as with advanced topics like these, you will not gain much from -the practice without spending some time with the problems and concepts first. The -problemset pages have a large list of tutorials you can use to learn about the -concepts. - -
- -Happy coding! - +--- +layout: post +category: practices +time: 8:00 PM +description: Summary of our eighth weekly practice of the Spring 2015 semester. +--- + +There was very low attendance at today's practice, so we have combined this week's +topic with next week's. Next week, Jingbo will be covering advanced graph problems +and advanced dynamic programming (DP) problems. Make sure to check out and attempt +[this week's problemset](/announcements/2015/04/06/practice-problems-for-the-week-of-mar-31.html) +and [next week's problemset](/announcements/2015/04/09/practice-problems-for-the-week-of-apr-07.html) +before the practice, as with advanced topics like these, you will not gain much from +the practice without spending some time with the problems and concepts first. The +problemset pages have a large list of tutorials you can use to learn about the +concepts. + +
+ +Happy coding! + diff --git a/_posts/_archive/2015-04-09-practice-problems-for-the-week-of-apr-07.md b/_posts/_archive/2015-04-09-practice-problems-for-the-week-of-apr-07.md index 8fe31e8..a424058 100644 --- a/_posts/_archive/2015-04-09-practice-problems-for-the-week-of-apr-07.md +++ b/_posts/_archive/2015-04-09-practice-problems-for-the-week-of-apr-07.md @@ -1,73 +1,73 @@ ---- -layout: post -category: announcements -time: 8:00 PM -description: Here are the practice problems for next week's practice! ---- - -Next week (April 14th), Jingbo Shang will be holding a practice on -advanced dynamic programming problems. He will be referring to the following -problemset: - -
- -Tree DP: - - * [Rebuilding Roads][1] - -Monotone Queue DP: - - * [Bad Hair Day][2] - * [Dividing the Path][3] - -Set DP: - - * [Hardwood Floor][4] - * [Another Chocolate Maniac][5] - -Connection DP: - - * [Formula 1][6] - -
- -As always, attempt these problems before next week's practice. -While these problems may not necessarily come up at the Mid-Central Regionals, being -able to solve these types of problems is essential to performing well at World Finals -and many other programming competitions, so do put in the effort. - -
- -For your reference, dynamic programming is covered in section 3.4 of the -Competitive Programming book by Steven Halim, available [here][Halim]. DP is -not a specific algorithm, but rather a technique for solving a class of -problems, so simply reading the book or looking at tutorials will not help you -as much as actually solving problems. If you are still stumped about DP, go -back to [our earlier practice on simple DP algorithms](/announcements/2015/02/04/practice-problems-for-the-week-of-feb-03.html) -and make sure you can solve all of the problems there. -TopCoder also has a tutorial on dynamic programming, available [here][TopCoderDP]. - -
- -As always, priority will be given at the practice to helping -students through any issues they have experienced while attempting to solve -the problems, so do not come to practice expecting to be taught all of the -concepts. Jingbo will spend some time going over the concepts at the practice -and will answer questions, but with the difficulty levels of these problems, -it will not be possible to cover everything! Use the resources provided above -and try to solve the problems yourself before attending, as you will -gain the most from the practice by doing so! - - -
- -Happy coding! - -[Halim]: http://www.comp.nus.edu.sg/~stevenha/myteaching/competitive_programming/cp1.pdf -[1]: http://poj.org/problem?id=1947 -[2]: http://poj.org/problem?id=3250 -[3]: http://poj.org/problem?id=2373 -[4]: http://acm.sgu.ru/problem.php?contest=0&problem=131 -[5]: http://acm.sgu.ru/problem.php?contest=0&problem=132 -[6]: http://acm.timus.ru/problem.aspx?space=1&num=1519 -[TopCoderDP]: https://www.topcoder.com/community/data-science/data-science-tutorials/dynamic-programming-from-novice-to-advanced/ +--- +layout: post +category: announcements +time: 8:00 PM +description: Here are the practice problems for next week's practice! +--- + +Next week (April 14th), Jingbo Shang will be holding a practice on +advanced dynamic programming problems. He will be referring to the following +problemset: + +
+ +Tree DP: + + * [Rebuilding Roads][1] + +Monotone Queue DP: + + * [Bad Hair Day][2] + * [Dividing the Path][3] + +Set DP: + + * [Hardwood Floor][4] + * [Another Chocolate Maniac][5] + +Connection DP: + + * [Formula 1][6] + +
+ +As always, attempt these problems before next week's practice. +While these problems may not necessarily come up at the Mid-Central Regionals, being +able to solve these types of problems is essential to performing well at World Finals +and many other programming competitions, so do put in the effort. + +
+ +For your reference, dynamic programming is covered in section 3.4 of the +Competitive Programming book by Steven Halim, available [here][Halim]. DP is +not a specific algorithm, but rather a technique for solving a class of +problems, so simply reading the book or looking at tutorials will not help you +as much as actually solving problems. If you are still stumped about DP, go +back to [our earlier practice on simple DP algorithms](/announcements/2015/02/04/practice-problems-for-the-week-of-feb-03.html) +and make sure you can solve all of the problems there. +TopCoder also has a tutorial on dynamic programming, available [here][TopCoderDP]. + +
+ +As always, priority will be given at the practice to helping +students through any issues they have experienced while attempting to solve +the problems, so do not come to practice expecting to be taught all of the +concepts. Jingbo will spend some time going over the concepts at the practice +and will answer questions, but with the difficulty levels of these problems, +it will not be possible to cover everything! Use the resources provided above +and try to solve the problems yourself before attending, as you will +gain the most from the practice by doing so! + + +
+ +Happy coding! + +[Halim]: http://www.comp.nus.edu.sg/~stevenha/myteaching/competitive_programming/cp1.pdf +[1]: http://poj.org/problem?id=1947 +[2]: http://poj.org/problem?id=3250 +[3]: http://poj.org/problem?id=2373 +[4]: http://acm.sgu.ru/problem.php?contest=0&problem=131 +[5]: http://acm.sgu.ru/problem.php?contest=0&problem=132 +[6]: http://acm.timus.ru/problem.aspx?space=1&num=1519 +[TopCoderDP]: https://www.topcoder.com/community/data-science/data-science-tutorials/dynamic-programming-from-novice-to-advanced/ diff --git a/_posts/_archive/2015-04-19-dropbox-open-results.md b/_posts/_archive/2015-04-19-dropbox-open-results.md index 9a08f19..9492ae9 100644 --- a/_posts/_archive/2015-04-19-dropbox-open-results.md +++ b/_posts/_archive/2015-04-19-dropbox-open-results.md @@ -1,51 +1,51 @@ ---- -layout: post -category: announcements -time: 7:00 PM -description: Results of the SIG-ICPC Dropbox Open Programming Contest! ---- - -Congratulations to the team of Yuting Zhang, Haozhen Ding, and Yewen Fan for winning -the first ever Dropbox SIG-ICPC Open Programming Contest by solving 11 of the 15 -problems! Also, congratulations to Team UIUCBlack, consisting of Shivam Gupta, Ryan -Jian, and Ruihan Shan, for taking second place by solving 10 problems, and the team -of Olzhas Alipov, who singlehandedly took 3rd place by solving 9 problems! The final -scoreboard is available at [http://domjudge.cs.illinois.edu/](http://domjudge.cs.illinois.edu/). -All of the competitors -on the top teams will be receiving Amazon gift cards as prizes for their amazing -performance! - -
- -We hope everyone enjoyed competing in the contest. If we missed you yesterday, there -are plenty of additional opportunities to compete in other programming contests on -our [calendar](/calendar.html). In particular, the TopCoder Open and Google Code Jam -are both happening right now. If you haven’t already qualified for TopCoder Open, -make sure to participate in one of the two remaining Rounds 1. - -
- -If you enjoyed the competition and/or would like to find out more about what our -SIG does, please [join our mailing list](https://www-s.acm.illinois.edu/cgi-bin/mailman/listinfo/icpc-l) -and check out the practice resources and our practice summaries. - -
- -We are still holding weekly practices for the spring semester until the last week of -classes. This coming Tuesday, April 21st, Jingbo Shang will be covering advanced DP -and advanced graph problems. He will be using the two problemsets ([here](/announcements/2015/04/06/practice-problems-for-the-week-of-mar-31.html) -and [here](/announcements/2015/04/09/practice-problems-for-the-week-of-apr-07.html)) -that have been available on our website for the last two weeks. Make sure you try -your hand at the problems before practice on Tuesday, as priority will be given to -helping students with issues they have encountered while trying to solve the problems. - -
- -We hope to see many of you at our practices either this semester or at the start of -the Fall semester, when we will be gearing up for the 2015 ICPC Mid-Central -Regionals competition. If you are interested in competing in next year’s World -Finals competition, make sure to attend the first meetings of the Fall 2015 semester. - -
- -Happy coding, and thanks for your interest in the Dropbox Open! +--- +layout: post +category: announcements +time: 7:00 PM +description: Results of the SIG-ICPC Dropbox Open Programming Contest! +--- + +Congratulations to the team of Yuting Zhang, Haozhen Ding, and Yewen Fan for winning +the first ever Dropbox SIG-ICPC Open Programming Contest by solving 11 of the 15 +problems! Also, congratulations to Team UIUCBlack, consisting of Shivam Gupta, Ryan +Jian, and Ruihan Shan, for taking second place by solving 10 problems, and the team +of Olzhas Alipov, who singlehandedly took 3rd place by solving 9 problems! The final +scoreboard is available at [http://domjudge.cs.illinois.edu/](http://domjudge.cs.illinois.edu/). +All of the competitors +on the top teams will be receiving Amazon gift cards as prizes for their amazing +performance! + +
+ +We hope everyone enjoyed competing in the contest. If we missed you yesterday, there +are plenty of additional opportunities to compete in other programming contests on +our [calendar](/calendar.html). In particular, the TopCoder Open and Google Code Jam +are both happening right now. If you haven’t already qualified for TopCoder Open, +make sure to participate in one of the two remaining Rounds 1. + +
+ +If you enjoyed the competition and/or would like to find out more about what our +SIG does, please [join our mailing list](https://www-s.acm.illinois.edu/cgi-bin/mailman/listinfo/icpc-l) +and check out the practice resources and our practice summaries. + +
+ +We are still holding weekly practices for the spring semester until the last week of +classes. This coming Tuesday, April 21st, Jingbo Shang will be covering advanced DP +and advanced graph problems. He will be using the two problemsets ([here](/announcements/2015/04/06/practice-problems-for-the-week-of-mar-31.html) +and [here](/announcements/2015/04/09/practice-problems-for-the-week-of-apr-07.html)) +that have been available on our website for the last two weeks. Make sure you try +your hand at the problems before practice on Tuesday, as priority will be given to +helping students with issues they have encountered while trying to solve the problems. + +
+ +We hope to see many of you at our practices either this semester or at the start of +the Fall semester, when we will be gearing up for the 2015 ICPC Mid-Central +Regionals competition. If you are interested in competing in next year’s World +Finals competition, make sure to attend the first meetings of the Fall 2015 semester. + +
+ +Happy coding, and thanks for your interest in the Dropbox Open! diff --git a/_posts/_archive/2015-04-21-spring-2015-practice-9-summary.md b/_posts/_archive/2015-04-21-spring-2015-practice-9-summary.md index 0461fa2..ba76197 100644 --- a/_posts/_archive/2015-04-21-spring-2015-practice-9-summary.md +++ b/_posts/_archive/2015-04-21-spring-2015-practice-9-summary.md @@ -1,42 +1,42 @@ ---- -layout: post -category: practices -time: 8:00 PM -description: Summary of our ninth weekly practice of the Spring 2015 semester. ---- - -At today's practice, Jingbo gave a lecture on advanced graph problems using the -slide deck available [here][1]. Specifically, he went over the following types of -graph problems: - - * Maximum (weighted) bipartite matching - * Max flow - * Min cost max flow - -
- -He introduced some basic algorithms that can be used to solve these problems and -provided sample problems on online judges for practice. - -
- -Additionally, Jingbo went over two set dynamic programming problems as well. He -discussed two different implementation strategies, i.e. row-wise and entry-wise, and -went over the corresponding problems that were provided in the problem set. - -
- -Next week, there will be no practice. We have the room reserved, so you are free to -meet in 0218 SC to work on the practice problems together. Mike Seo will be leading -the following and final practice of the semester on May 5th, covering combinatorics -and number theory. This is an extremely important topic for ICPC competitions, so be -sure to attend! We will also be performing the semester wrap-up and taking your -feedback on how we conducted practices this semester. If you have comments, good -or bad, come to the practice and voice your opinions. - -
- -Happy coding! - -[1]: /assets/slides/Lecture%209%20-%20Advanced%20Graph%20Problems.pdf -[2]: https://www.dropbox.com/s/w4tmzsxyaqkrlzy/Lecture%209%20-%20Advanced%20Graph%20Problems.pdf?dl=0 +--- +layout: post +category: practices +time: 8:00 PM +description: Summary of our ninth weekly practice of the Spring 2015 semester. +--- + +At today's practice, Jingbo gave a lecture on advanced graph problems using the +slide deck available [here][1]. Specifically, he went over the following types of +graph problems: + + * Maximum (weighted) bipartite matching + * Max flow + * Min cost max flow + +
+ +He introduced some basic algorithms that can be used to solve these problems and +provided sample problems on online judges for practice. + +
+ +Additionally, Jingbo went over two set dynamic programming problems as well. He +discussed two different implementation strategies, i.e. row-wise and entry-wise, and +went over the corresponding problems that were provided in the problem set. + +
+ +Next week, there will be no practice. We have the room reserved, so you are free to +meet in 0218 SC to work on the practice problems together. Mike Seo will be leading +the following and final practice of the semester on May 5th, covering combinatorics +and number theory. This is an extremely important topic for ICPC competitions, so be +sure to attend! We will also be performing the semester wrap-up and taking your +feedback on how we conducted practices this semester. If you have comments, good +or bad, come to the practice and voice your opinions. + +
+ +Happy coding! + +[1]: /assets/slides/Lecture%209%20-%20Advanced%20Graph%20Problems.pdf +[2]: https://www.dropbox.com/s/w4tmzsxyaqkrlzy/Lecture%209%20-%20Advanced%20Graph%20Problems.pdf?dl=0 diff --git a/_posts/_archive/2015-04-30-practice-problems-for-the-week-of-apr-28.md b/_posts/_archive/2015-04-30-practice-problems-for-the-week-of-apr-28.md index 4445f48..0ff5c6e 100644 --- a/_posts/_archive/2015-04-30-practice-problems-for-the-week-of-apr-28.md +++ b/_posts/_archive/2015-04-30-practice-problems-for-the-week-of-apr-28.md @@ -1,73 +1,73 @@ ---- -layout: post -category: announcements -time: 8:00 PM -description: Here are the practice problems for next week's practice! ---- - -Next week (May 5th), Mike Seo will be holding this semester's final practice on -number theory and combinatorics. He will be referring to the following -problemset: - -
- -Number Theory - - * [Big Mod][1] - * [Street Trees][2] - * [Humble Numbers][3] - * [Help Mr. Tomisu][4] - -Combinatorics - - * [Combination][5] - * [Halloween Treats][6] - * [Mixing Invitations][7] - * [Cheerleaders][8] - * [How Many?][9] - - -
- -As always, attempt these problems before next week's practice. -The problems are roughly in increasing order of difficulty. - -
- -For your reference, number theory and combinatorics are covered in section 5.3 -and 5.5 of the Competitive Programming book by Steven Halim, available [here][Halim]. -Learning about pigeon hole principle and inclusion-exclusion principle will especially -be helpful for solving some of the combinatorics problems listed above. Consult the Stanford -University's competitive programming course lecture [slides][Stanford] for basic math concepts. -However, the slides are not exhaustive (i.e. the math concepts listed are not covered in -these slides). Wikipedia has decent explanations, so please try to study these -concepts by yourself. Also, as combinatorics and dynamic programming are closely related, do not -be surprised to use DP techniques to solve some of these problems. - - -
- -As always, priority will be given at the practice to helping -students through any issues they have experienced while attempting to solve -the problems, so do not come to practice expecting to be taught all of the -concepts. Mike will spend some time going over the concepts at the practice -and will answer questions. Use the resources provided above -and try to solve the problems yourself before attending, as you will -gain the most from the practice by doing so! - - -
- -Happy coding! - -[Halim]: http://www.comp.nus.edu.sg/~stevenha/myteaching/competitive_programming/cp1.pdf -[1]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=5&page=show_problem&problem=310 -[2]: http://www.spoj.com/problems/STREETR/ -[3]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=6&page=show_problem&problem=384 -[4]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=26&page=show_problem&problem=2435 -[5]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=5&page=show_problem&problem=305 -[6]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2178 -[7]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2257 -[8]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=226&page=show_problem&problem=2906 -[9]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=11&page=show_problem&problem=927 -[Stanford]: http://web.stanford.edu/class/cs97si/02-mathematics.pdf +--- +layout: post +category: announcements +time: 8:00 PM +description: Here are the practice problems for next week's practice! +--- + +Next week (May 5th), Mike Seo will be holding this semester's final practice on +number theory and combinatorics. He will be referring to the following +problemset: + +
+ +Number Theory + + * [Big Mod][1] + * [Street Trees][2] + * [Humble Numbers][3] + * [Help Mr. Tomisu][4] + +Combinatorics + + * [Combination][5] + * [Halloween Treats][6] + * [Mixing Invitations][7] + * [Cheerleaders][8] + * [How Many?][9] + + +
+ +As always, attempt these problems before next week's practice. +The problems are roughly in increasing order of difficulty. + +
+ +For your reference, number theory and combinatorics are covered in section 5.3 +and 5.5 of the Competitive Programming book by Steven Halim, available [here][Halim]. +Learning about pigeon hole principle and inclusion-exclusion principle will especially +be helpful for solving some of the combinatorics problems listed above. Consult the Stanford +University's competitive programming course lecture [slides][Stanford] for basic math concepts. +However, the slides are not exhaustive (i.e. the math concepts listed are not covered in +these slides). Wikipedia has decent explanations, so please try to study these +concepts by yourself. Also, as combinatorics and dynamic programming are closely related, do not +be surprised to use DP techniques to solve some of these problems. + + +
+ +As always, priority will be given at the practice to helping +students through any issues they have experienced while attempting to solve +the problems, so do not come to practice expecting to be taught all of the +concepts. Mike will spend some time going over the concepts at the practice +and will answer questions. Use the resources provided above +and try to solve the problems yourself before attending, as you will +gain the most from the practice by doing so! + + +
+ +Happy coding! + +[Halim]: http://www.comp.nus.edu.sg/~stevenha/myteaching/competitive_programming/cp1.pdf +[1]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=5&page=show_problem&problem=310 +[2]: http://www.spoj.com/problems/STREETR/ +[3]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=6&page=show_problem&problem=384 +[4]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=26&page=show_problem&problem=2435 +[5]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=5&page=show_problem&problem=305 +[6]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2178 +[7]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2257 +[8]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=226&page=show_problem&problem=2906 +[9]: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=11&page=show_problem&problem=927 +[Stanford]: http://web.stanford.edu/class/cs97si/02-mathematics.pdf diff --git a/_posts/_archive/2015-08-24-Welcome-back!.md b/_posts/_archive/2015-08-24-Welcome-back!.md index 023094f..e053fa9 100644 --- a/_posts/_archive/2015-08-24-Welcome-back!.md +++ b/_posts/_archive/2015-08-24-Welcome-back!.md @@ -1,39 +1,39 @@ ---- -layout: post -category: announcements -time: 10:00 AM -description: Get ready for another season of ICPC! ---- - -Welcome back from summer break! We hope everyone is well-rested and ready for -another season of ICPC! - -
- -Our first meeting of the semester will be tomorrow, Tuesday, August 25th from -6-8 PM in 0218 Siebel Center. Our first meeting will be a welcome meeting, -so we will be explaining how ICPC works and answering any questions about ICPC -that you may have. We will also go over important upcoming dates, including -tryouts and practice contests. Bring anyone you know who might be interested -in ICPC! - -
- -This year, Dropbox has graciously sponsored our tryouts! They have also -provided us with swag, which we will be handing out at tomorrow's meeting. - - -
- -Lastly, this year, we have changed the format of the practices. We have -created a 1-credit seminar course, CS 491 CAP, for the algorithms and data -structures lecture portion of ICPC. The course is currently being added to -the catalog, so we will send more information about it over the mailing list -in the coming days. Since we will be going over algorithms topics during the -course, it is mandatory for anyone interested in competing in the ICPC regionals -this year. - - -
- -We hope to see everyone at tomorrow's kickoff ICPC meeting! +--- +layout: post +category: announcements +time: 10:00 AM +description: Get ready for another season of ICPC! +--- + +Welcome back from summer break! We hope everyone is well-rested and ready for +another season of ICPC! + +
+ +Our first meeting of the semester will be tomorrow, Tuesday, August 25th from +6-8 PM in 0218 Siebel Center. Our first meeting will be a welcome meeting, +so we will be explaining how ICPC works and answering any questions about ICPC +that you may have. We will also go over important upcoming dates, including +tryouts and practice contests. Bring anyone you know who might be interested +in ICPC! + +
+ +This year, Dropbox has graciously sponsored our tryouts! They have also +provided us with swag, which we will be handing out at tomorrow's meeting. + + +
+ +Lastly, this year, we have changed the format of the practices. We have +created a 1-credit seminar course, CS 491 CAP, for the algorithms and data +structures lecture portion of ICPC. The course is currently being added to +the catalog, so we will send more information about it over the mailing list +in the coming days. Since we will be going over algorithms topics during the +course, it is mandatory for anyone interested in competing in the ICPC regionals +this year. + + +
+ +We hope to see everyone at tomorrow's kickoff ICPC meeting! diff --git a/_posts/_archive/2015-08-25-CS-491-CAP-Announcement.md b/_posts/_archive/2015-08-25-CS-491-CAP-Announcement.md index 39e8f74..4e3716d 100644 --- a/_posts/_archive/2015-08-25-CS-491-CAP-Announcement.md +++ b/_posts/_archive/2015-08-25-CS-491-CAP-Announcement.md @@ -1,37 +1,37 @@ ---- -layout: post -category: announcements -time: 10:00 AM -description: Information about our new seminar course and regular practices. ---- - -In a break from last year's format, we have -created a seminar course, CS 491 CAP, for the lecture portion of ICPC. The -course will be held every Wednesday from 2-3 PM in Siebel 1131. In the -seminar, we will go over algorithms and data structures topics that will -appear during the Regionals and World Finals competitions and -assign problem sets for you to use to practice those concepts. The course is mandatory for anyone interested in competing in the ICPC regionals this year. UPDATE: Completion of -course passing requirements, which are detailed in the [course syllabus][3], -is mandatory for anyone interested in competing in the ICPC regionals this -year. You do not, however, need to sign up for or attend the course, though -it is highly encouraged. -For more information, please visit the [course website][2]. - -
- -Our normal practices will be held weekly on Tuesdays from 6-8 PM. During the -practices, we will go over practice problems assigned at the previous week's -CS 491 CAP seminar and answer any questions you have. The practices should be -used as an opportunity to learn hands-on techniques for quickly and correctly -solving ICPC problems. We will also use the practices to announce important -information about ICPC, including tryouts dates and results and Regionals -logistics. - -
- -For an up-to-date schedule and information on other events throughout the -semester, please refer to the [calendar][1] page. - -[1]: /calendar.html -[2]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Home -[3]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Syllabus +--- +layout: post +category: announcements +time: 10:00 AM +description: Information about our new seminar course and regular practices. +--- + +In a break from last year's format, we have +created a seminar course, CS 491 CAP, for the lecture portion of ICPC. The +course will be held every Wednesday from 2-3 PM in Siebel 1131. In the +seminar, we will go over algorithms and data structures topics that will +appear during the Regionals and World Finals competitions and +assign problem sets for you to use to practice those concepts. The course is mandatory for anyone interested in competing in the ICPC regionals this year. UPDATE: Completion of +course passing requirements, which are detailed in the [course syllabus][3], +is mandatory for anyone interested in competing in the ICPC regionals this +year. You do not, however, need to sign up for or attend the course, though +it is highly encouraged. +For more information, please visit the [course website][2]. + +
+ +Our normal practices will be held weekly on Tuesdays from 6-8 PM. During the +practices, we will go over practice problems assigned at the previous week's +CS 491 CAP seminar and answer any questions you have. The practices should be +used as an opportunity to learn hands-on techniques for quickly and correctly +solving ICPC problems. We will also use the practices to announce important +information about ICPC, including tryouts dates and results and Regionals +logistics. + +
+ +For an up-to-date schedule and information on other events throughout the +semester, please refer to the [calendar][1] page. + +[1]: /calendar.html +[2]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Home +[3]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Syllabus diff --git a/_posts/_archive/2015-08-25-Fall-2015-Practice-1-Summary.md b/_posts/_archive/2015-08-25-Fall-2015-Practice-1-Summary.md index c5324b8..97c35d1 100644 --- a/_posts/_archive/2015-08-25-Fall-2015-Practice-1-Summary.md +++ b/_posts/_archive/2015-08-25-Fall-2015-Practice-1-Summary.md @@ -1,46 +1,46 @@ ---- -layout: post -category: practices -time: 8:00 PM -description: Summary of our first weekly practice of the Fall 2015 semester. ---- - -In today's practice, we went over the basics of ICPC and the dates of this -year's tryouts competition. This year, tryouts will be held on September -12th and September 19th. The times and rooms will be announced as they are -finalized. We also went over eligibility to compete in Regionals. Please -look at the [eligibility flowchart][2] to see whether you will be able to -compete. Even if you are ineligible, we still welcome you to both the practices -and the seminar course. - -
- -As a reminder, the first CS 491 CAP lecture will be tomorrow from 2-3 PM in -Siebel 1131. This seminar will cover the algorithms and data structures -concepts necessary to do well in ICPC, and completion of the passing -requirements for the course is mandatory for all students -interested in competing in the Mid-Central Regionals. We hope to see all -of you there. - -
- -In response to concern about the meeting time for the CS 491 CAP seminar -overlapping with other courses, we will be sending out a poll by tomorrow -asking for your availabilities throughout the week. We will try our best -to find a time that works for as many people as possible, but we cannot -guarantee that it will work for everyone. We will also not be able to record -the lectures. The course materials will, however, be available for all students -at the [course website][1], regardless of whether or not you register for the -course. So long as you complete the required assignments in the course, you -will be eligible to compete in Regionals. - -
- -Next week's meeting is targeted at new students who hear about ICPC through -the ACM Open House. It will be largely the same as this meeting, so if you -missed this week's meeting, make sure to attend next week's. If you know anyone -who might be interested in ICPC, encourage them to attend next week's meeting. - - -[1]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Home -[2]: /assets/EligibilityDecisionTree-2015.pdf +--- +layout: post +category: practices +time: 8:00 PM +description: Summary of our first weekly practice of the Fall 2015 semester. +--- + +In today's practice, we went over the basics of ICPC and the dates of this +year's tryouts competition. This year, tryouts will be held on September +12th and September 19th. The times and rooms will be announced as they are +finalized. We also went over eligibility to compete in Regionals. Please +look at the [eligibility flowchart][2] to see whether you will be able to +compete. Even if you are ineligible, we still welcome you to both the practices +and the seminar course. + +
+ +As a reminder, the first CS 491 CAP lecture will be tomorrow from 2-3 PM in +Siebel 1131. This seminar will cover the algorithms and data structures +concepts necessary to do well in ICPC, and completion of the passing +requirements for the course is mandatory for all students +interested in competing in the Mid-Central Regionals. We hope to see all +of you there. + +
+ +In response to concern about the meeting time for the CS 491 CAP seminar +overlapping with other courses, we will be sending out a poll by tomorrow +asking for your availabilities throughout the week. We will try our best +to find a time that works for as many people as possible, but we cannot +guarantee that it will work for everyone. We will also not be able to record +the lectures. The course materials will, however, be available for all students +at the [course website][1], regardless of whether or not you register for the +course. So long as you complete the required assignments in the course, you +will be eligible to compete in Regionals. + +
+ +Next week's meeting is targeted at new students who hear about ICPC through +the ACM Open House. It will be largely the same as this meeting, so if you +missed this week's meeting, make sure to attend next week's. If you know anyone +who might be interested in ICPC, encourage them to attend next week's meeting. + + +[1]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Home +[2]: /assets/EligibilityDecisionTree-2015.pdf diff --git a/_posts/_archive/2015-08-26-CS-491-CAP-Update.md b/_posts/_archive/2015-08-26-CS-491-CAP-Update.md index aada726..1ff8758 100644 --- a/_posts/_archive/2015-08-26-CS-491-CAP-Update.md +++ b/_posts/_archive/2015-08-26-CS-491-CAP-Update.md @@ -1,21 +1,21 @@ ---- -layout: post -category: announcements -time: 11:00 PM -description: Update about the lecture time for the CS 491 CAP course. ---- - -Due to a number of students having course conflicts with the original time for CS 491 CAP, we will be rescheduling the course to a new time. If you haven’t already done so, please check out the [course syllabus][1] and the first lecture and problem set, posted at the [course website][2], to get an idea what will be required of you for the course. Please note that if you do not already have proficiency coding in C/C++ or Java, you will have a difficult time in the course, as we assume basic coding ability. - -
- -If you are seriously interested in taking the course for credit or in competing in the ACM ICPC Regionals this semester, please fill out [this poll][3] with your availabilities for this semester. We will be tallying the results and deciding the new time for the course TOMORROW, THURSDAY, AUGUST 27th at 10 PM CST. While we can’t make any guarantees, we will try to accommodate as many of you as possible. - -
- -Many of you have also pointed out to us that the CS 491 CAP course has reached capacity. We are aware of the situation, and are currently working to increase the number of available spots. When we update the course time and capacity, we will let you know through the ICPC mailing list. Please also note that you do not need to register for the course to attend the lectures and complete the practice assignments – we encourage you to sit in if you would like to improve your skills. - -[1]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Home -[2]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Syllabus -[3]: http://whenisgood.net/CS-491-CAP-seminar-time - +--- +layout: post +category: announcements +time: 11:00 PM +description: Update about the lecture time for the CS 491 CAP course. +--- + +Due to a number of students having course conflicts with the original time for CS 491 CAP, we will be rescheduling the course to a new time. If you haven’t already done so, please check out the [course syllabus][1] and the first lecture and problem set, posted at the [course website][2], to get an idea what will be required of you for the course. Please note that if you do not already have proficiency coding in C/C++ or Java, you will have a difficult time in the course, as we assume basic coding ability. + +
+ +If you are seriously interested in taking the course for credit or in competing in the ACM ICPC Regionals this semester, please fill out [this poll][3] with your availabilities for this semester. We will be tallying the results and deciding the new time for the course TOMORROW, THURSDAY, AUGUST 27th at 10 PM CST. While we can’t make any guarantees, we will try to accommodate as many of you as possible. + +
+ +Many of you have also pointed out to us that the CS 491 CAP course has reached capacity. We are aware of the situation, and are currently working to increase the number of available spots. When we update the course time and capacity, we will let you know through the ICPC mailing list. Please also note that you do not need to register for the course to attend the lectures and complete the practice assignments – we encourage you to sit in if you would like to improve your skills. + +[1]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Home +[2]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Syllabus +[3]: http://whenisgood.net/CS-491-CAP-seminar-time + diff --git a/_posts/_archive/2015-08-28-CS-491-CAP-has-been-moved!.md b/_posts/_archive/2015-08-28-CS-491-CAP-has-been-moved!.md index 26f281c..12acc66 100644 --- a/_posts/_archive/2015-08-28-CS-491-CAP-has-been-moved!.md +++ b/_posts/_archive/2015-08-28-CS-491-CAP-has-been-moved!.md @@ -1,16 +1,16 @@ ---- -layout: post -category: announcements -time: 6:00 PM -description: The course will now be held on Fridays from 2-3 PM in DCL 1310. ---- - -Based on the results of the poll, we have decided to move the CS 491 CAP lecture to Fridays from 2-3 PM in DCL 1310. We have also increased the course capacity to 75. We are aware that this time does not work for everyone, and we apologize if moving the course has made it infeasible for you to attend. However, this is the time that works for the most students that we are also able to teach the course. - -
- -If you are not able to attend the lecture, you can still follow along with the material and assignments on the course website. We will not be able to record the lectures, but we will be posting our lecture slides and links to additional self-practice resources on the course website. As always, if you have any questions, feel free to ask them during our regular SIG-ICPC practices on Tuesdays from 6-8 PM in Siebel 0218. - -
- -For those interested in competing in the Mid-Central Regionals, completion of the weekly problem sets will be sufficient to qualify for participation in Regionals. Attendance or registration in the course is no longer mandatory. +--- +layout: post +category: announcements +time: 6:00 PM +description: The course will now be held on Fridays from 2-3 PM in DCL 1310. +--- + +Based on the results of the poll, we have decided to move the CS 491 CAP lecture to Fridays from 2-3 PM in DCL 1310. We have also increased the course capacity to 75. We are aware that this time does not work for everyone, and we apologize if moving the course has made it infeasible for you to attend. However, this is the time that works for the most students that we are also able to teach the course. + +
+ +If you are not able to attend the lecture, you can still follow along with the material and assignments on the course website. We will not be able to record the lectures, but we will be posting our lecture slides and links to additional self-practice resources on the course website. As always, if you have any questions, feel free to ask them during our regular SIG-ICPC practices on Tuesdays from 6-8 PM in Siebel 0218. + +
+ +For those interested in competing in the Mid-Central Regionals, completion of the weekly problem sets will be sufficient to qualify for participation in Regionals. Attendance or registration in the course is no longer mandatory. diff --git a/_posts/_archive/2015-09-03-Fall-2015-Practice-2-Summary.md b/_posts/_archive/2015-09-03-Fall-2015-Practice-2-Summary.md index cd2f834..ef4bd65 100644 --- a/_posts/_archive/2015-09-03-Fall-2015-Practice-2-Summary.md +++ b/_posts/_archive/2015-09-03-Fall-2015-Practice-2-Summary.md @@ -1,52 +1,52 @@ ---- -layout: post -category: practices -time: 1:00 PM -description: Tryouts will be on September 12th and September 19th ---- -

Practice Summary

-In this practice we covered the basics of ICPC to new members. If you missed the practice then check out these [slides][5] -
-
-New members who are at least proficient in either Java, C++, or C should register for the CS 491 CAP course (more information on that below). -
-
-If you are not proficient in one of those languages then we recommend you use the [USACO resources][7] to get started. -
-
-Also if you haven’t signed up for the mailing list, then sign up ASAP [here][2] - -

Tryouts

-The tryouts for regionals are coming up! -
-When: September 12th and September 19th, 12 to 5 PM -
-Where: TBA - -

Problem Set 1

-We will be using the [Peking Online Judge][6] for our problem sets. -
-This week’s problem set can be found here: [Problem Set 1][3] - -

CS 491 CAP

-ICPC has a 1 credit hour seminar course this semester, CS 491 CAP. -
-When: Fridays, 2 to 3 PM -
-Where: DCL 1310 -
-Prerequisite: Proficiency in Java, C++, or C -
-Resources: -
-[Course Website][1] -
-[Piazza][4] - -[1]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Home -[2]: https://www-s.acm.uiuc.edu/cgi-bin/mailman/listinfo/icpc-l -[3]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Problem+Set+%231 -[4]: https://piazza.com/class#fall2015/cs491cap -[5]: https://wiki.cites.illinois.edu/wiki/download/attachments/556302398/lecture1_intro.pdf?version=2&modificationDate=1440650094000&api=v2 -[6]: http://poj.org/ -[7]: http://train.usaco.org/usacogate +--- +layout: post +category: practices +time: 1:00 PM +description: Tryouts will be on September 12th and September 19th +--- +

Practice Summary

+In this practice we covered the basics of ICPC to new members. If you missed the practice then check out these [slides][5] +
+
+New members who are at least proficient in either Java, C++, or C should register for the CS 491 CAP course (more information on that below). +
+
+If you are not proficient in one of those languages then we recommend you use the [USACO resources][7] to get started. +
+
+Also if you haven’t signed up for the mailing list, then sign up ASAP [here][2] + +

Tryouts

+The tryouts for regionals are coming up! +
+When: September 12th and September 19th, 12 to 5 PM +
+Where: TBA + +

Problem Set 1

+We will be using the [Peking Online Judge][6] for our problem sets. +
+This week’s problem set can be found here: [Problem Set 1][3] + +

CS 491 CAP

+ICPC has a 1 credit hour seminar course this semester, CS 491 CAP. +
+When: Fridays, 2 to 3 PM +
+Where: DCL 1310 +
+Prerequisite: Proficiency in Java, C++, or C +
+Resources: +
+[Course Website][1] +
+[Piazza][4] + +[1]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Home +[2]: https://www-s.acm.uiuc.edu/cgi-bin/mailman/listinfo/icpc-l +[3]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Problem+Set+%231 +[4]: https://piazza.com/class#fall2015/cs491cap +[5]: https://wiki.cites.illinois.edu/wiki/download/attachments/556302398/lecture1_intro.pdf?version=2&modificationDate=1440650094000&api=v2 +[6]: http://poj.org/ +[7]: http://train.usaco.org/usacogate diff --git a/_posts/_archive/2015-09-08-Fall-2015-Practice-3-Summary.md b/_posts/_archive/2015-09-08-Fall-2015-Practice-3-Summary.md index ef04126..5058252 100644 --- a/_posts/_archive/2015-09-08-Fall-2015-Practice-3-Summary.md +++ b/_posts/_archive/2015-09-08-Fall-2015-Practice-3-Summary.md @@ -1,46 +1,46 @@ ---- -layout: post -category: practices -time: 1:00 PM -description: Tryouts this Saturday (September 12th) at 12:00PM ---- -

Practice Summary

-In this practice we worked on the first [Problem set 1][3]. -
-We had a good amount of people show up and questions were asked about all the problems from the problemset. - -

Tryouts

-First Tryout is this Saturday at 12:00PM! -
-When: September 12th and September 19th, 12 to 5 PM -
-Where: TBA (Check you emails). -
- -

Problem Set 2

-We will be using the [Uva Online Judge][5] for our problem sets. -
-This week’s problem set can be found here: [Problem Set 2][7] - -

CS 491 CAP

-ICPC has a 1 credit hour seminar course this semester, CS 491 CAP. -
-When: Fridays, 2 to 3 PM -
-Where: DCL 1310 -
-Prerequisite: Proficiency in Java, C++, or C -
-Resources: -
-[Course Website][1] -
-[Piazza][4] - -[1]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Home -[2]: https://www-s.acm.uiuc.edu/cgi-bin/mailman/listinfo/icpc-l -[3]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Problem+Set+%231 -[4]: https://piazza.com/class#fall2015/cs491cap -[5]: https://uva.onlinejudge.org/ -[6]: http://train.usaco.org/usacogate +--- +layout: post +category: practices +time: 1:00 PM +description: Tryouts this Saturday (September 12th) at 12:00PM +--- +

Practice Summary

+In this practice we worked on the first [Problem set 1][3]. +
+We had a good amount of people show up and questions were asked about all the problems from the problemset. + +

Tryouts

+First Tryout is this Saturday at 12:00PM! +
+When: September 12th and September 19th, 12 to 5 PM +
+Where: TBA (Check you emails). +
+ +

Problem Set 2

+We will be using the [Uva Online Judge][5] for our problem sets. +
+This week’s problem set can be found here: [Problem Set 2][7] + +

CS 491 CAP

+ICPC has a 1 credit hour seminar course this semester, CS 491 CAP. +
+When: Fridays, 2 to 3 PM +
+Where: DCL 1310 +
+Prerequisite: Proficiency in Java, C++, or C +
+Resources: +
+[Course Website][1] +
+[Piazza][4] + +[1]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Home +[2]: https://www-s.acm.uiuc.edu/cgi-bin/mailman/listinfo/icpc-l +[3]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Problem+Set+%231 +[4]: https://piazza.com/class#fall2015/cs491cap +[5]: https://uva.onlinejudge.org/ +[6]: http://train.usaco.org/usacogate [7]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Problem+Set+%232 \ No newline at end of file diff --git a/_posts/_archive/2015-09-15-Fall-2015-Practice-4-Summary.md b/_posts/_archive/2015-09-15-Fall-2015-Practice-4-Summary.md index 1724833..d28cff3 100644 --- a/_posts/_archive/2015-09-15-Fall-2015-Practice-4-Summary.md +++ b/_posts/_archive/2015-09-15-Fall-2015-Practice-4-Summary.md @@ -1,32 +1,32 @@ ---- -layout: post -category: practices -time: 1:00 PM -description: Tryouts this Saturday (September 19th) at 12:00PM ---- -

Practice Summary

-In this practice we worked on the first [Problem set 2][3] and mostly cover the first 5 problems. -We went over standard libraries and discussed problems from [Problem Set 3][7]. - -

Tryouts

-Tryout is this Saturday at 12:00PM! -
-When: September 12th and September 19th, 12 to 5 PM -
-Where: DCL Basement Room 520L -
- -

Problem Set 3

-We will be using the [Uva Online Judge][5] and [Peking Online Judge][8] for our problem sets. -
-This week’s problem set can be found here: [Problem Set 3][7] - - -[1]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Home -[2]: https://www-s.acm.uiuc.edu/cgi-bin/mailman/listinfo/icpc-l -[3]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Problem+Set+%232 -[4]: https://piazza.com/class#fall2015/cs491cap -[5]: https://uva.onlinejudge.org/ -[6]: http://train.usaco.org/usacogate -[7]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Problem+Set+%233 +--- +layout: post +category: practices +time: 1:00 PM +description: Tryouts this Saturday (September 19th) at 12:00PM +--- +

Practice Summary

+In this practice we worked on the first [Problem set 2][3] and mostly cover the first 5 problems. +We went over standard libraries and discussed problems from [Problem Set 3][7]. + +

Tryouts

+Tryout is this Saturday at 12:00PM! +
+When: September 12th and September 19th, 12 to 5 PM +
+Where: DCL Basement Room 520L +
+ +

Problem Set 3

+We will be using the [Uva Online Judge][5] and [Peking Online Judge][8] for our problem sets. +
+This week’s problem set can be found here: [Problem Set 3][7] + + +[1]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Home +[2]: https://www-s.acm.uiuc.edu/cgi-bin/mailman/listinfo/icpc-l +[3]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Problem+Set+%232 +[4]: https://piazza.com/class#fall2015/cs491cap +[5]: https://uva.onlinejudge.org/ +[6]: http://train.usaco.org/usacogate +[7]: https://wiki.cites.illinois.edu/wiki/display/cs491cap/Problem+Set+%233 [8]: http://poj.org/ \ No newline at end of file diff --git a/_posts/_archive/2015-10-03-Second-ICPC-Tryout.md b/_posts/_archive/2015-10-03-Second-ICPC-Tryout.md index 2846b66..21a15c9 100644 --- a/_posts/_archive/2015-10-03-Second-ICPC-Tryout.md +++ b/_posts/_archive/2015-10-03-Second-ICPC-Tryout.md @@ -1,18 +1,18 @@ ---- -layout: post -category: announcements -time: 2:00 PM -description: Second ICPC regionals tryouts this Saturday! ---- - -This Saturday will be the second round of tryouts to determine regional teams. -
-If you registered for the tryouts next week, you should have received an e-mail from ICPC adding you to one of the teams for the North American Qualification Contest. Closer to the contest date, you should receive instructions and credentials to log into the contest environment. -
-The tryout will run from 11am-4pm in DCL L520. Food and drinks for be provided to all -participants. -
-All participants are allowed to bring printed reference material. These reference material can contain any information that could assist you during the tryout. Materials can be coded algorithms or a motivating picture. Look at [Stanford's notebook for reference][1]. - -
+--- +layout: post +category: announcements +time: 2:00 PM +description: Second ICPC regionals tryouts this Saturday! +--- + +This Saturday will be the second round of tryouts to determine regional teams. +
+If you registered for the tryouts next week, you should have received an e-mail from ICPC adding you to one of the teams for the North American Qualification Contest. Closer to the contest date, you should receive instructions and credentials to log into the contest environment. +
+The tryout will run from 11am-4pm in DCL L520. Food and drinks for be provided to all +participants. +
+All participants are allowed to bring printed reference material. These reference material can contain any information that could assist you during the tryout. Materials can be coded algorithms or a motivating picture. Look at [Stanford's notebook for reference][1]. + +
[1]:https://web.stanford.edu/~liszt90/acm/notebook.html \ No newline at end of file diff --git a/_posts/_archive/2015-10-04-Second-ICPC-Tryout-Results.md b/_posts/_archive/2015-10-04-Second-ICPC-Tryout-Results.md index d5d50c1..33685ec 100644 --- a/_posts/_archive/2015-10-04-Second-ICPC-Tryout-Results.md +++ b/_posts/_archive/2015-10-04-Second-ICPC-Tryout-Results.md @@ -1,50 +1,50 @@ ---- -layout: post -category: announcements -time: 11:00 AM -description: Results of the second regionals tryouts ---- - -Congratulations to Siwakorn Srisakaokul, who again topped our tryouts contest on Saturday! At Saturday's contest, Siwakorn solved all 11 of the problems with over 80 minutes to spare! Congratulations also go to Xin Gao and Lan Dao, who took second and third place, respectively, by solving 10 of the 11 problems! The full contest scoreboard is given below. - -
- -We have now completed our tryouts and will start selecting regionals teams. We will be taking into account your rankings in the two tryouts, the problems you solved in each, and your problem set completion for CS 491 CAP. We can normally take between 4 and 6 teams to regionals, depending on site availability, so we will be forming and registering the top 6 teams. We will announce the teams by the end of the week. - -
- -If there are some students with whom you work well and would like to be on a team, please let us know and we will factor those preferences into our decision making process. Please send Uttam these preferences by no later than 11:59 PM on Wednesday, October 7th. - -

- -
-# Scoreboard - - -| Place | Name | # Solved | Time | A | B | C | D | E | F | G | H | I | J | K | -|:-----:|:----:|:--------:|:----:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| -| 1 | Siwakorn Srisakaokul | 11 | 1062 | 1 / 22 | 1 / 121 | 1 / 187 | 1 / 40 | 2 / 220 | 1 / 32 | 1 / 73 | 1 / 50 | 1 / 28 | 2 / 96 | 1 / 153 | -| 2 | Xin Gao | 10 | 1284 | 1 / 30 | 1 / 290 | 2 / 147 | 1 / 94 | 1 / 171 | 1 / 41 | 4 / 260 | 1 / 57 | 1 / 36 | 1 / 78 | -- | -| 3 | Lan Dao | 10 | 1526 | 1 / 55 | 1 / 296 | 1 / 257 | 1 / 66 | 1 / 274 | 1 / 27 | 1 / 134 | 5 / 142 | 2 / 16 | 1 / 159 | -- | -| 4 | Ryan Jian | 8 | 880 | 1 / 20 | 10 / 286 | -- | 3 / 92 | -- | 1 / 39 | 2 / -- | 1 / 35 | 1 / 3 | 1 / 62 | 1 / 123 | -| 5 | Yewen Fan | 8 | 1035 | 1 / 57 | 1 / 151 | 1 / 210 | 1 / 233 | 3 / -- | 1 / 52 | -- | 1 / 67 | 1 / 42 | 4 / 163 | -- | -| 6 | Yuting Zhang | 7 | 777 | 1 / 42 | 1 / 299 | -- | 2 / 105 | -- | 1 / 57 | 1 / -- | 1 / 70 | 1 / 50 | 1 / 134 | -- | -| 7 | Matthew Worley | 7 | 881 | 1 / 35 | 1 / 221 | -- | -- | 1 / 254 | 1 / 52 | -- | 1 / 68 | 2 / 44 | 2 / 167 | -- | -| 8 | Xusheng Zhang | 7 | 1198 | 1 / 116 | 3 / 295 | -- | 2 / 192 | -- | 1 / 59 | -- | 1 / 131 | 1 / 45 | 2 / 280 | -- | -| 9 | Jeongseok Son | 6 | 799 | 4 / 79 | 1 / 195 | -- | 1 / -- | -- | 1 / 92 | -- | 1 / 109 | 1 / 16 | 1 / 248 | -- | -| 10 | Ziao Chen | 6 | 801 | -- | 1 / 110 | 4 / -- | 2 / 87 | -- | 1 / 44 | -- | 1 / 216 | 1 / 29 | 1 / 295 | -- | -| 11 | Shunping Xie | 6 | 958 | 4 / 165 | 1 / 254 | -- | 1 / -- | -- | 1 / 54 | -- | 1 / 67 | 2 / 45 | 1 / 293 | -- | -| 12 | Guiping Xie | 6 | 1297 | 7 / 290 | 6 / 299 | -- | -- | -- | 1 / 52 | -- | 1 / 67 | 1 / 41 | 4 / 268 | -- | -| 13 | Animesh Tripathi | 5 | 359 | 1 / 98 | 5 / -- | -- | 4 / -- | -- | 2 / 53 | -- | 1 / 41 | 1 / 11 | 1 / 136 | -- | -| 14 | Ryan Wolfe | 5 | 677 | 2 / 129 | 1 / 225 | -- | -- | -- | 1 / 100 | -- | 1 / 115 | 1 / 88 | -- | -- | -| 15 | Yu-De Chen | 5 | 988 | 4 / 271 | 1 / 236 | -- | 2 / -- | -- | 1 / 150 | -- | 1 / 163 | 2 / 88 | -- | -- | -| 16 | Nicholas Lu | 4 | 200 | 1 / 32 | -- | -- | 1 / -- | -- | 1 / 65 | -- | 1 / 59 | 1 / 44 | -- | -- | -| 17 | Danielle Sponseller | 4 | 774 | -- | -- | -- | -- | 1 / 91 | 1 / 190 | -- | 3 / 215 | 1 / 238 | -- | -- | -| 18 | Phillip Shih | 3 | 182 | 4 / -- | -- | -- | 1 / -- | -- | 1 / 35 | -- | 1 / 81 | 3 / 26 | -- | -- | -| 19 | Zonglin Li | 3 | 192 | 2 / -- | -- | -- | -- | -- | 2 / 67 | -- | 1 / 84 | 1 / 21 | -- | -- | -| 20 | Yuta Inoue | 3 | 192 | 6 / -- | -- | -- | 1 / -- | -- | 2 / 34 | -- | 1 / 126 | 1 / 12 | -- | -- | -| 21 | Enkh-Ider Jargalsaikhan | 3 | 522 | 7 / -- | -- | -- | -- | -- | 2 / 93 | -- | 2 / 266 | 2 / 103 | -- | -- | -| 22 | Zheyi Zhu | 2 | 157 | -- | -- | -- | -- | -- | -- | -- | 1 / 89 | 1 / 68 | -- | -- | -| 23 | Aahan Agrawal | 2 | 291 | 1 / 94 | 1 / 197 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -| 24 | Akashdeep Deb | 1 | 232 | -- | -- | -- | -- | -- | -- | -- | 2 / 212 | -- | -- | -- | -
+--- +layout: post +category: announcements +time: 11:00 AM +description: Results of the second regionals tryouts +--- + +Congratulations to Siwakorn Srisakaokul, who again topped our tryouts contest on Saturday! At Saturday's contest, Siwakorn solved all 11 of the problems with over 80 minutes to spare! Congratulations also go to Xin Gao and Lan Dao, who took second and third place, respectively, by solving 10 of the 11 problems! The full contest scoreboard is given below. + +
+ +We have now completed our tryouts and will start selecting regionals teams. We will be taking into account your rankings in the two tryouts, the problems you solved in each, and your problem set completion for CS 491 CAP. We can normally take between 4 and 6 teams to regionals, depending on site availability, so we will be forming and registering the top 6 teams. We will announce the teams by the end of the week. + +
+ +If there are some students with whom you work well and would like to be on a team, please let us know and we will factor those preferences into our decision making process. Please send Uttam these preferences by no later than 11:59 PM on Wednesday, October 7th. + +

+ +
+# Scoreboard + + +| Place | Name | # Solved | Time | A | B | C | D | E | F | G | H | I | J | K | +|:-----:|:----:|:--------:|:----:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| +| 1 | Siwakorn Srisakaokul | 11 | 1062 | 1 / 22 | 1 / 121 | 1 / 187 | 1 / 40 | 2 / 220 | 1 / 32 | 1 / 73 | 1 / 50 | 1 / 28 | 2 / 96 | 1 / 153 | +| 2 | Xin Gao | 10 | 1284 | 1 / 30 | 1 / 290 | 2 / 147 | 1 / 94 | 1 / 171 | 1 / 41 | 4 / 260 | 1 / 57 | 1 / 36 | 1 / 78 | -- | +| 3 | Lan Dao | 10 | 1526 | 1 / 55 | 1 / 296 | 1 / 257 | 1 / 66 | 1 / 274 | 1 / 27 | 1 / 134 | 5 / 142 | 2 / 16 | 1 / 159 | -- | +| 4 | Ryan Jian | 8 | 880 | 1 / 20 | 10 / 286 | -- | 3 / 92 | -- | 1 / 39 | 2 / -- | 1 / 35 | 1 / 3 | 1 / 62 | 1 / 123 | +| 5 | Yewen Fan | 8 | 1035 | 1 / 57 | 1 / 151 | 1 / 210 | 1 / 233 | 3 / -- | 1 / 52 | -- | 1 / 67 | 1 / 42 | 4 / 163 | -- | +| 6 | Yuting Zhang | 7 | 777 | 1 / 42 | 1 / 299 | -- | 2 / 105 | -- | 1 / 57 | 1 / -- | 1 / 70 | 1 / 50 | 1 / 134 | -- | +| 7 | Matthew Worley | 7 | 881 | 1 / 35 | 1 / 221 | -- | -- | 1 / 254 | 1 / 52 | -- | 1 / 68 | 2 / 44 | 2 / 167 | -- | +| 8 | Xusheng Zhang | 7 | 1198 | 1 / 116 | 3 / 295 | -- | 2 / 192 | -- | 1 / 59 | -- | 1 / 131 | 1 / 45 | 2 / 280 | -- | +| 9 | Jeongseok Son | 6 | 799 | 4 / 79 | 1 / 195 | -- | 1 / -- | -- | 1 / 92 | -- | 1 / 109 | 1 / 16 | 1 / 248 | -- | +| 10 | Ziao Chen | 6 | 801 | -- | 1 / 110 | 4 / -- | 2 / 87 | -- | 1 / 44 | -- | 1 / 216 | 1 / 29 | 1 / 295 | -- | +| 11 | Shunping Xie | 6 | 958 | 4 / 165 | 1 / 254 | -- | 1 / -- | -- | 1 / 54 | -- | 1 / 67 | 2 / 45 | 1 / 293 | -- | +| 12 | Guiping Xie | 6 | 1297 | 7 / 290 | 6 / 299 | -- | -- | -- | 1 / 52 | -- | 1 / 67 | 1 / 41 | 4 / 268 | -- | +| 13 | Animesh Tripathi | 5 | 359 | 1 / 98 | 5 / -- | -- | 4 / -- | -- | 2 / 53 | -- | 1 / 41 | 1 / 11 | 1 / 136 | -- | +| 14 | Ryan Wolfe | 5 | 677 | 2 / 129 | 1 / 225 | -- | -- | -- | 1 / 100 | -- | 1 / 115 | 1 / 88 | -- | -- | +| 15 | Yu-De Chen | 5 | 988 | 4 / 271 | 1 / 236 | -- | 2 / -- | -- | 1 / 150 | -- | 1 / 163 | 2 / 88 | -- | -- | +| 16 | Nicholas Lu | 4 | 200 | 1 / 32 | -- | -- | 1 / -- | -- | 1 / 65 | -- | 1 / 59 | 1 / 44 | -- | -- | +| 17 | Danielle Sponseller | 4 | 774 | -- | -- | -- | -- | 1 / 91 | 1 / 190 | -- | 3 / 215 | 1 / 238 | -- | -- | +| 18 | Phillip Shih | 3 | 182 | 4 / -- | -- | -- | 1 / -- | -- | 1 / 35 | -- | 1 / 81 | 3 / 26 | -- | -- | +| 19 | Zonglin Li | 3 | 192 | 2 / -- | -- | -- | -- | -- | 2 / 67 | -- | 1 / 84 | 1 / 21 | -- | -- | +| 20 | Yuta Inoue | 3 | 192 | 6 / -- | -- | -- | 1 / -- | -- | 2 / 34 | -- | 1 / 126 | 1 / 12 | -- | -- | +| 21 | Enkh-Ider Jargalsaikhan | 3 | 522 | 7 / -- | -- | -- | -- | -- | 2 / 93 | -- | 2 / 266 | 2 / 103 | -- | -- | +| 22 | Zheyi Zhu | 2 | 157 | -- | -- | -- | -- | -- | -- | -- | 1 / 89 | 1 / 68 | -- | -- | +| 23 | Aahan Agrawal | 2 | 291 | 1 / 94 | 1 / 197 | -- | -- | -- | -- | -- | -- | -- | -- | -- | +| 24 | Akashdeep Deb | 1 | 232 | -- | -- | -- | -- | -- | -- | -- | 2 / 212 | -- | -- | -- | +
diff --git a/_posts/_archive/2015-10-12-regionals-team-announcements.md b/_posts/_archive/2015-10-12-regionals-team-announcements.md index c821b02..da3f9a2 100644 --- a/_posts/_archive/2015-10-12-regionals-team-announcements.md +++ b/_posts/_archive/2015-10-12-regionals-team-announcements.md @@ -1,82 +1,82 @@ ---- -layout: post -category: announcements -time: 12:00 PM -description: Announcement of the teams for the 2015 ICPC Mid-Central Regionals. ---- - -Congratulations to the following people, who made it onto teams for regionals! - -
- -**Team 1:** - - * Siwakorn Srisakaokul - * Lan Dao - * Xin Gao - -
- -**Team 2:** - - * Ryan Jian - * Matthew Worley - * Yan Han - -
- -**Team 3:** - - * Yewen Fan - * Xusheng Zhang - * Yuting Zhang - -
- -**Team 4:** - - * Shunping Xie - * Guiping Xie - * Ziao Chen - -
- -**Team 5:** - - * Arthur Li - * Haozhen Ding - * Jeongseok Son - -
- -**Team 6:** - - * Yu-De Chen - * Animesh Tripathi - * Jing Huang - -
- - -If you are listed above as being on a team, please make sure to attend -tomorrow's Tuesday practice, as we will be choosing team names and registering -you for the regionals competition. If you cannot make the practice for any -reason, please let me know as soon as possible so I can make sure you -complete the registration before tomorrow. - -
- -As we mentioned at the tryouts, due to limited space at our Regionals site, -we can only guarantee that the first four teams will be able to attend -Regionals. We will know by October 26th how many more of the teams will be -able to attend, but until then, all of the students mentioned above should be -practicing with their team with the expectation that they will be attending -Regionals. - -
- -If you did not make it on a team, don't feel discouraged -- the competition -was fierce this year, and we spent quite a bit of time trying to decide who to -take to Regionals. We encourage you to continue practicing and try out again -next year. Some of the people who made it onto teams this year were in the -same situation as you last year. +--- +layout: post +category: announcements +time: 12:00 PM +description: Announcement of the teams for the 2015 ICPC Mid-Central Regionals. +--- + +Congratulations to the following people, who made it onto teams for regionals! + +
+ +**Team 1:** + + * Siwakorn Srisakaokul + * Lan Dao + * Xin Gao + +
+ +**Team 2:** + + * Ryan Jian + * Matthew Worley + * Yan Han + +
+ +**Team 3:** + + * Yewen Fan + * Xusheng Zhang + * Yuting Zhang + +
+ +**Team 4:** + + * Shunping Xie + * Guiping Xie + * Ziao Chen + +
+ +**Team 5:** + + * Arthur Li + * Haozhen Ding + * Jeongseok Son + +
+ +**Team 6:** + + * Yu-De Chen + * Animesh Tripathi + * Jing Huang + +
+ + +If you are listed above as being on a team, please make sure to attend +tomorrow's Tuesday practice, as we will be choosing team names and registering +you for the regionals competition. If you cannot make the practice for any +reason, please let me know as soon as possible so I can make sure you +complete the registration before tomorrow. + +
+ +As we mentioned at the tryouts, due to limited space at our Regionals site, +we can only guarantee that the first four teams will be able to attend +Regionals. We will know by October 26th how many more of the teams will be +able to attend, but until then, all of the students mentioned above should be +practicing with their team with the expectation that they will be attending +Regionals. + +
+ +If you did not make it on a team, don't feel discouraged -- the competition +was fierce this year, and we spent quite a bit of time trying to decide who to +take to Regionals. We encourage you to continue practicing and try out again +next year. Some of the people who made it onto teams this year were in the +same situation as you last year. diff --git a/_posts/_archive/2015-10-3-ICPC-Tryout.md b/_posts/_archive/2015-10-3-ICPC-Tryout.md index d4cabf5..4b8996d 100644 --- a/_posts/_archive/2015-10-3-ICPC-Tryout.md +++ b/_posts/_archive/2015-10-3-ICPC-Tryout.md @@ -1,18 +1,18 @@ ---- -layout: post -category: announcements -time: 2:00 PM -description: ICPC Second Tryout This Saturday! ---- - -This Saturday will be the second round of tryouts to determine regional teams. -
-If you registered for the tryouts next week, you should have received an e-mail from ICPC adding you to one of the teams for the North American Qualification Contest. Closer to the contest date, you should receive instructions and credentials to log into the contest environment. -
-The tryout will run from 11am-4pm in DCL 520L. Food and drinks for be provided to all -participants. -
-All participants are allowed to bring printed reference material. These reference material can contain any information that could assist you during the tryout. Materials can be coded algorithms or a motivating picture. Look at [Stanford's notebook for reference][1]. - -
+--- +layout: post +category: announcements +time: 2:00 PM +description: ICPC Second Tryout This Saturday! +--- + +This Saturday will be the second round of tryouts to determine regional teams. +
+If you registered for the tryouts next week, you should have received an e-mail from ICPC adding you to one of the teams for the North American Qualification Contest. Closer to the contest date, you should receive instructions and credentials to log into the contest environment. +
+The tryout will run from 11am-4pm in DCL 520L. Food and drinks for be provided to all +participants. +
+All participants are allowed to bring printed reference material. These reference material can contain any information that could assist you during the tryout. Materials can be coded algorithms or a motivating picture. Look at [Stanford's notebook for reference][1]. + +
[1]:https://web.stanford.edu/~liszt90/acm/notebook.html \ No newline at end of file diff --git a/_posts/_archive/2016-01-19-Welcome-back!.md b/_posts/_archive/2016-01-19-Welcome-back!.md index 958ed65..49d83a1 100644 --- a/_posts/_archive/2016-01-19-Welcome-back!.md +++ b/_posts/_archive/2016-01-19-Welcome-back!.md @@ -1,28 +1,28 @@ ---- -layout: post -category: announcements -time: 10:00 AM -description: Get ready for another season of ICPC! ---- - -Welcome back from winter break! We hope everyone is well-rested and ready for -ICPC! - -
- -Our first meeting of the semester will be on Tuesday, January 26th from -6-8 PM in 0218 Siebel Center. Our first meeting will be a welcome meeting, -so we will be explaining how ICPC works and answering any questions about ICPC -that you may have. Bring anyone you know who might be interested -in ICPC! - -
-This semester, our practices will be designed to teach you how to solve -algorithmic programming problems of different varieties at different difficulty -levels. Unlike the fall semester,the practices will be much more -hands-on and geared to everyone's individual skill levels. If you were deterred from -our practices last semester due to the pace, you should find our practices this -semester more approachable and valuable. -
-
-We hope to see everyone at the kickoff ICPC meeting! +--- +layout: post +category: announcements +time: 10:00 AM +description: Get ready for another season of ICPC! +--- + +Welcome back from winter break! We hope everyone is well-rested and ready for +ICPC! + +
+ +Our first meeting of the semester will be on Tuesday, January 26th from +6-8 PM in 0218 Siebel Center. Our first meeting will be a welcome meeting, +so we will be explaining how ICPC works and answering any questions about ICPC +that you may have. Bring anyone you know who might be interested +in ICPC! + +
+This semester, our practices will be designed to teach you how to solve +algorithmic programming problems of different varieties at different difficulty +levels. Unlike the fall semester,the practices will be much more +hands-on and geared to everyone's individual skill levels. If you were deterred from +our practices last semester due to the pace, you should find our practices this +semester more approachable and valuable. +
+
+We hope to see everyone at the kickoff ICPC meeting! diff --git a/_posts/_archive/2016-01-25-Spring-2016-Practice-1-Summary.md b/_posts/_archive/2016-01-25-Spring-2016-Practice-1-Summary.md index 2b6f8c7..4ceb72b 100644 --- a/_posts/_archive/2016-01-25-Spring-2016-Practice-1-Summary.md +++ b/_posts/_archive/2016-01-25-Spring-2016-Practice-1-Summary.md @@ -1,20 +1,20 @@ ---- -layout: post -category: practices -time: 1:00 PM -description: Summary of Meeting ---- -

Practice Summary

-In this practice we had a 60-minute practice competition. The competition consisted of 3 questions. -
Only 4 people were able to complete at least one problem. - -

Questions:

-Questions 1: [Uva 156][1] -
-Questions 2: [Codeforces 614A][2] -
-Questions 3: [Codeforces 614B][3] - -[1]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=92 -[2]: http://codeforces.com/problemset/problem/614/A +--- +layout: post +category: practices +time: 1:00 PM +description: Summary of Meeting +--- +

Practice Summary

+In this practice we had a 60-minute practice competition. The competition consisted of 3 questions. +
Only 4 people were able to complete at least one problem. + +

Questions:

+Questions 1: [Uva 156][1] +
+Questions 2: [Codeforces 614A][2] +
+Questions 3: [Codeforces 614B][3] + +[1]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=92 +[2]: http://codeforces.com/problemset/problem/614/A [3]: http://codeforces.com/problemset/problem/614/B \ No newline at end of file diff --git a/_posts/_archive/2016-02-16-Spring-2016-Practice-4-Summary.md b/_posts/_archive/2016-02-16-Spring-2016-Practice-4-Summary.md index f2ecc33..8fc6b89 100644 --- a/_posts/_archive/2016-02-16-Spring-2016-Practice-4-Summary.md +++ b/_posts/_archive/2016-02-16-Spring-2016-Practice-4-Summary.md @@ -1,28 +1,28 @@ ---- -layout: post -category: practices -time: 1:00 PM -description: Summary of Meeting ---- -

Practice Summary

-In this practice we had a 75-minute practice competition. The competition consisted of 5 questions. -
- -

Questions:

-Questions 1: [Codeforces 622B][1] -
-Questions 2: [Uva 10190][2] -
-Questions 3: [Codeforces 621B][3] -
-Questions 4: [Uva 12855][4] -
-Questions 5: [Uva 12751][5] - - - -[1]: http://codeforces.com/problemset/problem/622/B -[2]: https://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=1131 -[3]: http://codeforces.com/problemset/problem/621/B -[4]: https://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=4720 +--- +layout: post +category: practices +time: 1:00 PM +description: Summary of Meeting +--- +

Practice Summary

+In this practice we had a 75-minute practice competition. The competition consisted of 5 questions. +
+ +

Questions:

+Questions 1: [Codeforces 622B][1] +
+Questions 2: [Uva 10190][2] +
+Questions 3: [Codeforces 621B][3] +
+Questions 4: [Uva 12855][4] +
+Questions 5: [Uva 12751][5] + + + +[1]: http://codeforces.com/problemset/problem/622/B +[2]: https://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=1131 +[3]: http://codeforces.com/problemset/problem/621/B +[4]: https://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=4720 [5]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4604 \ No newline at end of file diff --git a/_posts/_archive/2016-02-2-Spring-2016-Practice-2-Summary .md b/_posts/_archive/2016-02-2-Spring-2016-Practice-2-Summary .md index c8a26ec..12192d0 100644 --- a/_posts/_archive/2016-02-2-Spring-2016-Practice-2-Summary .md +++ b/_posts/_archive/2016-02-2-Spring-2016-Practice-2-Summary .md @@ -1,30 +1,30 @@ ---- -layout: post -category: practices -time: 1:00 PM -description: Summary of Meeting ---- -

Practice Summary

-In this practice we had a 75-minute practice competition. The competition consisted of 6 questions. -
- -

Questions:

-Questions 1: [Codeforces 621A][1] -
-Questions 2: [Codeforces 615A][2] -
-Questions 3: [Codeforces 608A][3] -
-Questions 4: [Codeforces 595A][4] -
-Questions 5: [Codeforces 596A][5] -
-Questions 6: [Codeforces 593A][6] - - -[1]: http://codeforces.com/problemset/problem/621/A -[2]: http://codeforces.com/problemset/problem/615/A -[3]: http://codeforces.com/problemset/problem/608/A -[4]: http://codeforces.com/problemset/problem/595/A -[5]: http://codeforces.com/problemset/problem/596/A +--- +layout: post +category: practices +time: 1:00 PM +description: Summary of Meeting +--- +

Practice Summary

+In this practice we had a 75-minute practice competition. The competition consisted of 6 questions. +
+ +

Questions:

+Questions 1: [Codeforces 621A][1] +
+Questions 2: [Codeforces 615A][2] +
+Questions 3: [Codeforces 608A][3] +
+Questions 4: [Codeforces 595A][4] +
+Questions 5: [Codeforces 596A][5] +
+Questions 6: [Codeforces 593A][6] + + +[1]: http://codeforces.com/problemset/problem/621/A +[2]: http://codeforces.com/problemset/problem/615/A +[3]: http://codeforces.com/problemset/problem/608/A +[4]: http://codeforces.com/problemset/problem/595/A +[5]: http://codeforces.com/problemset/problem/596/A [6]: http://codeforces.com/problemset/problem/593/A \ No newline at end of file diff --git a/_posts/_archive/2016-02-23-Spring-2016-Practice-5-Summary.md b/_posts/_archive/2016-02-23-Spring-2016-Practice-5-Summary.md index 8b34cf2..fdec31b 100644 --- a/_posts/_archive/2016-02-23-Spring-2016-Practice-5-Summary.md +++ b/_posts/_archive/2016-02-23-Spring-2016-Practice-5-Summary.md @@ -1,28 +1,28 @@ ---- -layout: post -category: practices -time: 1:00 PM -description: Summary of Meeting ---- -

Practice Summary

-In this practice we had a 75-minute practice competition. The competition consisted of 5 questions. -
- -

Questions:

-Questions 1: [Uva 100][1] -
-Questions 2: [Uva 130][2] -
-Questions 3: [Uva 118][3] -
-Questions 4: [Uva 10273][4] -
-Questions 5: [Uva 11585][5] - - - -[1]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=36 -[2]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=66 -[3]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=54 -[4]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1214 +--- +layout: post +category: practices +time: 1:00 PM +description: Summary of Meeting +--- +

Practice Summary

+In this practice we had a 75-minute practice competition. The competition consisted of 5 questions. +
+ +

Questions:

+Questions 1: [Uva 100][1] +
+Questions 2: [Uva 130][2] +
+Questions 3: [Uva 118][3] +
+Questions 4: [Uva 10273][4] +
+Questions 5: [Uva 11585][5] + + + +[1]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=36 +[2]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=66 +[3]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=54 +[4]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1214 [5]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2632 \ No newline at end of file diff --git a/_posts/_archive/2016-02-9-Spring-2016-Practice-3-Summary.md b/_posts/_archive/2016-02-9-Spring-2016-Practice-3-Summary.md index 59a16ee..dd66fa8 100644 --- a/_posts/_archive/2016-02-9-Spring-2016-Practice-3-Summary.md +++ b/_posts/_archive/2016-02-9-Spring-2016-Practice-3-Summary.md @@ -1,28 +1,28 @@ ---- -layout: post -category: practices -time: 1:00 PM -description: Summary of Meeting ---- -

Practice Summary

-In this practice we had a 75-minute practice competition. The competition consisted of 6 questions. -
- -

Questions:

-Questions 1: [Uva 11417][1] -
-Questions 2: [Uva 12391][2] -
-Questions 3: [Uva 11496][3] -
-Questions 4: [Uva 11830][4] -
-Questions 5: [Uva 11839][5] - - - -[1]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2412 -[2]: https://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=3813 -[3]: https://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=2491 -[4]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2930 +--- +layout: post +category: practices +time: 1:00 PM +description: Summary of Meeting +--- +

Practice Summary

+In this practice we had a 75-minute practice competition. The competition consisted of 6 questions. +
+ +

Questions:

+Questions 1: [Uva 11417][1] +
+Questions 2: [Uva 12391][2] +
+Questions 3: [Uva 11496][3] +
+Questions 4: [Uva 11830][4] +
+Questions 5: [Uva 11839][5] + + + +[1]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2412 +[2]: https://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=3813 +[3]: https://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=2491 +[4]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2930 [5]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2939 \ No newline at end of file diff --git a/_posts/_archive/2016-03-1-Spring-2016-Practice-6-Summary.md b/_posts/_archive/2016-03-1-Spring-2016-Practice-6-Summary.md index 38861e3..0cf121a 100644 --- a/_posts/_archive/2016-03-1-Spring-2016-Practice-6-Summary.md +++ b/_posts/_archive/2016-03-1-Spring-2016-Practice-6-Summary.md @@ -1,31 +1,31 @@ ---- -layout: post -category: practices -time: 1:00 PM -description: Summary of Meeting ---- -

Practice Summary

-In this practice we had a 75-minute practice competition. The competition consisted of 6 questions. -
- -

Questions:

-Question 1: [SPOJ ELIS][1] -
-Question 2: [Uva 10405][2] -
-Question 3: [SPOJ COINS][3] -
-Question 4: [CodeForces 617A][4] -
-Question 5: [SPOJ TRT][5] -
-Question 6: [Uva 1124][6] - - - -[1]: http://www.spoj.com/problems/ELIS/en/ -[2]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1346 -[3]: http://www.spoj.com/problems/COINS/en/ -[4]: http://codeforces.com/problemset/problem/617/A -[5]: http://www.spoj.com/problems/TRT/en/ +--- +layout: post +category: practices +time: 1:00 PM +description: Summary of Meeting +--- +

Practice Summary

+In this practice we had a 75-minute practice competition. The competition consisted of 6 questions. +
+ +

Questions:

+Question 1: [SPOJ ELIS][1] +
+Question 2: [Uva 10405][2] +
+Question 3: [SPOJ COINS][3] +
+Question 4: [CodeForces 617A][4] +
+Question 5: [SPOJ TRT][5] +
+Question 6: [Uva 1124][6] + + + +[1]: http://www.spoj.com/problems/ELIS/en/ +[2]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1346 +[3]: http://www.spoj.com/problems/COINS/en/ +[4]: http://codeforces.com/problemset/problem/617/A +[5]: http://www.spoj.com/problems/TRT/en/ [6]: https://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=3565 \ No newline at end of file diff --git a/_posts/_archive/2016-03-15-Spring-2016-Practice-8-Summary.md b/_posts/_archive/2016-03-15-Spring-2016-Practice-8-Summary.md index 0c82a62..33bbf1e 100644 --- a/_posts/_archive/2016-03-15-Spring-2016-Practice-8-Summary.md +++ b/_posts/_archive/2016-03-15-Spring-2016-Practice-8-Summary.md @@ -1,30 +1,30 @@ ---- -layout: post -category: practices -time: 1:00 PM -description: Summary of Meeting ---- -

Practice Summary

-This week we focused solving basic math problems. -
-In this practice we had a 75-minute practice competition. The competition consisted of 5 questions. -
- -

Questions:

-Question 1: [Codeforces 230B][1] -
-Question 2: [Codeforces 124A][2] -
-Question 3: [Codeforces 92A][3] -
-Question 4: [Codeforces 1148A][4] -
-Question 5: [Uva 573][5] - - - -[1]: http://codeforces.com/problemset/problem/230/B -[2]: http://codeforces.com/problemset/problem/124/A -[3]: http://codeforces.com/problemset/problem/92/A -[4]: http://codeforces.com/problemset/problem/148/A +--- +layout: post +category: practices +time: 1:00 PM +description: Summary of Meeting +--- +

Practice Summary

+This week we focused solving basic math problems. +
+In this practice we had a 75-minute practice competition. The competition consisted of 5 questions. +
+ +

Questions:

+Question 1: [Codeforces 230B][1] +
+Question 2: [Codeforces 124A][2] +
+Question 3: [Codeforces 92A][3] +
+Question 4: [Codeforces 1148A][4] +
+Question 5: [Uva 573][5] + + + +[1]: http://codeforces.com/problemset/problem/230/B +[2]: http://codeforces.com/problemset/problem/124/A +[3]: http://codeforces.com/problemset/problem/92/A +[4]: http://codeforces.com/problemset/problem/148/A [5]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=514 \ No newline at end of file diff --git a/_posts/_archive/2016-03-29-Spring-2016-Practice-9-Summary.md b/_posts/_archive/2016-03-29-Spring-2016-Practice-9-Summary.md index 7351e5a..b11f029 100644 --- a/_posts/_archive/2016-03-29-Spring-2016-Practice-9-Summary.md +++ b/_posts/_archive/2016-03-29-Spring-2016-Practice-9-Summary.md @@ -1,41 +1,41 @@ ---- -layout: post -category: practices -time: 1:00 PM -description: Summary of Meeting ---- -

Practice Summary

-
-In this practice we had a 75-minute practice competition. The competition consisted of 9 questions. -
- -

Questions:

-Question 1: [Codeforces 71A][1] -
-Question 2: [Codeforces 534A][2] -
-Question 3: [Codeforces 574A][3] -
-Question 4: [Codeforces 4A][4] -
-Question 5: [Codeforces 340A][5] -
-Question 6: [Codeforces 350A][6] -
-Question 7: [Uva 10146][7] -
-Question 8: [Uva 10081][8] -
-Question 9: [Uva 101][9] - - - -[1]: http://codeforces.com/problemset/problem/71/A -[2]: http://codeforces.com/problemset/problem/534/A -[3]: http://codeforces.com/problemset/problem/574/A -[4]: http://codeforces.com/problemset/problem/4/A -[5]: http://codeforces.com/problemset/problem/340/A -[6]: http://codeforces.com/problemset/problem/350/A -[7]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1087 -[8]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1022 +--- +layout: post +category: practices +time: 1:00 PM +description: Summary of Meeting +--- +

Practice Summary

+
+In this practice we had a 75-minute practice competition. The competition consisted of 9 questions. +
+ +

Questions:

+Question 1: [Codeforces 71A][1] +
+Question 2: [Codeforces 534A][2] +
+Question 3: [Codeforces 574A][3] +
+Question 4: [Codeforces 4A][4] +
+Question 5: [Codeforces 340A][5] +
+Question 6: [Codeforces 350A][6] +
+Question 7: [Uva 10146][7] +
+Question 8: [Uva 10081][8] +
+Question 9: [Uva 101][9] + + + +[1]: http://codeforces.com/problemset/problem/71/A +[2]: http://codeforces.com/problemset/problem/534/A +[3]: http://codeforces.com/problemset/problem/574/A +[4]: http://codeforces.com/problemset/problem/4/A +[5]: http://codeforces.com/problemset/problem/340/A +[6]: http://codeforces.com/problemset/problem/350/A +[7]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1087 +[8]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1022 [9]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=37 \ No newline at end of file diff --git a/_posts/_archive/2016-03-8-Spring-2016-Practice-7-Summary.md b/_posts/_archive/2016-03-8-Spring-2016-Practice-7-Summary.md index 836b6cf..d6c09a4 100644 --- a/_posts/_archive/2016-03-8-Spring-2016-Practice-7-Summary.md +++ b/_posts/_archive/2016-03-8-Spring-2016-Practice-7-Summary.md @@ -1,33 +1,33 @@ ---- -layout: post -category: practices -time: 1:00 PM -description: Summary of Meeting ---- -

Practice Summary

-This week we focused solving basic graph problems. -
-In this practice we had a 75-minute practice competition. The competition consisted of 6 questions. -
- -

Questions:

-Question 1: [SPOJ PT07Y][1] -
-Question 2: [SPOJ ABCPATH][2] -
-Question 3: [Codeforces 520B][3] -
-Question 4: [Codeforces 136A][4] -
-Question 5: [Codeforces 236A][5] -
-Question 6: [SPOJ HERDING][6] - - - -[1]: http://www.spoj.com/problems/PT07Y/en/ -[2]: http://www.spoj.com/problems/ABCPATH/en/ -[3]: http://codeforces.com/problemset/problem/520/B -[4]: http://codeforces.com/problemset/problem/136/A -[5]: http://codeforces.com/problemset/problem/236/A +--- +layout: post +category: practices +time: 1:00 PM +description: Summary of Meeting +--- +

Practice Summary

+This week we focused solving basic graph problems. +
+In this practice we had a 75-minute practice competition. The competition consisted of 6 questions. +
+ +

Questions:

+Question 1: [SPOJ PT07Y][1] +
+Question 2: [SPOJ ABCPATH][2] +
+Question 3: [Codeforces 520B][3] +
+Question 4: [Codeforces 136A][4] +
+Question 5: [Codeforces 236A][5] +
+Question 6: [SPOJ HERDING][6] + + + +[1]: http://www.spoj.com/problems/PT07Y/en/ +[2]: http://www.spoj.com/problems/ABCPATH/en/ +[3]: http://codeforces.com/problemset/problem/520/B +[4]: http://codeforces.com/problemset/problem/136/A +[5]: http://codeforces.com/problemset/problem/236/A [6]: http://www.spoj.com/problems/HERDING/en/ \ No newline at end of file diff --git a/_posts/_archive/2016-04-5-Spring-2016-Practice-10-Summary.md b/_posts/_archive/2016-04-5-Spring-2016-Practice-10-Summary.md index 3478154..55403d8 100644 --- a/_posts/_archive/2016-04-5-Spring-2016-Practice-10-Summary.md +++ b/_posts/_archive/2016-04-5-Spring-2016-Practice-10-Summary.md @@ -1,33 +1,33 @@ ---- -layout: post -category: practices -time: 1:00 PM -description: Summary of Meeting ---- -

Practice Summary

-Today we learned how to talke intermediate dynamic programming problems. -
-In this practice we had a 75-minute practice competition. The competition consisted of 6 questions. -
- -

Questions:

-Question 1: [Codeforces 151A][1] -
-Question 2: [SPOJ IWGBS][2] -
-Question 3: [Uva 108][3] -
-Question 4: [Uva 10003][4] -
-Question 5: [Uva 11758][5] -
-Question 6: [Uva 11428][6] - - - -[1]: http://codeforces.com/problemset/problem/151/A -[2]: http://www.spoj.com/problems/IWGBS/en/ -[3]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=44 -[4]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=944 -[5]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2858 +--- +layout: post +category: practices +time: 1:00 PM +description: Summary of Meeting +--- +

Practice Summary

+Today we learned how to talke intermediate dynamic programming problems. +
+In this practice we had a 75-minute practice competition. The competition consisted of 6 questions. +
+ +

Questions:

+Question 1: [Codeforces 151A][1] +
+Question 2: [SPOJ IWGBS][2] +
+Question 3: [Uva 108][3] +
+Question 4: [Uva 10003][4] +
+Question 5: [Uva 11758][5] +
+Question 6: [Uva 11428][6] + + + +[1]: http://codeforces.com/problemset/problem/151/A +[2]: http://www.spoj.com/problems/IWGBS/en/ +[3]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=44 +[4]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=944 +[5]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2858 [6]: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2423 \ No newline at end of file diff --git a/_posts/_archive/2016-08-31-Fall-2016-Practice-1-Summary.md b/_posts/_archive/2016-08-31-Fall-2016-Practice-1-Summary.md index 58f17ad..383970f 100644 --- a/_posts/_archive/2016-08-31-Fall-2016-Practice-1-Summary.md +++ b/_posts/_archive/2016-08-31-Fall-2016-Practice-1-Summary.md @@ -1,50 +1,50 @@ ---- -layout: post -category: practices -time: 1:00 PM -description: Summary of Meeting ---- -

Practice Summary

-This meeting we ran two separate tracks, the advanced and beginner track. Each track had its own competition, but the beginner's competition acted as a workshop where everyone is encouraged to work together to solve the problems. In addition, members were informed on the rules of elgibility for the ICPC contests. -
- -

Beginner Questions:

-Questions 1: [Life, the Universe, and Everything][1] -
-Questions 2: [Adding Reversed Numbers][2] -
-Questions 3: [Codeforces 118A][3] -
-Questions 4: [Codeforces 124A][4] -
-Questions 5: [Codeforces 148A][5] -
-Questions 6: [Codeforces 148B][6] -
-Questions 7: [Codeforces 1A][7] -
-Questions 8: [Codeforces 4A][8] -
- -

Advanced Questions:

-Question 1: [Hardwood Species] [9] -
-Question 2: [The Triangle][10] -
-Question 3: [Mayor's Posters][11] - -

Meeting's Powerpoint

-[Power Point] [12] - -[1]: http://www.spoj.com/problems/TEST/en/ -[2]: http://www.spoj.com/problems/ADDREV/en/ -[3]: http://codeforces.com/problemset/problem/118/A -[4]: http://codeforces.com/problemset/problem/124/A -[5]: http://codeforces.com/problemset/problem/148/A -[6]: http://codeforces.com/problemset/problem/148/B -[7]: http://codeforces.com/problemset/problem/1/A -[8]: http://codeforces.com/problemset/problem/4/A -[9]: http://poj.org/problem?id=2418 -[10]: http://poj.org/problem?id=1163 -[11]: http://poj.org/problem?id=2528 +--- +layout: post +category: practices +time: 1:00 PM +description: Summary of Meeting +--- +

Practice Summary

+This meeting we ran two separate tracks, the advanced and beginner track. Each track had its own competition, but the beginner's competition acted as a workshop where everyone is encouraged to work together to solve the problems. In addition, members were informed on the rules of elgibility for the ICPC contests. +
+ +

Beginner Questions:

+Questions 1: [Life, the Universe, and Everything][1] +
+Questions 2: [Adding Reversed Numbers][2] +
+Questions 3: [Codeforces 118A][3] +
+Questions 4: [Codeforces 124A][4] +
+Questions 5: [Codeforces 148A][5] +
+Questions 6: [Codeforces 148B][6] +
+Questions 7: [Codeforces 1A][7] +
+Questions 8: [Codeforces 4A][8] +
+ +

Advanced Questions:

+Question 1: [Hardwood Species] [9] +
+Question 2: [The Triangle][10] +
+Question 3: [Mayor's Posters][11] + +

Meeting's Powerpoint

+[Power Point] [12] + +[1]: http://www.spoj.com/problems/TEST/en/ +[2]: http://www.spoj.com/problems/ADDREV/en/ +[3]: http://codeforces.com/problemset/problem/118/A +[4]: http://codeforces.com/problemset/problem/124/A +[5]: http://codeforces.com/problemset/problem/148/A +[6]: http://codeforces.com/problemset/problem/148/B +[7]: http://codeforces.com/problemset/problem/1/A +[8]: http://codeforces.com/problemset/problem/4/A +[9]: http://poj.org/problem?id=2418 +[10]: http://poj.org/problem?id=1163 +[11]: http://poj.org/problem?id=2528 [12]: /ppt/SIG-ICPC_Fall_2016_First_Meeting.pptx \ No newline at end of file diff --git a/_posts/_archive/2016-09-07-Fall-2016-Practice-2-Summary.md b/_posts/_archive/2016-09-07-Fall-2016-Practice-2-Summary.md index 30297dd..59052df 100644 --- a/_posts/_archive/2016-09-07-Fall-2016-Practice-2-Summary.md +++ b/_posts/_archive/2016-09-07-Fall-2016-Practice-2-Summary.md @@ -1,42 +1,42 @@ ---- -layout: post -category: practices -time: 1:00 PM -description: Summary of Meeting ---- -

Practice Summary

-This meeting we ran two separate tracks, the advanced and beginner track. Each track had its own competition, but the beginner's competition acted as a workshop where everyone is encouraged to work together to solve the problems. -
- -

Beginner Questions:

-Questions 1: [Codeforces 534A][1] -
-Questions 2: [Codeforces 574A][2] -
-Questions 3: [Codeforces 58A][3] -
-Questions 4: [Codeforces 592A][4] -
-Questions 5: [Codeforces 593A][5] -
-Questions 6: [Codeforces 595A][6] -
- -

Advanced Questions:

-Question 1: [Codeforces 158B] [9] -
-Question 2: [Codeforces 598D][10] -
-Question 3: [Codeforces 612C][11] - -[1]: http://codeforces.com/problemset/problem/534/A -[2]: http://codeforces.com/problemset/problem/574/A -[3]: http://codeforces.com/problemset/problem/58/A -[4]: http://codeforces.com/problemset/problem/592/A -[5]: http://codeforces.com/problemset/problem/593/A -[6]: http://codeforces.com/problemset/problem/595/B -[7]: http://codeforces.com/problemset/problem/1/A -[8]: http://codeforces.com/problemset/problem/4/A -[9]: http://codeforces.com/problemset/problem/158/B -[10]: http://codeforces.com/problemset/problem/598/D +--- +layout: post +category: practices +time: 1:00 PM +description: Summary of Meeting +--- +

Practice Summary

+This meeting we ran two separate tracks, the advanced and beginner track. Each track had its own competition, but the beginner's competition acted as a workshop where everyone is encouraged to work together to solve the problems. +
+ +

Beginner Questions:

+Questions 1: [Codeforces 534A][1] +
+Questions 2: [Codeforces 574A][2] +
+Questions 3: [Codeforces 58A][3] +
+Questions 4: [Codeforces 592A][4] +
+Questions 5: [Codeforces 593A][5] +
+Questions 6: [Codeforces 595A][6] +
+ +

Advanced Questions:

+Question 1: [Codeforces 158B] [9] +
+Question 2: [Codeforces 598D][10] +
+Question 3: [Codeforces 612C][11] + +[1]: http://codeforces.com/problemset/problem/534/A +[2]: http://codeforces.com/problemset/problem/574/A +[3]: http://codeforces.com/problemset/problem/58/A +[4]: http://codeforces.com/problemset/problem/592/A +[5]: http://codeforces.com/problemset/problem/593/A +[6]: http://codeforces.com/problemset/problem/595/B +[7]: http://codeforces.com/problemset/problem/1/A +[8]: http://codeforces.com/problemset/problem/4/A +[9]: http://codeforces.com/problemset/problem/158/B +[10]: http://codeforces.com/problemset/problem/598/D [11]: http://codeforces.com/problemset/problem/612/C \ No newline at end of file diff --git a/assets/domjudge/guide.aux b/assets/domjudge/guide.aux index 02669b1..e0946b5 100644 --- a/assets/domjudge/guide.aux +++ b/assets/domjudge/guide.aux @@ -1,35 +1,35 @@ -\relax -\providecommand\hyper@newdestlabel[2]{} -\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} -\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined -\global\let\oldcontentsline\contentsline -\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} -\global\let\oldnewlabel\newlabel -\gdef\newlabel#1#2{\newlabelxx{#1}#2} -\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} -\AtEndDocument{\ifx\hyper@anchor\@undefined -\let\contentsline\oldcontentsline -\let\newlabel\oldnewlabel -\fi} -\fi} -\global\let\hyper@last\relax -\gdef\HyperFirstAtBeginDocument#1{#1} -\providecommand\HyField@AuxAddToFields[1]{} -\providecommand\HyField@AuxAddToCoFields[2]{} -\@writefile{toc}{\contentsline {section}{\numberline {1}DOMjudge}{2}{section.1}} -\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}Overview}{2}{subsection.1.1}} -\@writefile{toc}{\contentsline {subsection}{\numberline {1.2}Scoreboard}{2}{subsection.1.2}} -\@writefile{toc}{\contentsline {section}{\numberline {2}Solving a Problem}{3}{section.2}} -\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Reading the Problem Statement}{3}{subsection.2.1}} -\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}Writing Code and Testing}{4}{subsection.2.2}} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.2.1}Basics}{4}{subsubsection.2.2.1}} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.2.2}Exit Code of Your Program}{4}{subsubsection.2.2.2}} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.2.3}Starter Code for C++, Java and Python}{4}{subsubsection.2.2.3}} -\@writefile{toc}{\contentsline {section}{\numberline {3}Understanding The Judge's Verdicts}{6}{section.3}} -\@writefile{toc}{\contentsline {section}{\numberline {4}Working With Command Line Prompt}{7}{section.4}} -\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Compile and Run Your Code}{7}{subsection.4.1}} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.1}C++}{7}{subsubsection.4.1.1}} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.2}Java}{7}{subsubsection.4.1.2}} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.3}Python}{7}{subsubsection.4.1.3}} -\@writefile{toc}{\contentsline {subsection}{\numberline {4.2}Input/Output Redirection}{8}{subsection.4.2}} -\@writefile{toc}{\contentsline {subsection}{\numberline {4.3}Other Useful Commands}{8}{subsection.4.3}} +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\@writefile{toc}{\contentsline {section}{\numberline {1}DOMjudge}{2}{section.1}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}Overview}{2}{subsection.1.1}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.2}Scoreboard}{2}{subsection.1.2}} +\@writefile{toc}{\contentsline {section}{\numberline {2}Solving a Problem}{3}{section.2}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Reading the Problem Statement}{3}{subsection.2.1}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}Writing Code and Testing}{4}{subsection.2.2}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.2.1}Basics}{4}{subsubsection.2.2.1}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.2.2}Exit Code of Your Program}{4}{subsubsection.2.2.2}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.2.3}Starter Code for C++, Java and Python}{4}{subsubsection.2.2.3}} +\@writefile{toc}{\contentsline {section}{\numberline {3}Understanding The Judge's Verdicts}{6}{section.3}} +\@writefile{toc}{\contentsline {section}{\numberline {4}Working With Command Line Prompt}{7}{section.4}} +\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Compile and Run Your Code}{7}{subsection.4.1}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.1}C++}{7}{subsubsection.4.1.1}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.2}Java}{7}{subsubsection.4.1.2}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.3}Python}{7}{subsubsection.4.1.3}} +\@writefile{toc}{\contentsline {subsection}{\numberline {4.2}Input/Output Redirection}{8}{subsection.4.2}} +\@writefile{toc}{\contentsline {subsection}{\numberline {4.3}Other Useful Commands}{8}{subsection.4.3}} diff --git a/assets/domjudge/guide.log b/assets/domjudge/guide.log index 3c0f80f..fc26c73 100644 --- a/assets/domjudge/guide.log +++ b/assets/domjudge/guide.log @@ -1,527 +1,527 @@ -This is pdfTeX, Version 3.14159265-2.6-1.40.17 (TeX Live 2016) (preloaded format=pdflatex 2016.5.22) 29 AUG 2018 23:59 -entering extended mode - restricted \write18 enabled. - file:line:error style messages enabled. - %&-line parsing enabled. -**guide.tex -(./guide.tex -LaTeX2e <2016/03/31> -Babel <3.9r> and hyphenation patterns for 83 language(s) loaded. -(/usr/local/texlive/2016/texmf-dist/tex/latex/base/article.cls -Document Class: article 2014/09/29 v1.4h Standard LaTeX document class -(/usr/local/texlive/2016/texmf-dist/tex/latex/base/size10.clo -File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option) -) -\c@part=\count79 -\c@section=\count80 -\c@subsection=\count81 -\c@subsubsection=\count82 -\c@paragraph=\count83 -\c@subparagraph=\count84 -\c@figure=\count85 -\c@table=\count86 -\abovecaptionskip=\skip41 -\belowcaptionskip=\skip42 -\bibindent=\dimen102 -) -(/usr/local/texlive/2016/texmf-dist/tex/latex/geometry/geometry.sty -Package: geometry 2010/09/12 v5.6 Page Geometry - -(/usr/local/texlive/2016/texmf-dist/tex/latex/graphics/keyval.sty -Package: keyval 2014/10/28 v1.15 key=value parser (DPC) -\KV@toks@=\toks14 -) -(/usr/local/texlive/2016/texmf-dist/tex/generic/oberdiek/ifpdf.sty -Package: ifpdf 2016/05/14 v3.1 Provides the ifpdf switch -) -(/usr/local/texlive/2016/texmf-dist/tex/generic/oberdiek/ifvtex.sty -Package: ifvtex 2016/05/16 v1.6 Detect VTeX and its facilities (HO) -Package ifvtex Info: VTeX not detected. -) -(/usr/local/texlive/2016/texmf-dist/tex/generic/ifxetex/ifxetex.sty -Package: ifxetex 2010/09/12 v0.6 Provides ifxetex conditional -) -\Gm@cnth=\count87 -\Gm@cntv=\count88 -\c@Gm@tempcnt=\count89 -\Gm@bindingoffset=\dimen103 -\Gm@wd@mp=\dimen104 -\Gm@odd@mp=\dimen105 -\Gm@even@mp=\dimen106 -\Gm@layoutwidth=\dimen107 -\Gm@layoutheight=\dimen108 -\Gm@layouthoffset=\dimen109 -\Gm@layoutvoffset=\dimen110 -\Gm@dimlist=\toks15 -) - -Package geometry Warning: Over-specification in `h'-direction. - `width' (597.50787pt) is ignored. - - -Package geometry Warning: Over-specification in `v'-direction. - `height' (845.04684pt) is ignored. - -(/usr/local/texlive/2016/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty -\fancy@headwidth=\skip43 -\f@ncyO@elh=\skip44 -\f@ncyO@erh=\skip45 -\f@ncyO@olh=\skip46 -\f@ncyO@orh=\skip47 -\f@ncyO@elf=\skip48 -\f@ncyO@erf=\skip49 -\f@ncyO@olf=\skip50 -\f@ncyO@orf=\skip51 -) -(/usr/local/texlive/2016/texmf-dist/tex/latex/hyperref/hyperref.sty -Package: hyperref 2016/05/05 v6.83n Hypertext links for LaTeX - -(/usr/local/texlive/2016/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty -Package: hobsub-hyperref 2016/05/16 v1.14 Bundle oberdiek, subset hyperref (HO) - - -(/usr/local/texlive/2016/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty -Package: hobsub-generic 2016/05/16 v1.14 Bundle oberdiek, subset generic (HO) -Package: hobsub 2016/05/16 v1.14 Construct package bundles (HO) -Package: infwarerr 2016/05/16 v1.4 Providing info/warning/error messages (HO) -Package: ltxcmds 2016/05/16 v1.23 LaTeX kernel commands for general use (HO) -Package: ifluatex 2016/05/16 v1.4 Provides the ifluatex switch (HO) -Package ifluatex Info: LuaTeX not detected. -Package hobsub Info: Skipping package `ifvtex' (already loaded). -Package: intcalc 2016/05/16 v1.2 Expandable calculations with integers (HO) -Package hobsub Info: Skipping package `ifpdf' (already loaded). -Package: etexcmds 2016/05/16 v1.6 Avoid name clashes with e-TeX commands (HO) -Package etexcmds Info: Could not find \expanded. -(etexcmds) That can mean that you are not using pdfTeX 1.50 or -(etexcmds) that some package has redefined \expanded. -(etexcmds) In the latter case, load this package earlier. -Package: kvsetkeys 2016/05/16 v1.17 Key value parser (HO) -Package: kvdefinekeys 2016/05/16 v1.4 Define keys (HO) -Package: pdftexcmds 2016/05/10 v0.21 Utility functions of pdfTeX for LuaTeX (HO -) -Package pdftexcmds Info: LuaTeX not detected. -Package pdftexcmds Info: \pdf@primitive is available. -Package pdftexcmds Info: \pdf@ifprimitive is available. -Package pdftexcmds Info: \pdfdraftmode found. -Package: pdfescape 2016/05/16 v1.14 Implements pdfTeX's escape features (HO) -Package: bigintcalc 2016/05/16 v1.4 Expandable calculations on big integers (HO -) -Package: bitset 2016/05/16 v1.2 Handle bit-vector datatype (HO) -Package: uniquecounter 2016/05/16 v1.3 Provide unlimited unique counter (HO) -) -Package hobsub Info: Skipping package `hobsub' (already loaded). -Package: letltxmacro 2016/05/16 v1.5 Let assignment for LaTeX macros (HO) -Package: hopatch 2016/05/16 v1.3 Wrapper for package hooks (HO) -Package: xcolor-patch 2016/05/16 xcolor patch -Package: atveryend 2016/05/16 v1.9 Hooks at the very end of document (HO) -Package atveryend Info: \enddocument detected (standard20110627). -Package: atbegshi 2016/05/16 v1.17 At begin shipout hook (HO) -Package: refcount 2016/05/16 v3.5 Data extraction from label references (HO) -Package: hycolor 2016/05/16 v1.8 Color options for hyperref/bookmark (HO) -) -(/usr/local/texlive/2016/texmf-dist/tex/latex/oberdiek/auxhook.sty -Package: auxhook 2016/05/16 v1.4 Hooks for auxiliary files (HO) -) -(/usr/local/texlive/2016/texmf-dist/tex/latex/oberdiek/kvoptions.sty -Package: kvoptions 2016/05/16 v3.12 Key value format for package options (HO) -) -\@linkdim=\dimen111 -\Hy@linkcounter=\count90 -\Hy@pagecounter=\count91 - -(/usr/local/texlive/2016/texmf-dist/tex/latex/hyperref/pd1enc.def -File: pd1enc.def 2016/05/05 v6.83n Hyperref: PDFDocEncoding definition (HO) -) -\Hy@SavedSpaceFactor=\count92 - -(/usr/local/texlive/2016/texmf-dist/tex/latex/latexconfig/hyperref.cfg -File: hyperref.cfg 2002/06/06 v1.2 hyperref configuration of TeXLive -) -Package hyperref Info: Hyper figures OFF on input line 4446. -Package hyperref Info: Link nesting OFF on input line 4451. -Package hyperref Info: Hyper index ON on input line 4454. -Package hyperref Info: Plain pages OFF on input line 4461. -Package hyperref Info: Backreferencing OFF on input line 4466. -Package hyperref Info: Implicit mode ON; LaTeX internals redefined. -Package hyperref Info: Bookmarks ON on input line 4691. -\c@Hy@tempcnt=\count93 - -(/usr/local/texlive/2016/texmf-dist/tex/latex/url/url.sty -\Urlmuskip=\muskip10 -Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. -) -LaTeX Info: Redefining \url on input line 5044. -\XeTeXLinkMargin=\dimen112 -\Fld@menulength=\count94 -\Field@Width=\dimen113 -\Fld@charsize=\dimen114 -Package hyperref Info: Hyper figures OFF on input line 6298. -Package hyperref Info: Link nesting OFF on input line 6303. -Package hyperref Info: Hyper index ON on input line 6306. -Package hyperref Info: backreferencing OFF on input line 6313. -Package hyperref Info: Link coloring OFF on input line 6318. -Package hyperref Info: Link coloring with OCG OFF on input line 6323. -Package hyperref Info: PDF/A mode OFF on input line 6328. -LaTeX Info: Redefining \ref on input line 6368. -LaTeX Info: Redefining \pageref on input line 6372. -\Hy@abspage=\count95 -\c@Item=\count96 -\c@Hfootnote=\count97 -) - -Package hyperref Message: Driver (autodetected): hpdftex. - -(/usr/local/texlive/2016/texmf-dist/tex/latex/hyperref/hpdftex.def -File: hpdftex.def 2016/05/05 v6.83n Hyperref driver for pdfTeX -\Fld@listcount=\count98 -\c@bookmark@seq@number=\count99 - -(/usr/local/texlive/2016/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty -Package: rerunfilecheck 2016/05/16 v1.8 Rerun checks for auxiliary files (HO) -Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 -82. -) -\Hy@SectionHShift=\skip52 -) -(/usr/local/texlive/2016/texmf-dist/tex/latex/amsmath/amsmath.sty -Package: amsmath 2016/03/10 v2.15b AMS math features -\@mathmargin=\skip53 - -For additional information on amsmath, use the `?' option. -(/usr/local/texlive/2016/texmf-dist/tex/latex/amsmath/amstext.sty -Package: amstext 2000/06/29 v2.01 AMS text - -(/usr/local/texlive/2016/texmf-dist/tex/latex/amsmath/amsgen.sty -File: amsgen.sty 1999/11/30 v2.0 generic functions -\@emptytoks=\toks16 -\ex@=\dimen115 -)) -(/usr/local/texlive/2016/texmf-dist/tex/latex/amsmath/amsbsy.sty -Package: amsbsy 1999/11/29 v1.2d Bold Symbols -\pmbraise@=\dimen116 -) -(/usr/local/texlive/2016/texmf-dist/tex/latex/amsmath/amsopn.sty -Package: amsopn 2016/03/08 v2.02 operator names -) -\inf@bad=\count100 -LaTeX Info: Redefining \frac on input line 199. -\uproot@=\count101 -\leftroot@=\count102 -LaTeX Info: Redefining \overline on input line 297. -\classnum@=\count103 -\DOTSCASE@=\count104 -LaTeX Info: Redefining \ldots on input line 394. -LaTeX Info: Redefining \dots on input line 397. -LaTeX Info: Redefining \cdots on input line 518. -\Mathstrutbox@=\box26 -\strutbox@=\box27 -\big@size=\dimen117 -LaTeX Font Info: Redeclaring font encoding OML on input line 634. -LaTeX Font Info: Redeclaring font encoding OMS on input line 635. -\macc@depth=\count105 -\c@MaxMatrixCols=\count106 -\dotsspace@=\muskip11 -\c@parentequation=\count107 -\dspbrk@lvl=\count108 -\tag@help=\toks17 -\row@=\count109 -\column@=\count110 -\maxfields@=\count111 -\andhelp@=\toks18 -\eqnshift@=\dimen118 -\alignsep@=\dimen119 -\tagshift@=\dimen120 -\tagwidth@=\dimen121 -\totwidth@=\dimen122 -\lineht@=\dimen123 -\@envbody=\toks19 -\multlinegap=\skip54 -\multlinetaggap=\skip55 -\mathdisplay@stack=\toks20 -LaTeX Info: Redefining \[ on input line 2739. -LaTeX Info: Redefining \] on input line 2740. -) -(/usr/local/texlive/2016/texmf-dist/tex/latex/amscls/amsthm.sty -Package: amsthm 2015/03/04 v2.20.2 -\thm@style=\toks21 -\thm@bodyfont=\toks22 -\thm@headfont=\toks23 -\thm@notefont=\toks24 -\thm@headpunct=\toks25 -\thm@preskip=\skip56 -\thm@postskip=\skip57 -\thm@headsep=\skip58 -\dth@everypar=\toks26 -) -(/usr/local/texlive/2016/texmf-dist/tex/latex/amsfonts/amssymb.sty -Package: amssymb 2013/01/14 v3.01 AMS font symbols - -(/usr/local/texlive/2016/texmf-dist/tex/latex/amsfonts/amsfonts.sty -Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support -\symAMSa=\mathgroup4 -\symAMSb=\mathgroup5 -LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' -(Font) U/euf/m/n --> U/euf/b/n on input line 106. -)) -(/usr/local/texlive/2016/texmf-dist/tex/latex/graphics/graphicx.sty -Package: graphicx 2014/10/28 v1.0g Enhanced LaTeX Graphics (DPC,SPQR) - -(/usr/local/texlive/2016/texmf-dist/tex/latex/graphics/graphics.sty -Package: graphics 2016/05/09 v1.0r Standard LaTeX Graphics (DPC,SPQR) - -(/usr/local/texlive/2016/texmf-dist/tex/latex/graphics/trig.sty -Package: trig 2016/01/03 v1.10 sin cos tan (DPC) -) -(/usr/local/texlive/2016/texmf-dist/tex/latex/graphics-cfg/graphics.cfg -File: graphics.cfg 2016/01/02 v1.10 sample graphics configuration -) -Package graphics Info: Driver file: pdftex.def on input line 96. - -(/usr/local/texlive/2016/texmf-dist/tex/latex/pdftex-def/pdftex.def -File: pdftex.def 2011/05/27 v0.06d Graphics/color for pdfTeX -\Gread@gobject=\count112 -)) -\Gin@req@height=\dimen124 -\Gin@req@width=\dimen125 -) -(/usr/local/texlive/2016/texmf-dist/tex/latex/tools/tabularx.sty -Package: tabularx 2016/02/03 v2.11 `tabularx' package (DPC) - -(/usr/local/texlive/2016/texmf-dist/tex/latex/tools/array.sty -Package: array 2014/10/28 v2.4c Tabular extension package (FMi) -\col@sep=\dimen126 -\extrarowheight=\dimen127 -\NC@list=\toks27 -\extratabsurround=\skip59 -\backup@length=\skip60 -) -\TX@col@width=\dimen128 -\TX@old@table=\dimen129 -\TX@old@col=\dimen130 -\TX@target=\dimen131 -\TX@delta=\dimen132 -\TX@cols=\count113 -\TX@ftn=\toks28 -) -\c@theorem=\count114 - (./guide.aux) -\openout1 = `guide.aux'. - -LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 32. -LaTeX Font Info: ... okay on input line 32. -LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 32. -LaTeX Font Info: ... okay on input line 32. -LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 32. -LaTeX Font Info: ... okay on input line 32. -LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 32. -LaTeX Font Info: ... okay on input line 32. -LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 32. -LaTeX Font Info: ... okay on input line 32. -LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 32. -LaTeX Font Info: ... okay on input line 32. -LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 32. -LaTeX Font Info: ... okay on input line 32. - -*geometry* driver: auto-detecting -*geometry* detected driver: pdftex -*geometry* verbose mode - [ preamble ] result: -* driver: pdftex -* paper: a4paper -* layout: -* layoutoffset:(h,v)=(0.0pt,0.0pt) -* modes: -* h-part:(L,W,R)=(56.9055pt, 483.69687pt, 56.9055pt) -* v-part:(T,H,B)=(56.9055pt, 731.23584pt, 56.9055pt) -* \paperwidth=597.50787pt -* \paperheight=845.04684pt -* \textwidth=483.69687pt -* \textheight=731.23584pt -* \oddsidemargin=-15.36449pt -* \evensidemargin=-15.36449pt -* \topmargin=-52.36449pt -* \headheight=12.0pt -* \headsep=25.0pt -* \topskip=10.0pt -* \footskip=30.0pt -* \marginparwidth=65.0pt -* \marginparsep=11.0pt -* \columnsep=10.0pt -* \skip\footins=9.0pt plus 4.0pt minus 2.0pt -* \hoffset=0.0pt -* \voffset=0.0pt -* \mag=1000 -* \@twocolumnfalse -* \@twosidefalse -* \@mparswitchfalse -* \@reversemarginfalse -* (1in=72.27pt=25.4mm, 1cm=28.453pt) - -\AtBeginShipoutBox=\box28 -Package hyperref Info: Link coloring OFF on input line 32. -(/usr/local/texlive/2016/texmf-dist/tex/latex/hyperref/nameref.sty -Package: nameref 2012/10/27 v2.43 Cross-referencing by name of section - -(/usr/local/texlive/2016/texmf-dist/tex/generic/oberdiek/gettitlestring.sty -Package: gettitlestring 2016/05/16 v1.5 Cleanup title references (HO) -) -\c@section@level=\count115 -) -LaTeX Info: Redefining \ref on input line 32. -LaTeX Info: Redefining \pageref on input line 32. -LaTeX Info: Redefining \nameref on input line 32. - -(./guide.out) (./guide.out) -\@outlinefile=\write3 -\openout3 = `guide.out'. - - -(/usr/local/texlive/2016/texmf-dist/tex/context/base/mkii/supp-pdf.mkii -[Loading MPS to PDF converter (version 2006.09.02).] -\scratchcounter=\count116 -\scratchdimen=\dimen133 -\scratchbox=\box29 -\nofMPsegments=\count117 -\nofMParguments=\count118 -\everyMPshowfont=\toks29 -\MPscratchCnt=\count119 -\MPscratchDim=\dimen134 -\MPnumerator=\count120 -\makeMPintoPDFobject=\count121 -\everyMPtoPDFconversion=\toks30 -) (/usr/local/texlive/2016/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty -Package: epstopdf-base 2016/05/15 v2.6 Base part for package epstopdf - -(/usr/local/texlive/2016/texmf-dist/tex/latex/oberdiek/grfext.sty -Package: grfext 2016/05/16 v1.2 Manage graphics extensions (HO) -) -Package grfext Info: Graphics extension search list: -(grfext) [.png,.pdf,.jpg,.mps,.jpeg,.jbig2,.jb2,.PNG,.PDF,.JPG,.JPE -G,.JBIG2,.JB2,.eps] -(grfext) \AppendGraphicsExtensions on input line 456. - -(/usr/local/texlive/2016/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg -File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv -e -)) -(./guide.toc -LaTeX Font Info: Try loading font information for U+msa on input line 2. - (/usr/local/texlive/2016/texmf-dist/tex/latex/amsfonts/umsa.fd -File: umsa.fd 2013/01/14 v3.01 AMS symbols A -) -LaTeX Font Info: Try loading font information for U+msb on input line 2. - -(/usr/local/texlive/2016/texmf-dist/tex/latex/amsfonts/umsb.fd -File: umsb.fd 2013/01/14 v3.01 AMS symbols B -)) -\tf@toc=\write4 -\openout4 = `guide.toc'. - - [1{/usr/local/texlive/2016/texmf-var/fonts/map/pdftex/updmap/pdftex.map} - -] - -File: dashboard.png Graphic file (type png) - -Package pdftex.def Info: dashboard.png used on input line 45. -(pdftex.def) Requested size: 284.86644pt x 183.98878pt. -LaTeX Font Info: Try loading font information for OMS+cmr on input line 50. - -(/usr/local/texlive/2016/texmf-dist/tex/latex/base/omscmr.fd -File: omscmr.fd 2014/09/29 v2.5h Standard LaTeX font definitions -) -LaTeX Font Info: Font shape `OMS/cmr/m/n' in size <10> not available -(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 50. - - -File: scoreboard.png Graphic file (type png) - -Package pdftex.def Info: scoreboard.png used on input line 62. -(pdftex.def) Requested size: 285.76982pt x 185.79555pt. - -[2 <./dashboard.png> <./scoreboard.png>] - -File: i.png Graphic file (type png) - -Package pdftex.def Info: i.png used on input line 91. -(pdftex.def) Requested size: 428.6002pt x 201.25139pt. - - -File: j.png Graphic file (type png) - -Package pdftex.def Info: j.png used on input line 94. -(pdftex.def) Requested size: 204.16432pt x 71.06604pt. - -Underfull \hbox (badness 10000) in paragraph at lines 95--103 - - [] - -[3 <./i.png> <./j.png>] -Underfull \hbox (badness 10000) in paragraph at lines 107--116 - - [] - - -Underfull \hbox (badness 10000) in paragraph at lines 107--116 - - [] - - -Underfull \hbox (badness 10000) in paragraph at lines 107--116 - - [] - - -Underfull \hbox (badness 10000) in paragraph at lines 118--126 - - [] - - -Underfull \hbox (badness 10000) in paragraph at lines 118--126 - - [] - - -Underfull \hbox (badness 10000) in paragraph at lines 128--132 - - [] - -[4] [5] -Underfull \hbox (badness 10000) in paragraph at lines 179--183 - - [] - -[6] [7] -Underfull \hbox (badness 10000) in paragraph at lines 256--259 - - [] - -Package atveryend Info: Empty hook `BeforeClearDocument' on input line 286. -[8] -Package atveryend Info: Empty hook `AfterLastShipout' on input line 286. - (./guide.aux) -Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 286. -Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 286. -Package rerunfilecheck Info: File `guide.out' has not changed. -(rerunfilecheck) Checksum: A038D0421B00F70604872177C2806C91;1158. -Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 286. - ) -Here is how much of TeX's memory you used: - 6711 strings out of 493014 - 95979 string characters out of 6133351 - 189574 words of memory out of 5000000 - 10153 multiletter control sequences out of 15000+600000 - 7025 words of font info for 28 fonts, out of 8000000 for 9000 - 1141 hyphenation exceptions out of 8191 - 29i,10n,43p,227b,448s stack positions out of 5000i,500n,10000p,200000b,80000s - - -Output written on guide.pdf (8 pages, 498520 bytes). -PDF statistics: - 168 PDF objects out of 1000 (max. 8388607) - 144 compressed objects within 2 object streams - 30 named destinations out of 1000 (max. 500000) - 157 words of extra memory for PDF output out of 10000 (max. 10000000) - +This is pdfTeX, Version 3.14159265-2.6-1.40.17 (TeX Live 2016) (preloaded format=pdflatex 2016.5.22) 29 AUG 2018 23:59 +entering extended mode + restricted \write18 enabled. + file:line:error style messages enabled. + %&-line parsing enabled. +**guide.tex +(./guide.tex +LaTeX2e <2016/03/31> +Babel <3.9r> and hyphenation patterns for 83 language(s) loaded. +(/usr/local/texlive/2016/texmf-dist/tex/latex/base/article.cls +Document Class: article 2014/09/29 v1.4h Standard LaTeX document class +(/usr/local/texlive/2016/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) +(/usr/local/texlive/2016/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2010/09/12 v5.6 Page Geometry + +(/usr/local/texlive/2016/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks14 +) +(/usr/local/texlive/2016/texmf-dist/tex/generic/oberdiek/ifpdf.sty +Package: ifpdf 2016/05/14 v3.1 Provides the ifpdf switch +) +(/usr/local/texlive/2016/texmf-dist/tex/generic/oberdiek/ifvtex.sty +Package: ifvtex 2016/05/16 v1.6 Detect VTeX and its facilities (HO) +Package ifvtex Info: VTeX not detected. +) +(/usr/local/texlive/2016/texmf-dist/tex/generic/ifxetex/ifxetex.sty +Package: ifxetex 2010/09/12 v0.6 Provides ifxetex conditional +) +\Gm@cnth=\count87 +\Gm@cntv=\count88 +\c@Gm@tempcnt=\count89 +\Gm@bindingoffset=\dimen103 +\Gm@wd@mp=\dimen104 +\Gm@odd@mp=\dimen105 +\Gm@even@mp=\dimen106 +\Gm@layoutwidth=\dimen107 +\Gm@layoutheight=\dimen108 +\Gm@layouthoffset=\dimen109 +\Gm@layoutvoffset=\dimen110 +\Gm@dimlist=\toks15 +) + +Package geometry Warning: Over-specification in `h'-direction. + `width' (597.50787pt) is ignored. + + +Package geometry Warning: Over-specification in `v'-direction. + `height' (845.04684pt) is ignored. + +(/usr/local/texlive/2016/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty +\fancy@headwidth=\skip43 +\f@ncyO@elh=\skip44 +\f@ncyO@erh=\skip45 +\f@ncyO@olh=\skip46 +\f@ncyO@orh=\skip47 +\f@ncyO@elf=\skip48 +\f@ncyO@erf=\skip49 +\f@ncyO@olf=\skip50 +\f@ncyO@orf=\skip51 +) +(/usr/local/texlive/2016/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2016/05/05 v6.83n Hypertext links for LaTeX + +(/usr/local/texlive/2016/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty +Package: hobsub-hyperref 2016/05/16 v1.14 Bundle oberdiek, subset hyperref (HO) + + +(/usr/local/texlive/2016/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty +Package: hobsub-generic 2016/05/16 v1.14 Bundle oberdiek, subset generic (HO) +Package: hobsub 2016/05/16 v1.14 Construct package bundles (HO) +Package: infwarerr 2016/05/16 v1.4 Providing info/warning/error messages (HO) +Package: ltxcmds 2016/05/16 v1.23 LaTeX kernel commands for general use (HO) +Package: ifluatex 2016/05/16 v1.4 Provides the ifluatex switch (HO) +Package ifluatex Info: LuaTeX not detected. +Package hobsub Info: Skipping package `ifvtex' (already loaded). +Package: intcalc 2016/05/16 v1.2 Expandable calculations with integers (HO) +Package hobsub Info: Skipping package `ifpdf' (already loaded). +Package: etexcmds 2016/05/16 v1.6 Avoid name clashes with e-TeX commands (HO) +Package etexcmds Info: Could not find \expanded. +(etexcmds) That can mean that you are not using pdfTeX 1.50 or +(etexcmds) that some package has redefined \expanded. +(etexcmds) In the latter case, load this package earlier. +Package: kvsetkeys 2016/05/16 v1.17 Key value parser (HO) +Package: kvdefinekeys 2016/05/16 v1.4 Define keys (HO) +Package: pdftexcmds 2016/05/10 v0.21 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: LuaTeX not detected. +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +Package: pdfescape 2016/05/16 v1.14 Implements pdfTeX's escape features (HO) +Package: bigintcalc 2016/05/16 v1.4 Expandable calculations on big integers (HO +) +Package: bitset 2016/05/16 v1.2 Handle bit-vector datatype (HO) +Package: uniquecounter 2016/05/16 v1.3 Provide unlimited unique counter (HO) +) +Package hobsub Info: Skipping package `hobsub' (already loaded). +Package: letltxmacro 2016/05/16 v1.5 Let assignment for LaTeX macros (HO) +Package: hopatch 2016/05/16 v1.3 Wrapper for package hooks (HO) +Package: xcolor-patch 2016/05/16 xcolor patch +Package: atveryend 2016/05/16 v1.9 Hooks at the very end of document (HO) +Package atveryend Info: \enddocument detected (standard20110627). +Package: atbegshi 2016/05/16 v1.17 At begin shipout hook (HO) +Package: refcount 2016/05/16 v3.5 Data extraction from label references (HO) +Package: hycolor 2016/05/16 v1.8 Color options for hyperref/bookmark (HO) +) +(/usr/local/texlive/2016/texmf-dist/tex/latex/oberdiek/auxhook.sty +Package: auxhook 2016/05/16 v1.4 Hooks for auxiliary files (HO) +) +(/usr/local/texlive/2016/texmf-dist/tex/latex/oberdiek/kvoptions.sty +Package: kvoptions 2016/05/16 v3.12 Key value format for package options (HO) +) +\@linkdim=\dimen111 +\Hy@linkcounter=\count90 +\Hy@pagecounter=\count91 + +(/usr/local/texlive/2016/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2016/05/05 v6.83n Hyperref: PDFDocEncoding definition (HO) +) +\Hy@SavedSpaceFactor=\count92 + +(/usr/local/texlive/2016/texmf-dist/tex/latex/latexconfig/hyperref.cfg +File: hyperref.cfg 2002/06/06 v1.2 hyperref configuration of TeXLive +) +Package hyperref Info: Hyper figures OFF on input line 4446. +Package hyperref Info: Link nesting OFF on input line 4451. +Package hyperref Info: Hyper index ON on input line 4454. +Package hyperref Info: Plain pages OFF on input line 4461. +Package hyperref Info: Backreferencing OFF on input line 4466. +Package hyperref Info: Implicit mode ON; LaTeX internals redefined. +Package hyperref Info: Bookmarks ON on input line 4691. +\c@Hy@tempcnt=\count93 + +(/usr/local/texlive/2016/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip10 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5044. +\XeTeXLinkMargin=\dimen112 +\Fld@menulength=\count94 +\Field@Width=\dimen113 +\Fld@charsize=\dimen114 +Package hyperref Info: Hyper figures OFF on input line 6298. +Package hyperref Info: Link nesting OFF on input line 6303. +Package hyperref Info: Hyper index ON on input line 6306. +Package hyperref Info: backreferencing OFF on input line 6313. +Package hyperref Info: Link coloring OFF on input line 6318. +Package hyperref Info: Link coloring with OCG OFF on input line 6323. +Package hyperref Info: PDF/A mode OFF on input line 6328. +LaTeX Info: Redefining \ref on input line 6368. +LaTeX Info: Redefining \pageref on input line 6372. +\Hy@abspage=\count95 +\c@Item=\count96 +\c@Hfootnote=\count97 +) + +Package hyperref Message: Driver (autodetected): hpdftex. + +(/usr/local/texlive/2016/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2016/05/05 v6.83n Hyperref driver for pdfTeX +\Fld@listcount=\count98 +\c@bookmark@seq@number=\count99 + +(/usr/local/texlive/2016/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty +Package: rerunfilecheck 2016/05/16 v1.8 Rerun checks for auxiliary files (HO) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +82. +) +\Hy@SectionHShift=\skip52 +) +(/usr/local/texlive/2016/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2016/03/10 v2.15b AMS math features +\@mathmargin=\skip53 + +For additional information on amsmath, use the `?' option. +(/usr/local/texlive/2016/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/local/texlive/2016/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks16 +\ex@=\dimen115 +)) +(/usr/local/texlive/2016/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen116 +) +(/usr/local/texlive/2016/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count100 +LaTeX Info: Redefining \frac on input line 199. +\uproot@=\count101 +\leftroot@=\count102 +LaTeX Info: Redefining \overline on input line 297. +\classnum@=\count103 +\DOTSCASE@=\count104 +LaTeX Info: Redefining \ldots on input line 394. +LaTeX Info: Redefining \dots on input line 397. +LaTeX Info: Redefining \cdots on input line 518. +\Mathstrutbox@=\box26 +\strutbox@=\box27 +\big@size=\dimen117 +LaTeX Font Info: Redeclaring font encoding OML on input line 634. +LaTeX Font Info: Redeclaring font encoding OMS on input line 635. +\macc@depth=\count105 +\c@MaxMatrixCols=\count106 +\dotsspace@=\muskip11 +\c@parentequation=\count107 +\dspbrk@lvl=\count108 +\tag@help=\toks17 +\row@=\count109 +\column@=\count110 +\maxfields@=\count111 +\andhelp@=\toks18 +\eqnshift@=\dimen118 +\alignsep@=\dimen119 +\tagshift@=\dimen120 +\tagwidth@=\dimen121 +\totwidth@=\dimen122 +\lineht@=\dimen123 +\@envbody=\toks19 +\multlinegap=\skip54 +\multlinetaggap=\skip55 +\mathdisplay@stack=\toks20 +LaTeX Info: Redefining \[ on input line 2739. +LaTeX Info: Redefining \] on input line 2740. +) +(/usr/local/texlive/2016/texmf-dist/tex/latex/amscls/amsthm.sty +Package: amsthm 2015/03/04 v2.20.2 +\thm@style=\toks21 +\thm@bodyfont=\toks22 +\thm@headfont=\toks23 +\thm@notefont=\toks24 +\thm@headpunct=\toks25 +\thm@preskip=\skip56 +\thm@postskip=\skip57 +\thm@headsep=\skip58 +\dth@everypar=\toks26 +) +(/usr/local/texlive/2016/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/local/texlive/2016/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/local/texlive/2016/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2014/10/28 v1.0g Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/local/texlive/2016/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2016/05/09 v1.0r Standard LaTeX Graphics (DPC,SPQR) + +(/usr/local/texlive/2016/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/local/texlive/2016/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/01/02 v1.10 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 96. + +(/usr/local/texlive/2016/texmf-dist/tex/latex/pdftex-def/pdftex.def +File: pdftex.def 2011/05/27 v0.06d Graphics/color for pdfTeX +\Gread@gobject=\count112 +)) +\Gin@req@height=\dimen124 +\Gin@req@width=\dimen125 +) +(/usr/local/texlive/2016/texmf-dist/tex/latex/tools/tabularx.sty +Package: tabularx 2016/02/03 v2.11 `tabularx' package (DPC) + +(/usr/local/texlive/2016/texmf-dist/tex/latex/tools/array.sty +Package: array 2014/10/28 v2.4c Tabular extension package (FMi) +\col@sep=\dimen126 +\extrarowheight=\dimen127 +\NC@list=\toks27 +\extratabsurround=\skip59 +\backup@length=\skip60 +) +\TX@col@width=\dimen128 +\TX@old@table=\dimen129 +\TX@old@col=\dimen130 +\TX@target=\dimen131 +\TX@delta=\dimen132 +\TX@cols=\count113 +\TX@ftn=\toks28 +) +\c@theorem=\count114 + (./guide.aux) +\openout1 = `guide.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 32. +LaTeX Font Info: ... okay on input line 32. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 32. +LaTeX Font Info: ... okay on input line 32. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 32. +LaTeX Font Info: ... okay on input line 32. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 32. +LaTeX Font Info: ... okay on input line 32. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 32. +LaTeX Font Info: ... okay on input line 32. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 32. +LaTeX Font Info: ... okay on input line 32. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 32. +LaTeX Font Info: ... okay on input line 32. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: a4paper +* layout: +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(56.9055pt, 483.69687pt, 56.9055pt) +* v-part:(T,H,B)=(56.9055pt, 731.23584pt, 56.9055pt) +* \paperwidth=597.50787pt +* \paperheight=845.04684pt +* \textwidth=483.69687pt +* \textheight=731.23584pt +* \oddsidemargin=-15.36449pt +* \evensidemargin=-15.36449pt +* \topmargin=-52.36449pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=10.0pt +* \footskip=30.0pt +* \marginparwidth=65.0pt +* \marginparsep=11.0pt +* \columnsep=10.0pt +* \skip\footins=9.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +\AtBeginShipoutBox=\box28 +Package hyperref Info: Link coloring OFF on input line 32. +(/usr/local/texlive/2016/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2012/10/27 v2.43 Cross-referencing by name of section + +(/usr/local/texlive/2016/texmf-dist/tex/generic/oberdiek/gettitlestring.sty +Package: gettitlestring 2016/05/16 v1.5 Cleanup title references (HO) +) +\c@section@level=\count115 +) +LaTeX Info: Redefining \ref on input line 32. +LaTeX Info: Redefining \pageref on input line 32. +LaTeX Info: Redefining \nameref on input line 32. + +(./guide.out) (./guide.out) +\@outlinefile=\write3 +\openout3 = `guide.out'. + + +(/usr/local/texlive/2016/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count116 +\scratchdimen=\dimen133 +\scratchbox=\box29 +\nofMPsegments=\count117 +\nofMParguments=\count118 +\everyMPshowfont=\toks29 +\MPscratchCnt=\count119 +\MPscratchDim=\dimen134 +\MPnumerator=\count120 +\makeMPintoPDFobject=\count121 +\everyMPtoPDFconversion=\toks30 +) (/usr/local/texlive/2016/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty +Package: epstopdf-base 2016/05/15 v2.6 Base part for package epstopdf + +(/usr/local/texlive/2016/texmf-dist/tex/latex/oberdiek/grfext.sty +Package: grfext 2016/05/16 v1.2 Manage graphics extensions (HO) +) +Package grfext Info: Graphics extension search list: +(grfext) [.png,.pdf,.jpg,.mps,.jpeg,.jbig2,.jb2,.PNG,.PDF,.JPG,.JPE +G,.JBIG2,.JB2,.eps] +(grfext) \AppendGraphicsExtensions on input line 456. + +(/usr/local/texlive/2016/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +(./guide.toc +LaTeX Font Info: Try loading font information for U+msa on input line 2. + (/usr/local/texlive/2016/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Try loading font information for U+msb on input line 2. + +(/usr/local/texlive/2016/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +)) +\tf@toc=\write4 +\openout4 = `guide.toc'. + + [1{/usr/local/texlive/2016/texmf-var/fonts/map/pdftex/updmap/pdftex.map} + +] + +File: dashboard.png Graphic file (type png) + +Package pdftex.def Info: dashboard.png used on input line 45. +(pdftex.def) Requested size: 284.86644pt x 183.98878pt. +LaTeX Font Info: Try loading font information for OMS+cmr on input line 50. + +(/usr/local/texlive/2016/texmf-dist/tex/latex/base/omscmr.fd +File: omscmr.fd 2014/09/29 v2.5h Standard LaTeX font definitions +) +LaTeX Font Info: Font shape `OMS/cmr/m/n' in size <10> not available +(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 50. + + +File: scoreboard.png Graphic file (type png) + +Package pdftex.def Info: scoreboard.png used on input line 62. +(pdftex.def) Requested size: 285.76982pt x 185.79555pt. + +[2 <./dashboard.png> <./scoreboard.png>] + +File: i.png Graphic file (type png) + +Package pdftex.def Info: i.png used on input line 91. +(pdftex.def) Requested size: 428.6002pt x 201.25139pt. + + +File: j.png Graphic file (type png) + +Package pdftex.def Info: j.png used on input line 94. +(pdftex.def) Requested size: 204.16432pt x 71.06604pt. + +Underfull \hbox (badness 10000) in paragraph at lines 95--103 + + [] + +[3 <./i.png> <./j.png>] +Underfull \hbox (badness 10000) in paragraph at lines 107--116 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 107--116 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 107--116 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 118--126 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 118--126 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 128--132 + + [] + +[4] [5] +Underfull \hbox (badness 10000) in paragraph at lines 179--183 + + [] + +[6] [7] +Underfull \hbox (badness 10000) in paragraph at lines 256--259 + + [] + +Package atveryend Info: Empty hook `BeforeClearDocument' on input line 286. +[8] +Package atveryend Info: Empty hook `AfterLastShipout' on input line 286. + (./guide.aux) +Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 286. +Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 286. +Package rerunfilecheck Info: File `guide.out' has not changed. +(rerunfilecheck) Checksum: A038D0421B00F70604872177C2806C91;1158. +Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 286. + ) +Here is how much of TeX's memory you used: + 6711 strings out of 493014 + 95979 string characters out of 6133351 + 189574 words of memory out of 5000000 + 10153 multiletter control sequences out of 15000+600000 + 7025 words of font info for 28 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 29i,10n,43p,227b,448s stack positions out of 5000i,500n,10000p,200000b,80000s + + +Output written on guide.pdf (8 pages, 498520 bytes). +PDF statistics: + 168 PDF objects out of 1000 (max. 8388607) + 144 compressed objects within 2 object streams + 30 named destinations out of 1000 (max. 500000) + 157 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/assets/domjudge/guide.out b/assets/domjudge/guide.out index 27d3881..d4c058b 100644 --- a/assets/domjudge/guide.out +++ b/assets/domjudge/guide.out @@ -1,17 +1,17 @@ -\BOOKMARK [1][-]{section.1}{DOMjudge}{}% 1 -\BOOKMARK [2][-]{subsection.1.1}{Overview}{section.1}% 2 -\BOOKMARK [2][-]{subsection.1.2}{Scoreboard}{section.1}% 3 -\BOOKMARK [1][-]{section.2}{Solving a Problem}{}% 4 -\BOOKMARK [2][-]{subsection.2.1}{Reading the Problem Statement}{section.2}% 5 -\BOOKMARK [2][-]{subsection.2.2}{Writing Code and Testing}{section.2}% 6 -\BOOKMARK [3][-]{subsubsection.2.2.1}{Basics}{subsection.2.2}% 7 -\BOOKMARK [3][-]{subsubsection.2.2.2}{Exit Code of Your Program}{subsection.2.2}% 8 -\BOOKMARK [3][-]{subsubsection.2.2.3}{Starter Code for C++, Java and Python}{subsection.2.2}% 9 -\BOOKMARK [1][-]{section.3}{Understanding The Judge's Verdicts}{}% 10 -\BOOKMARK [1][-]{section.4}{Working With Command Line Prompt}{}% 11 -\BOOKMARK [2][-]{subsection.4.1}{Compile and Run Your Code}{section.4}% 12 -\BOOKMARK [3][-]{subsubsection.4.1.1}{C++}{subsection.4.1}% 13 -\BOOKMARK [3][-]{subsubsection.4.1.2}{Java}{subsection.4.1}% 14 -\BOOKMARK [3][-]{subsubsection.4.1.3}{Python}{subsection.4.1}% 15 -\BOOKMARK [2][-]{subsection.4.2}{Input/Output Redirection}{section.4}% 16 -\BOOKMARK [2][-]{subsection.4.3}{Other Useful Commands}{section.4}% 17 +\BOOKMARK [1][-]{section.1}{DOMjudge}{}% 1 +\BOOKMARK [2][-]{subsection.1.1}{Overview}{section.1}% 2 +\BOOKMARK [2][-]{subsection.1.2}{Scoreboard}{section.1}% 3 +\BOOKMARK [1][-]{section.2}{Solving a Problem}{}% 4 +\BOOKMARK [2][-]{subsection.2.1}{Reading the Problem Statement}{section.2}% 5 +\BOOKMARK [2][-]{subsection.2.2}{Writing Code and Testing}{section.2}% 6 +\BOOKMARK [3][-]{subsubsection.2.2.1}{Basics}{subsection.2.2}% 7 +\BOOKMARK [3][-]{subsubsection.2.2.2}{Exit Code of Your Program}{subsection.2.2}% 8 +\BOOKMARK [3][-]{subsubsection.2.2.3}{Starter Code for C++, Java and Python}{subsection.2.2}% 9 +\BOOKMARK [1][-]{section.3}{Understanding The Judge's Verdicts}{}% 10 +\BOOKMARK [1][-]{section.4}{Working With Command Line Prompt}{}% 11 +\BOOKMARK [2][-]{subsection.4.1}{Compile and Run Your Code}{section.4}% 12 +\BOOKMARK [3][-]{subsubsection.4.1.1}{C++}{subsection.4.1}% 13 +\BOOKMARK [3][-]{subsubsection.4.1.2}{Java}{subsection.4.1}% 14 +\BOOKMARK [3][-]{subsubsection.4.1.3}{Python}{subsection.4.1}% 15 +\BOOKMARK [2][-]{subsection.4.2}{Input/Output Redirection}{section.4}% 16 +\BOOKMARK [2][-]{subsection.4.3}{Other Useful Commands}{section.4}% 17 diff --git a/assets/domjudge/guide.tex b/assets/domjudge/guide.tex index 90ec654..8ab9c55 100644 --- a/assets/domjudge/guide.tex +++ b/assets/domjudge/guide.tex @@ -1,287 +1,287 @@ -\documentclass {article} - -\usepackage{geometry} -\geometry { - a4paper, - total={210mm,297mm}, - left=20mm, - right=20mm, - top=20mm, - bottom=20mm, - } - -\usepackage{fancyhdr} -\pagestyle{fancy} -\fancyhf{} -\rhead{} -\lhead{Beginner's Guide For Domjudge} -\rfoot{Page \thepage} - -\usepackage {hyperref, amsmath, amsthm, amssymb, graphicx, tabularx} -\everymath {\displaystyle} - -\newtheorem {theorem}{Theorem} -\newtheorem*{theorem*}{Theorem} - -\newcommand{\define}{\newcommand} -\define{\set}[1]{\{{#1}\}} - -\define{\img}[2]{{\begin{center}\includegraphics[scale={#1}]{{#2}}\end{center}}} - - -\begin {document} - -\tableofcontents - -\newpage -\section{DOMjudge} -\subsection{Overview} -DOMjudge is the online judge we use to host contests. - -Go to \url{http://domjudge2.cs.illinois.edu/team/} and enter your assigned -credentials to access the contest dashboard. - -\begin{center} - \includegraphics[scale=0.3]{dashboard.png} -\end{center} - -On this page, you can -\begin{itemize} -\item view problem statements by clicking the problem names. -\item view the list of past submissions and verdicts (more about verdicts - later). -\item upload your solution. -\item view and request clarification to problems. -\end{itemize} - -\subsection{Scoreboard} -By clicking the \textbf{scoreboard} link on the top of the overview page, you -can access the scoreboard page. - -\begin{center} - \includegraphics[scale=0.3]{scoreboard.png} -\end{center} - -We are following the standard ACM-ICPC rule: - -Teams are ranked according to the most problems solved. -Teams who solve the same number of problems are ranked first by least total -time and, if need be, by the earliest time of submittal of the last accepted -run. - -The total time is the sum of the time consumed for each problem solved. -The time consumed for a solved problem is the time elapsed from the beginning -of the contest to the submittal of the first accepted run plus 20 penalty -minutes for every previously rejected run for that problem. -There is no time consumed for a problem that is not solved. - -\newpage -\section{Solving a Problem} -In competitive programming contests, solving a problem takes -the following three steps: -\begin{enumerate} - \item Read the Problem Statement - \item Write Code and Test - \item Submit Your Code to the Judge -\end{enumerate} - -\subsection{Reading the Problem Statement} -In most programming contests, the problem statement usually -consists of several parts: -\img{0.25}{i.png} -\noindent In addition, a problem might also have a time limit and a memory limit -your program can reach at maximum: -\img{0.3}{j.png} -\noindent In conclusion, you need to read the problem statement, -extract useful information, -understand and model the problem it asks you to solve, -and think of the approariate algorithms and data structures -you will use later.\\\\ -It is also extremely important to pay attension to the range of the input -data, as different ranges may indicate completely different algorithms -and difficulty levels for the problem. - -\newpage -\subsection{Writing Code and Testing} -\subsubsection{Basics} -You write your code, compile it (for compiled languages), and test it on your -local machine.\\\\ -All your code should be contained in a single source file, no matter what -language you use.\\\\ -Your program should read the data from standard input, solve the problem -specified in the statement, and print the results to standard output (unless -otherwise specified).\\\\ -Make sure you test your solution against the sample inputs and outputs, as it is -a bare minimum requirement for your solution to get accepted by the judge. - -\subsubsection{Exit Code of Your Program} -No matter what language you use, your program should always have zero as the -exit code.\\\\ -A non-zero exit code will make the judge think your program terminated in an -abnormal way, and will not accept your solution even if your output is -correct.\\\\ -C++ users, please "return 0" manually in your main function. -Python and Java users, as long as you do not call some system -function to explicitly return a non-zero value, you should be fine. - -\subsubsection{Starter Code for C++, Java and Python} -The following programs read an integer from the input, multiply it by 2 -and print it to the output.\\ -This should teach you what a minimal solution should look like -and how to do basic IO.\\ -\begin{verbatim} -// C++ -int main() // do not use void main!!!! -{ - int x; - cin >> x; - cout << x*2 << endl; - return 0; -} -\end{verbatim} -\hrule -\begin{verbatim} -// Java - -// do not specify any packages!!! - -import java.io.*; -import java.util.*; - -public class Main { // "Main" should be used for most online judges - public static void main(String[] args) { - Scanner sc = new Scanner(System.in); - - int x = sc.nextInt(); - System.out.printf("%d\n", x); - } -} -\end{verbatim} -\hrule - -\vspace{2pt} -We highly recommend Python users to select PyPy for Python solutions -because PyPy is significantly faster than the standard Python Implementation. - -\begin{verbatim} -# python3 -x = int(input()) -print(x*2) - - -# python2 -x = int(raw_input()) -print x*2 -\end{verbatim} - -\newpage -\section{Understanding The Judge's Verdicts} -After your submission is received, the judge will run your -program against it's own comprehensive test cases, which are not -visible to you, and give you a verdict.\\\\ -The judge's verdict can be one of the following types: - -\begin{itemize} - \item \textbf{CORRECT} - The submission passed all tests: you solved this problem! - \item \textbf{COMPILER-ERROR} - There was an error when compiling your program. On the submission - details page you can inspect the exact error. - \item \textbf{TIMELIMIT} - Your program took longer than the maximum allowed time for this - problem. Therefore it has been aborted. This might indicate that - your program hangs in a loop or that your solution is not efficient - enough. - \item \textbf{RUN-ERROR} - There was an error during the execution of your program. This - can have a lot of different causes like division by zero, incorrectly - addressing memory (e.g. by indexing arrays out of bounds), trying - to use more memory than the limit, etc. Also check that your - program exits with exit code 0! - \item \textbf{NO-OUTPUT} - Your program did not generate any output. Check that you write - to standard out. - \item \textbf{OUTPUT-LIMIT} - Your program generated more output than the allowed limit. The - output was truncated and considered incorrect. - \item \textbf{WRONG-ANSWER} - The output of your program was incorrect. This can happen sim- - ply because your solution is not correct, but remember that your - output must comply exactly with the specifications of the jury. - \item \textbf{TOO-LATE} - Bummer, you submitted after the contest ended! Your submission - is stored but will not be processed anymore. -\end{itemize} - -\newpage -\section{Working With Command Line Prompt} -If you are using an EWS machine, your preferred IDE or GUI editor may not be -available. In this case, you need to switch to a text editor (vim, emacs, -sublime etc.), compile, run and test your code using the command line prompt. -\subsection{Compile and Run Your Code} -\subsubsection{C++} -\begin{verbatim} -# suppose src.cpp is your source file, use g++ to compile it -g++ src.cpp -# this will generate an executable file a.out, and you can run it by calling -./a.out - -# you can use the -o option to specify the name of the executable -# otherwise, the name defaults to "a.out" -g++ src.cpp -o my_program - -# if you want to use c++11, make sure to add the following option -g++ -std=c++11 src.cpp -\end{verbatim} - -\subsubsection{Java} -\begin{verbatim} -# suppose Main.java is your source file, use javac to compile it -javac Main.java -# this will generate a file named "Main.class" under the same directory -# then use java to run it -java Main -\end{verbatim} - -\subsubsection{Python} -\begin{verbatim} -# python is an interpreted language -# use python/python3 to run your code directly -python src.py -python3 src.py -\end{verbatim} - -\newpage -\subsection{Input/Output Redirection} -Bash allows you to redirect the input and the output of a process. -This is very useful for testing as it can save you from typing -the input data every time.\\ -\begin{verbatim} -# suppose you write your input data to a text file input.txt -# then you can use < to read the data from the file and feed it to a program -my_program < input.txt - -# use > to write the output of a program to a file -my_program > output.txt - -# use | to pipe the output of a program to another program -ls | grep '.cpp' -\end{verbatim} - -\subsection{Other Useful Commands} -\begin{verbatim} -# change the current directory to xxx -cd xxx -# the path can contain .. which means the "parent directory" -cd ../yyy - -# display all the files and sub directories under the current directory -ls - -# delete the file a.cpp -rm a.cpp -# delete the directory "mydir" recursively -rm -rf mydir -\end{verbatim} -\end{document} - +\documentclass {article} + +\usepackage{geometry} +\geometry { + a4paper, + total={210mm,297mm}, + left=20mm, + right=20mm, + top=20mm, + bottom=20mm, + } + +\usepackage{fancyhdr} +\pagestyle{fancy} +\fancyhf{} +\rhead{} +\lhead{Beginner's Guide For Domjudge} +\rfoot{Page \thepage} + +\usepackage {hyperref, amsmath, amsthm, amssymb, graphicx, tabularx} +\everymath {\displaystyle} + +\newtheorem {theorem}{Theorem} +\newtheorem*{theorem*}{Theorem} + +\newcommand{\define}{\newcommand} +\define{\set}[1]{\{{#1}\}} + +\define{\img}[2]{{\begin{center}\includegraphics[scale={#1}]{{#2}}\end{center}}} + + +\begin {document} + +\tableofcontents + +\newpage +\section{DOMjudge} +\subsection{Overview} +DOMjudge is the online judge we use to host contests. + +Go to \url{http://domjudge2.cs.illinois.edu/team/} and enter your assigned +credentials to access the contest dashboard. + +\begin{center} + \includegraphics[scale=0.3]{dashboard.png} +\end{center} + +On this page, you can +\begin{itemize} +\item view problem statements by clicking the problem names. +\item view the list of past submissions and verdicts (more about verdicts + later). +\item upload your solution. +\item view and request clarification to problems. +\end{itemize} + +\subsection{Scoreboard} +By clicking the \textbf{scoreboard} link on the top of the overview page, you +can access the scoreboard page. + +\begin{center} + \includegraphics[scale=0.3]{scoreboard.png} +\end{center} + +We are following the standard ACM-ICPC rule: + +Teams are ranked according to the most problems solved. +Teams who solve the same number of problems are ranked first by least total +time and, if need be, by the earliest time of submittal of the last accepted +run. + +The total time is the sum of the time consumed for each problem solved. +The time consumed for a solved problem is the time elapsed from the beginning +of the contest to the submittal of the first accepted run plus 20 penalty +minutes for every previously rejected run for that problem. +There is no time consumed for a problem that is not solved. + +\newpage +\section{Solving a Problem} +In competitive programming contests, solving a problem takes +the following three steps: +\begin{enumerate} + \item Read the Problem Statement + \item Write Code and Test + \item Submit Your Code to the Judge +\end{enumerate} + +\subsection{Reading the Problem Statement} +In most programming contests, the problem statement usually +consists of several parts: +\img{0.25}{i.png} +\noindent In addition, a problem might also have a time limit and a memory limit +your program can reach at maximum: +\img{0.3}{j.png} +\noindent In conclusion, you need to read the problem statement, +extract useful information, +understand and model the problem it asks you to solve, +and think of the approariate algorithms and data structures +you will use later.\\\\ +It is also extremely important to pay attension to the range of the input +data, as different ranges may indicate completely different algorithms +and difficulty levels for the problem. + +\newpage +\subsection{Writing Code and Testing} +\subsubsection{Basics} +You write your code, compile it (for compiled languages), and test it on your +local machine.\\\\ +All your code should be contained in a single source file, no matter what +language you use.\\\\ +Your program should read the data from standard input, solve the problem +specified in the statement, and print the results to standard output (unless +otherwise specified).\\\\ +Make sure you test your solution against the sample inputs and outputs, as it is +a bare minimum requirement for your solution to get accepted by the judge. + +\subsubsection{Exit Code of Your Program} +No matter what language you use, your program should always have zero as the +exit code.\\\\ +A non-zero exit code will make the judge think your program terminated in an +abnormal way, and will not accept your solution even if your output is +correct.\\\\ +C++ users, please "return 0" manually in your main function. +Python and Java users, as long as you do not call some system +function to explicitly return a non-zero value, you should be fine. + +\subsubsection{Starter Code for C++, Java and Python} +The following programs read an integer from the input, multiply it by 2 +and print it to the output.\\ +This should teach you what a minimal solution should look like +and how to do basic IO.\\ +\begin{verbatim} +// C++ +int main() // do not use void main!!!! +{ + int x; + cin >> x; + cout << x*2 << endl; + return 0; +} +\end{verbatim} +\hrule +\begin{verbatim} +// Java + +// do not specify any packages!!! + +import java.io.*; +import java.util.*; + +public class Main { // "Main" should be used for most online judges + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + + int x = sc.nextInt(); + System.out.printf("%d\n", x); + } +} +\end{verbatim} +\hrule + +\vspace{2pt} +We highly recommend Python users to select PyPy for Python solutions +because PyPy is significantly faster than the standard Python Implementation. + +\begin{verbatim} +# python3 +x = int(input()) +print(x*2) + + +# python2 +x = int(raw_input()) +print x*2 +\end{verbatim} + +\newpage +\section{Understanding The Judge's Verdicts} +After your submission is received, the judge will run your +program against it's own comprehensive test cases, which are not +visible to you, and give you a verdict.\\\\ +The judge's verdict can be one of the following types: + +\begin{itemize} + \item \textbf{CORRECT} + The submission passed all tests: you solved this problem! + \item \textbf{COMPILER-ERROR} + There was an error when compiling your program. On the submission + details page you can inspect the exact error. + \item \textbf{TIMELIMIT} + Your program took longer than the maximum allowed time for this + problem. Therefore it has been aborted. This might indicate that + your program hangs in a loop or that your solution is not efficient + enough. + \item \textbf{RUN-ERROR} + There was an error during the execution of your program. This + can have a lot of different causes like division by zero, incorrectly + addressing memory (e.g. by indexing arrays out of bounds), trying + to use more memory than the limit, etc. Also check that your + program exits with exit code 0! + \item \textbf{NO-OUTPUT} + Your program did not generate any output. Check that you write + to standard out. + \item \textbf{OUTPUT-LIMIT} + Your program generated more output than the allowed limit. The + output was truncated and considered incorrect. + \item \textbf{WRONG-ANSWER} + The output of your program was incorrect. This can happen sim- + ply because your solution is not correct, but remember that your + output must comply exactly with the specifications of the jury. + \item \textbf{TOO-LATE} + Bummer, you submitted after the contest ended! Your submission + is stored but will not be processed anymore. +\end{itemize} + +\newpage +\section{Working With Command Line Prompt} +If you are using an EWS machine, your preferred IDE or GUI editor may not be +available. In this case, you need to switch to a text editor (vim, emacs, +sublime etc.), compile, run and test your code using the command line prompt. +\subsection{Compile and Run Your Code} +\subsubsection{C++} +\begin{verbatim} +# suppose src.cpp is your source file, use g++ to compile it +g++ src.cpp +# this will generate an executable file a.out, and you can run it by calling +./a.out + +# you can use the -o option to specify the name of the executable +# otherwise, the name defaults to "a.out" +g++ src.cpp -o my_program + +# if you want to use c++11, make sure to add the following option +g++ -std=c++11 src.cpp +\end{verbatim} + +\subsubsection{Java} +\begin{verbatim} +# suppose Main.java is your source file, use javac to compile it +javac Main.java +# this will generate a file named "Main.class" under the same directory +# then use java to run it +java Main +\end{verbatim} + +\subsubsection{Python} +\begin{verbatim} +# python is an interpreted language +# use python/python3 to run your code directly +python src.py +python3 src.py +\end{verbatim} + +\newpage +\subsection{Input/Output Redirection} +Bash allows you to redirect the input and the output of a process. +This is very useful for testing as it can save you from typing +the input data every time.\\ +\begin{verbatim} +# suppose you write your input data to a text file input.txt +# then you can use < to read the data from the file and feed it to a program +my_program < input.txt + +# use > to write the output of a program to a file +my_program > output.txt + +# use | to pipe the output of a program to another program +ls | grep '.cpp' +\end{verbatim} + +\subsection{Other Useful Commands} +\begin{verbatim} +# change the current directory to xxx +cd xxx +# the path can contain .. which means the "parent directory" +cd ../yyy + +# display all the files and sub directories under the current directory +ls + +# delete the file a.cpp +rm a.cpp +# delete the directory "mydir" recursively +rm -rf mydir +\end{verbatim} +\end{document} + diff --git a/assets/domjudge/guide.toc b/assets/domjudge/guide.toc index ff81e8c..ef2e789 100644 --- a/assets/domjudge/guide.toc +++ b/assets/domjudge/guide.toc @@ -1,17 +1,17 @@ -\contentsline {section}{\numberline {1}DOMjudge}{2}{section.1} -\contentsline {subsection}{\numberline {1.1}Overview}{2}{subsection.1.1} -\contentsline {subsection}{\numberline {1.2}Scoreboard}{2}{subsection.1.2} -\contentsline {section}{\numberline {2}Solving a Problem}{3}{section.2} -\contentsline {subsection}{\numberline {2.1}Reading the Problem Statement}{3}{subsection.2.1} -\contentsline {subsection}{\numberline {2.2}Writing Code and Testing}{4}{subsection.2.2} -\contentsline {subsubsection}{\numberline {2.2.1}Basics}{4}{subsubsection.2.2.1} -\contentsline {subsubsection}{\numberline {2.2.2}Exit Code of Your Program}{4}{subsubsection.2.2.2} -\contentsline {subsubsection}{\numberline {2.2.3}Starter Code for C++, Java and Python}{4}{subsubsection.2.2.3} -\contentsline {section}{\numberline {3}Understanding The Judge's Verdicts}{6}{section.3} -\contentsline {section}{\numberline {4}Working With Command Line Prompt}{7}{section.4} -\contentsline {subsection}{\numberline {4.1}Compile and Run Your Code}{7}{subsection.4.1} -\contentsline {subsubsection}{\numberline {4.1.1}C++}{7}{subsubsection.4.1.1} -\contentsline {subsubsection}{\numberline {4.1.2}Java}{7}{subsubsection.4.1.2} -\contentsline {subsubsection}{\numberline {4.1.3}Python}{7}{subsubsection.4.1.3} -\contentsline {subsection}{\numberline {4.2}Input/Output Redirection}{8}{subsection.4.2} -\contentsline {subsection}{\numberline {4.3}Other Useful Commands}{8}{subsection.4.3} +\contentsline {section}{\numberline {1}DOMjudge}{2}{section.1} +\contentsline {subsection}{\numberline {1.1}Overview}{2}{subsection.1.1} +\contentsline {subsection}{\numberline {1.2}Scoreboard}{2}{subsection.1.2} +\contentsline {section}{\numberline {2}Solving a Problem}{3}{section.2} +\contentsline {subsection}{\numberline {2.1}Reading the Problem Statement}{3}{subsection.2.1} +\contentsline {subsection}{\numberline {2.2}Writing Code and Testing}{4}{subsection.2.2} +\contentsline {subsubsection}{\numberline {2.2.1}Basics}{4}{subsubsection.2.2.1} +\contentsline {subsubsection}{\numberline {2.2.2}Exit Code of Your Program}{4}{subsubsection.2.2.2} +\contentsline {subsubsection}{\numberline {2.2.3}Starter Code for C++, Java and Python}{4}{subsubsection.2.2.3} +\contentsline {section}{\numberline {3}Understanding The Judge's Verdicts}{6}{section.3} +\contentsline {section}{\numberline {4}Working With Command Line Prompt}{7}{section.4} +\contentsline {subsection}{\numberline {4.1}Compile and Run Your Code}{7}{subsection.4.1} +\contentsline {subsubsection}{\numberline {4.1.1}C++}{7}{subsubsection.4.1.1} +\contentsline {subsubsection}{\numberline {4.1.2}Java}{7}{subsubsection.4.1.2} +\contentsline {subsubsection}{\numberline {4.1.3}Python}{7}{subsubsection.4.1.3} +\contentsline {subsection}{\numberline {4.2}Input/Output Redirection}{8}{subsection.4.2} +\contentsline {subsection}{\numberline {4.3}Other Useful Commands}{8}{subsection.4.3} diff --git a/assets/dropbox_open/about.md b/assets/dropbox_open/about.md index 2802d99..f8a3146 100644 --- a/assets/dropbox_open/about.md +++ b/assets/dropbox_open/about.md @@ -1,136 +1,136 @@ ---- -layout: default -title: SIG-ICPC Dropbox Open Programming Contest ---- - -

SIG-ICPC Dropbox Open Programming Contest

-

- -
-
Sponsored by:
-
- -and - -
-
- - -
-

What?

-
- The SIG-ICPC Dropbox Open Programming Contest (Dropbox Open) -
- An ICPC-style programming contest open to students of UIUC, sponsored by Dropbox. -

- Bring your resumes! Dropbox will be collecting resumes for future internship and full-time positions! -
-
- -
-

When?

-
- Saturday, April 18th, from 10:30 AM to 6 PM CDT -
-
- -
-

Where?

-
- Siebel Center, Room 2405 -
-
- -
-

Why?

-
- It’ll be a lot of fun! The Dropbox Open is great for people who like solving challenging algorithms and programming problems. Dropbox will also be looking to hire top performers for internship and full-time positions. (Plus, free food and prizes!) -
-
- -
-

Registration

-
- Register here! (requires Google login) -

- Check this page for updates as we get closer to the contest. We will also send e-mail updates to registered students. Registration closes promptly at 10:30 AM CDT on Saturday, April 18th. -
-
- -
-

Schedule

-
- Registration: until 10:30 AM CDT
- Practice Contest: 10:30 - 11:45 AM CDT (students may grab lunch during this time)
- Dropbox Open: 12:00 - 5:00 PM CDT
- Dinner and Awards: 5:15 - 6:00 PM CDT (dinner will be provided)
-
-
- -
-

Food

-
- We will be providing snacks and water during the contest, but you can bring your own snacks and drinks. Make sure to eat lunch before the contest or grab lunch during the practice contest. Dinner will be provided after the contest during the awards ceremony. -
-
- -
-

Prizes

-
-
    -
  • First place team: $100 each
  • -
  • Second place team: $50 each
  • -
  • Third place team: $25 each
  • -
-
-
- -
-

Teams

-
-
    -
  • Teams of 3 students
  • -
  • Bring your own laptops
  • -
-

- If you can’t find a team by the end of registration, we will do our best to match you with other students as soon as registration ends, but we make no guarantees. Start looking for teammates now! -
-
- -
-

Eligibility

-
- Anyone eligible for the 2015 ICPC Mid-Central Regionals competition. -
- See the rules page for the full eligibility requirements. -
-
- -
-

Languages allowed

-
-
    -
  • C (C99)
  • -
  • C++ (C++11)
  • -
  • Java (Java 7)
  • -
-
-
- - - -
-

Questions?

-
- Please feel free to reach out to us at dropboxopen@acm.illinois.edu with any questions you have about the contest! -
-
- -
-Dropbox and the Dropbox logo are trademarks of Dropbox, Inc. -
+--- +layout: default +title: SIG-ICPC Dropbox Open Programming Contest +--- + +

SIG-ICPC Dropbox Open Programming Contest

+

+ +
+
Sponsored by:
+
+ +and + +
+
+ + +
+

What?

+
+ The SIG-ICPC Dropbox Open Programming Contest (Dropbox Open) +
+ An ICPC-style programming contest open to students of UIUC, sponsored by Dropbox. +

+ Bring your resumes! Dropbox will be collecting resumes for future internship and full-time positions! +
+
+ +
+

When?

+
+ Saturday, April 18th, from 10:30 AM to 6 PM CDT +
+
+ +
+

Where?

+
+ Siebel Center, Room 2405 +
+
+ +
+

Why?

+
+ It’ll be a lot of fun! The Dropbox Open is great for people who like solving challenging algorithms and programming problems. Dropbox will also be looking to hire top performers for internship and full-time positions. (Plus, free food and prizes!) +
+
+ +
+

Registration

+
+ Register here! (requires Google login) +

+ Check this page for updates as we get closer to the contest. We will also send e-mail updates to registered students. Registration closes promptly at 10:30 AM CDT on Saturday, April 18th. +
+
+ +
+

Schedule

+
+ Registration: until 10:30 AM CDT
+ Practice Contest: 10:30 - 11:45 AM CDT (students may grab lunch during this time)
+ Dropbox Open: 12:00 - 5:00 PM CDT
+ Dinner and Awards: 5:15 - 6:00 PM CDT (dinner will be provided)
+
+
+ +
+

Food

+
+ We will be providing snacks and water during the contest, but you can bring your own snacks and drinks. Make sure to eat lunch before the contest or grab lunch during the practice contest. Dinner will be provided after the contest during the awards ceremony. +
+
+ +
+

Prizes

+
+
    +
  • First place team: $100 each
  • +
  • Second place team: $50 each
  • +
  • Third place team: $25 each
  • +
+
+
+ +
+

Teams

+
+
    +
  • Teams of 3 students
  • +
  • Bring your own laptops
  • +
+

+ If you can’t find a team by the end of registration, we will do our best to match you with other students as soon as registration ends, but we make no guarantees. Start looking for teammates now! +
+
+ +
+

Eligibility

+
+ Anyone eligible for the 2015 ICPC Mid-Central Regionals competition. +
+ See the rules page for the full eligibility requirements. +
+
+ +
+

Languages allowed

+
+
    +
  • C (C99)
  • +
  • C++ (C++11)
  • +
  • Java (Java 7)
  • +
+
+
+ + + +
+

Questions?

+
+ Please feel free to reach out to us at dropboxopen@acm.illinois.edu with any questions you have about the contest! +
+
+ +
+Dropbox and the Dropbox logo are trademarks of Dropbox, Inc. +
diff --git a/assets/dropbox_open/register.html b/assets/dropbox_open/register.html index 405299c..f57661c 100644 --- a/assets/dropbox_open/register.html +++ b/assets/dropbox_open/register.html @@ -1,2 +1,2 @@ - - + + diff --git a/assets/dropbox_open/rules.md b/assets/dropbox_open/rules.md index 8cfa91a..d247e79 100644 --- a/assets/dropbox_open/rules.md +++ b/assets/dropbox_open/rules.md @@ -1,142 +1,142 @@ ---- -layout: default -title: SIG-ICPC Dropbox Open Programming Contest Rules ---- - -

Dropbox Open Rules

-
- - -

Contest Logistics and Registration:

-The SIG-ICPC Dropbox Open Programming Contest, hereafter referred to as “the Dropbox Open” or “the contest”, will be held on Saturday, April 18th, from 10:30 AM to 6 PM CDT. The contest will take place in Room 2405 of the Thomas M. Siebel Center for Computer Science, located at 201 N. Goodwin Avenue, Urbana, IL 61801. All participants in the contest must register at the contest website, http://icpc.cs.illinois.edu/contest/register.html. Registration closes promptly at 10:30 AM CDT on the morning of Saturday, April 18th. - -
- -After the close of registration on the day of the contest, the Dropbox Open contest team will issue contest environment login credentials to each team to be used for the duration of the contest. Before the start of the contest, teams may use the login credentials to participate in a practice contest that will be used to ensure that all participants are familiar with the contest environment. The practice contest will start at 10:30 AM CDT and will end at 11:45 AM CDT. The official SIG-ICPC Dropbox Open Programming Contest will start promptly at 12:00 PM CDT and run for a duration of five (5) hours until 5:00 PM CDT. Following the contest, the judges will perform final scoring and announce the results. - -
- -Snacks and water will be provided during the contest, and dinner will be provided after the contest. Contestants may bring their own food and drinks to the contest if desired. - -
- -Upon participation in the contest, it is implied that we reserve the right to share your resume and other information with our corporate sponsor, Dropbox, and use them for SIG-ICPC recruitment purposes. By attending the SIG-ICPC Dropbox Open Programming Contest, you acknowledge that your picture and video may be used without compensation, prior permission, or notification in any promotional material related to SIG-ICPC or the Dropbox Open. - -
- - -

Teams:

-Participants must compete in teams of their own choosing of three (3) students. All teams must be registered before the start of the contest to participate. Participants who cannot find a team before the date of the contest will be matched to other students on a first-registered first-serve basis on the date of the competition starting immediately after the close of registration. Unlike ICPC contests, we are allowing participants to use their own laptop computers (up to a maximum of three (3) computers per team) and have full access to any physical materials or online resources during the contest, excepting mobile phones. Participants may NOT communicate with anyone during the contest except their team or the contest staff for any matter related to the contest, or risk disqualification at the discretion of the Dropbox Open contest team. - -
- - -

Eligibility:

-All participants must be full-time or part-time students at the University of Illinois at Urbana-Champaign during Spring 2015, and must not be graduating prior to December 2015. Participants must plan to be enrolled as either full-time or part-time students in the December 2015 semester. Participants must also meet all 2015 ICPC Regionals eligibility requirements, which are as follows: 1) Participants must not have competed in 2 ICPC World Finals competitions or 5 ICPC Regionals competitions. 2) Participants must have started post-secondary studies in or after 2011, or must have been born in 1992 or later. The full eligibility requirements are indicated in the flowchart available at http://icpc.cs.illinois.edu/contest/eligibility.pdf. Any participants seeking exemptions to the eligibility requirements must contact the Dropbox Open contest team at dropboxopen@acm.illinois.edu. - -
- - -

Contest Environment:

-During the contest, teams will submit proposed solutions to the contest problems to the Judges using the DOMjudge contest control system. Solutions will only be accepted in the C, C++ or Java programming languages. Source files submitted to the Judges will be compiled using the following command line arguments for the respective language: - -

-C (C99):
-gcc -Wall -O2 -static -pipe -std=gnu99 "$*" -lm - -
- -C++ (C++11):
-g++ -Wall -O2 -static -pipe -std=gnu++11 "$*" - -
- -Java (Java 7):
-javac -d . $* -

- -
- -The "$*" in the above commands represents the list of source files from the submission which will actually be compiled. Files with the following suffixes (and only files with these suffixes) will be submitted to the compiler: -
-For C submissions: files ending with .c - -For C++ submissions: files ending with .cc, .cpp, .cxx, .c++, or .C - -For Java submissions: files ending with .java -
- -
- -For C/C++, the resulting executable will be executed to generate the output of the submission. -For Java, the compiled code will be executed using the following command: -

-java -Xrs -Xss8m $* -

- -
- -All submissions must read input from standard input and write output to standard output (also known as the console). You will never be required to open (other) files. - -
- -For a summary of the DOMjudge system interface and instructions on submission, reference the DOMjudge team manual, available at http://icpc.cs.illinois.edu/contest/team-manual.pdf. - -
- - -

Judging:

-Solutions to problems submitted for judging are called 'runs'. Each run is judged as accepted or rejected by a judge, and the team is notified of the results. - -
- -Notification of accepted runs may be suspended at an appropriate time to keep the final results secret. A general announcement to that effect will be made during the contest. Notification of rejected runs will continue until the end of the contest. - -
- -A contestant may submit a claim of ambiguity or error in a problem statement by submitting a clarification request to a judge. If the judges agree that an ambiguity or error exists, a clarification will be issued to all contestants. - -
- -While the contest is scheduled for five hours, the Dropbox Open contest team reserves the authority to alter the length of the contest in the event of unforeseen difficulties. Should the contest duration be altered, every attempt will be made to notify contestants in a timely and uniform manner. - -
- -A team may be disqualified by the Dropbox Open contest team for any activity that jeopardizes the contest such as dislodging power cords, unauthorized modification of contest materials, communication with outside parties, or distracting behavior. - -
- -At least twelve problems will be posed. So far as possible, problems will avoid dependence on detailed knowledge of a particular applications area or particular contest language. - -
- - -

Scoring:

-A problem is considered 'solved' when it is accepted by the judges. The judges are solely responsible for accepting or rejecting submitted runs. In consultation with the judges, the Dropbox Open contest staff will determine the winners of the contest. The contest staff and judges are empowered to adjust for or adjudicate unforeseen events and conditions. Their decisions are final. - -
- -Teams will be ranked according to the most problems solved. For the purposes of awards, teams who solve the same number of problems are ranked by least total time. The total time is the sum of the time consumed for each problem solved. The time consumed for a solved problem is the time elapsed from the beginning of the contest to the submittal of the accepted run plus 20 penalty minutes for every rejected run for that problem regardless of submittal time. There is no time consumed for a problem that is not solved. - -
- -In the event that multiple teams have the same number of problems solved and the same total time, ties will be broken based on the submittal time of the accepted runs for the teams. If the last submittal time for the last solved problem is different, the team with the earliest such time will win the tie. Otherwise, the comparison will continue for the second-to-last solved problem, third-to-last, and so forth until the beginning of the contest. Any additional tie-breaker policies will be announced to participants before the contest begins. - -
- - -

Prizes:

-All members of the highest scoring team will be awarded prizes worth $100. All members of the second highest scoring team will be awarded prizes worth $50. All members of the third highest scoring team will be awarded prizes worth $25. - -
- -All prize-winning teams will be responsible for working with the SIG-ICPC Dropbox Open Programming Contest team, ACM SIG-ICPC executive committee, and the University of Illinois Computer Science department to arrange for delivery of the prizes. - -
- -

Other:

-Rules are subject to change at any time. The SIG-ICPC Dropbox Open Programming Contest team reserves the right to change contest rules or disqualify any participant at any time at their discretion. - -
- -Dropbox and the Dropbox logo are trademarks of Dropbox, Inc. +--- +layout: default +title: SIG-ICPC Dropbox Open Programming Contest Rules +--- + +

Dropbox Open Rules

+
+ + +

Contest Logistics and Registration:

+The SIG-ICPC Dropbox Open Programming Contest, hereafter referred to as “the Dropbox Open” or “the contest”, will be held on Saturday, April 18th, from 10:30 AM to 6 PM CDT. The contest will take place in Room 2405 of the Thomas M. Siebel Center for Computer Science, located at 201 N. Goodwin Avenue, Urbana, IL 61801. All participants in the contest must register at the contest website, http://icpc.cs.illinois.edu/contest/register.html. Registration closes promptly at 10:30 AM CDT on the morning of Saturday, April 18th. + +
+ +After the close of registration on the day of the contest, the Dropbox Open contest team will issue contest environment login credentials to each team to be used for the duration of the contest. Before the start of the contest, teams may use the login credentials to participate in a practice contest that will be used to ensure that all participants are familiar with the contest environment. The practice contest will start at 10:30 AM CDT and will end at 11:45 AM CDT. The official SIG-ICPC Dropbox Open Programming Contest will start promptly at 12:00 PM CDT and run for a duration of five (5) hours until 5:00 PM CDT. Following the contest, the judges will perform final scoring and announce the results. + +
+ +Snacks and water will be provided during the contest, and dinner will be provided after the contest. Contestants may bring their own food and drinks to the contest if desired. + +
+ +Upon participation in the contest, it is implied that we reserve the right to share your resume and other information with our corporate sponsor, Dropbox, and use them for SIG-ICPC recruitment purposes. By attending the SIG-ICPC Dropbox Open Programming Contest, you acknowledge that your picture and video may be used without compensation, prior permission, or notification in any promotional material related to SIG-ICPC or the Dropbox Open. + +
+ + +

Teams:

+Participants must compete in teams of their own choosing of three (3) students. All teams must be registered before the start of the contest to participate. Participants who cannot find a team before the date of the contest will be matched to other students on a first-registered first-serve basis on the date of the competition starting immediately after the close of registration. Unlike ICPC contests, we are allowing participants to use their own laptop computers (up to a maximum of three (3) computers per team) and have full access to any physical materials or online resources during the contest, excepting mobile phones. Participants may NOT communicate with anyone during the contest except their team or the contest staff for any matter related to the contest, or risk disqualification at the discretion of the Dropbox Open contest team. + +
+ + +

Eligibility:

+All participants must be full-time or part-time students at the University of Illinois at Urbana-Champaign during Spring 2015, and must not be graduating prior to December 2015. Participants must plan to be enrolled as either full-time or part-time students in the December 2015 semester. Participants must also meet all 2015 ICPC Regionals eligibility requirements, which are as follows: 1) Participants must not have competed in 2 ICPC World Finals competitions or 5 ICPC Regionals competitions. 2) Participants must have started post-secondary studies in or after 2011, or must have been born in 1992 or later. The full eligibility requirements are indicated in the flowchart available at http://icpc.cs.illinois.edu/contest/eligibility.pdf. Any participants seeking exemptions to the eligibility requirements must contact the Dropbox Open contest team at dropboxopen@acm.illinois.edu. + +
+ + +

Contest Environment:

+During the contest, teams will submit proposed solutions to the contest problems to the Judges using the DOMjudge contest control system. Solutions will only be accepted in the C, C++ or Java programming languages. Source files submitted to the Judges will be compiled using the following command line arguments for the respective language: + +

+C (C99):
+gcc -Wall -O2 -static -pipe -std=gnu99 "$*" -lm + +
+ +C++ (C++11):
+g++ -Wall -O2 -static -pipe -std=gnu++11 "$*" + +
+ +Java (Java 7):
+javac -d . $* +

+ +
+ +The "$*" in the above commands represents the list of source files from the submission which will actually be compiled. Files with the following suffixes (and only files with these suffixes) will be submitted to the compiler: +
+For C submissions: files ending with .c + +For C++ submissions: files ending with .cc, .cpp, .cxx, .c++, or .C + +For Java submissions: files ending with .java +
+ +
+ +For C/C++, the resulting executable will be executed to generate the output of the submission. +For Java, the compiled code will be executed using the following command: +

+java -Xrs -Xss8m $* +

+ +
+ +All submissions must read input from standard input and write output to standard output (also known as the console). You will never be required to open (other) files. + +
+ +For a summary of the DOMjudge system interface and instructions on submission, reference the DOMjudge team manual, available at http://icpc.cs.illinois.edu/contest/team-manual.pdf. + +
+ + +

Judging:

+Solutions to problems submitted for judging are called 'runs'. Each run is judged as accepted or rejected by a judge, and the team is notified of the results. + +
+ +Notification of accepted runs may be suspended at an appropriate time to keep the final results secret. A general announcement to that effect will be made during the contest. Notification of rejected runs will continue until the end of the contest. + +
+ +A contestant may submit a claim of ambiguity or error in a problem statement by submitting a clarification request to a judge. If the judges agree that an ambiguity or error exists, a clarification will be issued to all contestants. + +
+ +While the contest is scheduled for five hours, the Dropbox Open contest team reserves the authority to alter the length of the contest in the event of unforeseen difficulties. Should the contest duration be altered, every attempt will be made to notify contestants in a timely and uniform manner. + +
+ +A team may be disqualified by the Dropbox Open contest team for any activity that jeopardizes the contest such as dislodging power cords, unauthorized modification of contest materials, communication with outside parties, or distracting behavior. + +
+ +At least twelve problems will be posed. So far as possible, problems will avoid dependence on detailed knowledge of a particular applications area or particular contest language. + +
+ + +

Scoring:

+A problem is considered 'solved' when it is accepted by the judges. The judges are solely responsible for accepting or rejecting submitted runs. In consultation with the judges, the Dropbox Open contest staff will determine the winners of the contest. The contest staff and judges are empowered to adjust for or adjudicate unforeseen events and conditions. Their decisions are final. + +
+ +Teams will be ranked according to the most problems solved. For the purposes of awards, teams who solve the same number of problems are ranked by least total time. The total time is the sum of the time consumed for each problem solved. The time consumed for a solved problem is the time elapsed from the beginning of the contest to the submittal of the accepted run plus 20 penalty minutes for every rejected run for that problem regardless of submittal time. There is no time consumed for a problem that is not solved. + +
+ +In the event that multiple teams have the same number of problems solved and the same total time, ties will be broken based on the submittal time of the accepted runs for the teams. If the last submittal time for the last solved problem is different, the team with the earliest such time will win the tie. Otherwise, the comparison will continue for the second-to-last solved problem, third-to-last, and so forth until the beginning of the contest. Any additional tie-breaker policies will be announced to participants before the contest begins. + +
+ + +

Prizes:

+All members of the highest scoring team will be awarded prizes worth $100. All members of the second highest scoring team will be awarded prizes worth $50. All members of the third highest scoring team will be awarded prizes worth $25. + +
+ +All prize-winning teams will be responsible for working with the SIG-ICPC Dropbox Open Programming Contest team, ACM SIG-ICPC executive committee, and the University of Illinois Computer Science department to arrange for delivery of the prizes. + +
+ +

Other:

+Rules are subject to change at any time. The SIG-ICPC Dropbox Open Programming Contest team reserves the right to change contest rules or disqualify any participant at any time at their discretion. + +
+ +Dropbox and the Dropbox logo are trademarks of Dropbox, Inc. diff --git a/assets/ipl/solutions/18fa/cf/E-cf678d.cpp b/assets/ipl/solutions/18fa/cf/E-cf678d.cpp index e614cf2..946918c 100644 --- a/assets/ipl/solutions/18fa/cf/E-cf678d.cpp +++ b/assets/ipl/solutions/18fa/cf/E-cf678d.cpp @@ -1,57 +1,57 @@ -#include -#define LL long long -#define MOD 1000000007 - -using namespace std; - -struct Matrix { - int n = 2; - LL a[2][2]; - - Matrix () { - a[0][0] = a[0][1] = a[1][0] = a[1][1] = 0; - } - Matrix (int A, int B) { - a[0][0] = A; - a[0][1] = B; - a[1][0] = 0; - a[1][1] = 1; - } - - Matrix operator* (const Matrix &b) const { - Matrix ans; - for (int i = 0; i < n; i++) { - for (int j = 0; j < n; j++) { - for (int k = 0; k < n; k++) { - ans.a[i][j] += a[i][k] * b.a[k][j]; - ans.a[i][j] %= MOD; - } - } - } - return ans; - } - - Matrix operator^ (LL n) const { - Matrix ans; - ans.a[0][0] = ans.a[1][1] = 1; - Matrix base = *this; - while (n) { - if (n & 1) ans = ans * base; - base = base * base; - n >>= 1; - } - return ans; - } -}; - -int main () { - int A, B, x; LL n; - cin >> A >> B >> n >> x; - Matrix m(A, B); - Matrix mm = m ^ n; - LL ans = (mm.a[0][0] * x + mm.a[0][1]) % MOD; - cout << ans << endl; - - return 0; -} - +#include +#define LL long long +#define MOD 1000000007 + +using namespace std; + +struct Matrix { + int n = 2; + LL a[2][2]; + + Matrix () { + a[0][0] = a[0][1] = a[1][0] = a[1][1] = 0; + } + Matrix (int A, int B) { + a[0][0] = A; + a[0][1] = B; + a[1][0] = 0; + a[1][1] = 1; + } + + Matrix operator* (const Matrix &b) const { + Matrix ans; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + for (int k = 0; k < n; k++) { + ans.a[i][j] += a[i][k] * b.a[k][j]; + ans.a[i][j] %= MOD; + } + } + } + return ans; + } + + Matrix operator^ (LL n) const { + Matrix ans; + ans.a[0][0] = ans.a[1][1] = 1; + Matrix base = *this; + while (n) { + if (n & 1) ans = ans * base; + base = base * base; + n >>= 1; + } + return ans; + } +}; + +int main () { + int A, B, x; LL n; + cin >> A >> B >> n >> x; + Matrix m(A, B); + Matrix mm = m ^ n; + LL ans = (mm.a[0][0] * x + mm.a[0][1]) % MOD; + cout << ans << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest01/A-uva12751.cpp b/assets/ipl/solutions/18fa/contest01/A-uva12751.cpp index 6e51841..d9b5422 100644 --- a/assets/ipl/solutions/18fa/contest01/A-uva12751.cpp +++ b/assets/ipl/solutions/18fa/contest01/A-uva12751.cpp @@ -1,19 +1,19 @@ -#include -#define LL long long - -using namespace std; - - - -int main () { - int t; cin >> t; - for (int tt = 1; tt <= t; tt++) { - LL n, k, x; - cin >> n >> k >> x; - LL ans = n * (n + 1) / 2 - (2 * x + k - 1) * k / 2; - cout << "Case " << tt << ": " << ans << endl; - } - - return 0; -} - +#include +#define LL long long + +using namespace std; + + + +int main () { + int t; cin >> t; + for (int tt = 1; tt <= t; tt++) { + LL n, k, x; + cin >> n >> k >> x; + LL ans = n * (n + 1) / 2 - (2 * x + k - 1) * k / 2; + cout << "Case " << tt << ": " << ans << endl; + } + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest01/B-uva11417.cpp b/assets/ipl/solutions/18fa/contest01/B-uva11417.cpp index dcc1c43..02615be 100644 --- a/assets/ipl/solutions/18fa/contest01/B-uva11417.cpp +++ b/assets/ipl/solutions/18fa/contest01/B-uva11417.cpp @@ -1,23 +1,23 @@ -#include - -using namespace std; - -int gcd (int p, int q) { - return q == 0 ? p : gcd(q, p%q); -} - -int main () { - int n; - while (cin >> n && n != 0) { - int ans = 0; - for (int i = 1; i <= n; i++) { - for (int j = i+1; j <= n; j++) { - ans += gcd(i, j); - } - } - cout << ans << endl; - } - - return 0; -} - +#include + +using namespace std; + +int gcd (int p, int q) { + return q == 0 ? p : gcd(q, p%q); +} + +int main () { + int n; + while (cin >> n && n != 0) { + int ans = 0; + for (int i = 1; i <= n; i++) { + for (int j = i+1; j <= n; j++) { + ans += gcd(i, j); + } + } + cout << ans << endl; + } + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest01/C-uva10363.cpp b/assets/ipl/solutions/18fa/contest01/C-uva10363.cpp index ef8a182..e8c5231 100644 --- a/assets/ipl/solutions/18fa/contest01/C-uva10363.cpp +++ b/assets/ipl/solutions/18fa/contest01/C-uva10363.cpp @@ -1,68 +1,68 @@ -#include -#include - -using namespace std; - -int count_3_in_a_row (vector a, char c) { - int ans = 0; - for (int i = 0; i < 3; i++) { - // row - bool f = true; - for (int j = 0; j < 3; j++) { - if (a[i][j] != c) { - f = false; - } - } - ans += f; - // column - f = true; - for (int j = 0; j < 3; j++) { - if (a[j][i] != c) { - f = false; - } - } - ans += f; - } - // diagonals - bool f = true; - for (int i = 0; i < 3; i++) { - if (a[i][i] != c) { - f = false; - } - } - ans += f; - f = true; - for (int i = 0; i < 3; i++) { - if (a[i][2-i] != c) { - f = false; - } - } - ans += f; - return ans; -} - -int main () { - int t; cin >> t; - while (t--) { - vector a(3); - for (int i = 0; i < 3; i++) cin >> a[i]; - bool win_x = count_3_in_a_row(a, 'X') > 0; - bool win_o = count_3_in_a_row(a, 'O') > 0; - int cnt_x = 0, cnt_o = 0; - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { - cnt_x += a[i][j] == 'X'; - cnt_o += a[i][j] == 'O'; - } - } - bool f = false; - if (win_x && !win_o && cnt_x == cnt_o + 1) f = true; - if (!win_x && win_o && cnt_x == cnt_o) f = true; - if (!win_x && !win_o && (cnt_x == cnt_o + 1 || cnt_x == cnt_o)) f = true; - if (f) cout << "yes" << endl; - else cout << "no" << endl; - } - - return 0; -} - +#include +#include + +using namespace std; + +int count_3_in_a_row (vector a, char c) { + int ans = 0; + for (int i = 0; i < 3; i++) { + // row + bool f = true; + for (int j = 0; j < 3; j++) { + if (a[i][j] != c) { + f = false; + } + } + ans += f; + // column + f = true; + for (int j = 0; j < 3; j++) { + if (a[j][i] != c) { + f = false; + } + } + ans += f; + } + // diagonals + bool f = true; + for (int i = 0; i < 3; i++) { + if (a[i][i] != c) { + f = false; + } + } + ans += f; + f = true; + for (int i = 0; i < 3; i++) { + if (a[i][2-i] != c) { + f = false; + } + } + ans += f; + return ans; +} + +int main () { + int t; cin >> t; + while (t--) { + vector a(3); + for (int i = 0; i < 3; i++) cin >> a[i]; + bool win_x = count_3_in_a_row(a, 'X') > 0; + bool win_o = count_3_in_a_row(a, 'O') > 0; + int cnt_x = 0, cnt_o = 0; + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + cnt_x += a[i][j] == 'X'; + cnt_o += a[i][j] == 'O'; + } + } + bool f = false; + if (win_x && !win_o && cnt_x == cnt_o + 1) f = true; + if (!win_x && win_o && cnt_x == cnt_o) f = true; + if (!win_x && !win_o && (cnt_x == cnt_o + 1 || cnt_x == cnt_o)) f = true; + if (f) cout << "yes" << endl; + else cout << "no" << endl; + } + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest01/D-uva13178.cpp b/assets/ipl/solutions/18fa/contest01/D-uva13178.cpp index dbf76da..dfdb981 100644 --- a/assets/ipl/solutions/18fa/contest01/D-uva13178.cpp +++ b/assets/ipl/solutions/18fa/contest01/D-uva13178.cpp @@ -1,16 +1,16 @@ -#include - -using namespace std; - -int main () { - int t; - cin >> t; - while (t--) { - int n; - cin >> n; - if (n % 3 == 0 || (n + 1) % 3 == 0) cout << "YES" << endl; - else cout << "NO" << endl; - } - return 0; -} - +#include + +using namespace std; + +int main () { + int t; + cin >> t; + while (t--) { + int n; + cin >> n; + if (n % 3 == 0 || (n + 1) % 3 == 0) cout << "YES" << endl; + else cout << "NO" << endl; + } + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest01/F-uva13129.cpp b/assets/ipl/solutions/18fa/contest01/F-uva13129.cpp index 0cd09ef..4dce181 100644 --- a/assets/ipl/solutions/18fa/contest01/F-uva13129.cpp +++ b/assets/ipl/solutions/18fa/contest01/F-uva13129.cpp @@ -1,76 +1,76 @@ -#include -#include -#define LL long long -#define MOD 1000000007 - -using namespace std; - -int powplus1 (int p, int a) { - LL ans = 1, base = p; - while (a) { - if (a & 1) ans = ans * base % MOD; - base = base * base % MOD; - a >>= 1; - } - ans = (ans + 1) % MOD; - return (int)ans; -} - -LL extended_euclid(LL p, LL q, LL &x, LL &y) { - if (q == 0) { - x = 1; - y = 0; - return p; - } - LL gcd = extended_euclid(q, p%q, y, x); - y -= p / q * x; - return gcd; -} - -LL mod_linear_equation(LL a, LL b, LL n) { - LL x, y; - LL gcd = extended_euclid(a, n, x, y); - if (b % gcd) return -1; - x *= b / gcd; - x %= n / gcd; - if (x < 0) x += n / gcd; - return x; -} - -int main () { - cin.tie(0); - ios_base::sync_with_stdio(0); - int n, p; - while (cin >> n >> p) { - vector a(n+1); - for (int i = 1; i <= n; i++) cin >> a[i]; - vector s(n+1); - s[0] = 1; - vector zeros(n+1, 0); - for (int i = 1; i <= n; i++) { - s[i] = s[i-1] * powplus1(p, a[i]) % MOD; - zeros[i] = zeros[i-1]; - if (s[i] == 0) { - s[i] = 1; - zeros[i]++; - } - } - int q; - cin >> q; - while (q--) { - int l, r; - cin >> l >> r; - if (zeros[r] != zeros[l-1]) { - cout << MOD - 1 << endl; - continue; - } - LL inv = mod_linear_equation(s[l-1], 1, MOD); - LL ans = inv * s[r] % MOD; - ans = (ans + MOD - 1) % MOD; - cout << ans << endl; - } - } - - return 0; -} - +#include +#include +#define LL long long +#define MOD 1000000007 + +using namespace std; + +int powplus1 (int p, int a) { + LL ans = 1, base = p; + while (a) { + if (a & 1) ans = ans * base % MOD; + base = base * base % MOD; + a >>= 1; + } + ans = (ans + 1) % MOD; + return (int)ans; +} + +LL extended_euclid(LL p, LL q, LL &x, LL &y) { + if (q == 0) { + x = 1; + y = 0; + return p; + } + LL gcd = extended_euclid(q, p%q, y, x); + y -= p / q * x; + return gcd; +} + +LL mod_linear_equation(LL a, LL b, LL n) { + LL x, y; + LL gcd = extended_euclid(a, n, x, y); + if (b % gcd) return -1; + x *= b / gcd; + x %= n / gcd; + if (x < 0) x += n / gcd; + return x; +} + +int main () { + cin.tie(0); + ios_base::sync_with_stdio(0); + int n, p; + while (cin >> n >> p) { + vector a(n+1); + for (int i = 1; i <= n; i++) cin >> a[i]; + vector s(n+1); + s[0] = 1; + vector zeros(n+1, 0); + for (int i = 1; i <= n; i++) { + s[i] = s[i-1] * powplus1(p, a[i]) % MOD; + zeros[i] = zeros[i-1]; + if (s[i] == 0) { + s[i] = 1; + zeros[i]++; + } + } + int q; + cin >> q; + while (q--) { + int l, r; + cin >> l >> r; + if (zeros[r] != zeros[l-1]) { + cout << MOD - 1 << endl; + continue; + } + LL inv = mod_linear_equation(s[l-1], 1, MOD); + LL ans = inv * s[r] % MOD; + ans = (ans + MOD - 1) % MOD; + cout << ans << endl; + } + } + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest01/G-uva11468.cpp b/assets/ipl/solutions/18fa/contest01/G-uva11468.cpp index 716f408..5c50871 100644 --- a/assets/ipl/solutions/18fa/contest01/G-uva11468.cpp +++ b/assets/ipl/solutions/18fa/contest01/G-uva11468.cpp @@ -1,123 +1,123 @@ -#include -#include -#include -#include -#include -#define SIZE 128 - -using namespace std; - -double pr[SIZE]; - -struct Node { - Node* next[SIZE]; - Node* fail; - bool term; - double a[101]; - Node (Node* root) { - memset(next, NULL, sizeof(next)); - fail = root; - term = false; - a[0] = term ? 0 : 1; - } -}; -Node* root; - -void insert (string s) { - Node* curr = root; - for (int i = 0; i < s.length(); i++) { - int j = s[i]; - if (curr->next[j] == NULL) { - curr->next[j] = new Node(root); - } - curr = curr->next[j]; - } - curr->term = true; -} - -void make_fail () { - queue q; - for (int i = 0; i < SIZE; i++) { - if (root->next[i]) { - q.push(root->next[i]); - } - } - while (!q.empty()) { - Node* node = q.front(); q.pop(); - for (int i = 0; i < SIZE; i++) { - if (node->next[i]) { - q.push(node->next[i]); - Node* f = node->fail; - while (f != root && !f->next[i]) { - f = f->fail; - } - if (f->next[i]) { - f = f->next[i]; - } - node->next[i]->fail = f; - } - } - } -} - -void dfs (int l, Node* node) { -// cerr << l << ' ' << node << endl; - double prob = 0; - for (int i = 0; i < SIZE; i++) { - Node* p = node; - while (p != root && !p->next[i]) { - p = p->fail; - } - if (p->next[i]) { - bool f = true; - for (Node* q = p; ; q = q->fail) { - if (q->next[i] && q->next[i]->term) { f = false; break; } - if (q == root) break; - } - if (f) { - prob += pr[i] * p->next[i]->a[l-1]; - } - } else { // p == root - prob += pr[i] * p->a[l-1]; - } - } - node->a[l] = prob; - for (int i = 0; i < SIZE; i++) { - if (node->next[i]) { - dfs(l, node->next[i]); - } - } -} -double work (int L) { - for (int l = 1; l <= L; l++) { - dfs(l, root); - } - return root->a[L]; -} - -int main () { - int t; cin >> t; - for (int tt = 1; tt <= t; tt++) { - int K; cin >> K; - root = new Node(NULL); - for (int i = 0; i < K; i++) { - string s; cin >> s; - insert(s); - } - make_fail(); - for (int i = 0; i < SIZE; i++) { - pr[i] = 0; - } - int N; cin >> N; - for (int i = 0; i < N; i++) { - char c; double prob; - cin >> c >> prob; - pr[(int)c] = prob; - } - int L; cin >> L; - printf("Case #%d: %.6f\n", tt, work(L)); - } - - return 0; -} - +#include +#include +#include +#include +#include +#define SIZE 128 + +using namespace std; + +double pr[SIZE]; + +struct Node { + Node* next[SIZE]; + Node* fail; + bool term; + double a[101]; + Node (Node* root) { + memset(next, NULL, sizeof(next)); + fail = root; + term = false; + a[0] = term ? 0 : 1; + } +}; +Node* root; + +void insert (string s) { + Node* curr = root; + for (int i = 0; i < s.length(); i++) { + int j = s[i]; + if (curr->next[j] == NULL) { + curr->next[j] = new Node(root); + } + curr = curr->next[j]; + } + curr->term = true; +} + +void make_fail () { + queue q; + for (int i = 0; i < SIZE; i++) { + if (root->next[i]) { + q.push(root->next[i]); + } + } + while (!q.empty()) { + Node* node = q.front(); q.pop(); + for (int i = 0; i < SIZE; i++) { + if (node->next[i]) { + q.push(node->next[i]); + Node* f = node->fail; + while (f != root && !f->next[i]) { + f = f->fail; + } + if (f->next[i]) { + f = f->next[i]; + } + node->next[i]->fail = f; + } + } + } +} + +void dfs (int l, Node* node) { +// cerr << l << ' ' << node << endl; + double prob = 0; + for (int i = 0; i < SIZE; i++) { + Node* p = node; + while (p != root && !p->next[i]) { + p = p->fail; + } + if (p->next[i]) { + bool f = true; + for (Node* q = p; ; q = q->fail) { + if (q->next[i] && q->next[i]->term) { f = false; break; } + if (q == root) break; + } + if (f) { + prob += pr[i] * p->next[i]->a[l-1]; + } + } else { // p == root + prob += pr[i] * p->a[l-1]; + } + } + node->a[l] = prob; + for (int i = 0; i < SIZE; i++) { + if (node->next[i]) { + dfs(l, node->next[i]); + } + } +} +double work (int L) { + for (int l = 1; l <= L; l++) { + dfs(l, root); + } + return root->a[L]; +} + +int main () { + int t; cin >> t; + for (int tt = 1; tt <= t; tt++) { + int K; cin >> K; + root = new Node(NULL); + for (int i = 0; i < K; i++) { + string s; cin >> s; + insert(s); + } + make_fail(); + for (int i = 0; i < SIZE; i++) { + pr[i] = 0; + } + int N; cin >> N; + for (int i = 0; i < N; i++) { + char c; double prob; + cin >> c >> prob; + pr[(int)c] = prob; + } + int L; cin >> L; + printf("Case #%d: %.6f\n", tt, work(L)); + } + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest02/A-uva11636.cpp b/assets/ipl/solutions/18fa/contest02/A-uva11636.cpp index 174d750..61a6781 100644 --- a/assets/ipl/solutions/18fa/contest02/A-uva11636.cpp +++ b/assets/ipl/solutions/18fa/contest02/A-uva11636.cpp @@ -1,19 +1,19 @@ -#include - -using namespace std; - -int main () { - int n; - for (int tt = 1; ; tt++) { - cin >> n; - if (n < 0) break; - int ans = 0, tmp = 1; - while (tmp < n) { - tmp *= 2; - ans++; - } - cout << "Case " << tt << ": " << ans << endl; - } - return 0; -} - +#include + +using namespace std; + +int main () { + int n; + for (int tt = 1; ; tt++) { + cin >> n; + if (n < 0) break; + int ans = 0, tmp = 1; + while (tmp < n) { + tmp *= 2; + ans++; + } + cout << "Case " << tt << ": " << ans << endl; + } + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest02/B-uva11780.cpp b/assets/ipl/solutions/18fa/contest02/B-uva11780.cpp index e740610..971dceb 100644 --- a/assets/ipl/solutions/18fa/contest02/B-uva11780.cpp +++ b/assets/ipl/solutions/18fa/contest02/B-uva11780.cpp @@ -1,19 +1,19 @@ -#include -#include -#include - -using namespace std; - - - -int main () { - int n; - while (cin >> n && n) { - double m = 1.6 * n; - double ans = abs(round(m) - m); - cout << setiosflags(ios::fixed) << setprecision(2) << ans << endl; - } - - return 0; -} - +#include +#include +#include + +using namespace std; + + + +int main () { + int n; + while (cin >> n && n) { + double m = 1.6 * n; + double ans = abs(round(m) - m); + cout << setiosflags(ios::fixed) << setprecision(2) << ans << endl; + } + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest02/C-uva10405.cpp b/assets/ipl/solutions/18fa/contest02/C-uva10405.cpp index 5870bba..4603059 100644 --- a/assets/ipl/solutions/18fa/contest02/C-uva10405.cpp +++ b/assets/ipl/solutions/18fa/contest02/C-uva10405.cpp @@ -1,24 +1,24 @@ -#include -#include - -using namespace std; - -int main () { - string s, t; - while (1) { - getline(cin, s); - getline(cin, t); - if (!cin) break; - vector> dp(s.length()+1, vector(t.length()+1, 0)); - for (int i = 0; i < s.length(); i++) { - for (int j = 0; j < t.length(); j++) { - if (s[i] == t[j]) dp[i+1][j+1] = dp[i][j] + 1; - else dp[i+1][j+1] = max(dp[i+1][j], dp[i][j+1]); - } - } - cout << dp[s.length()][t.length()] << endl; - } - - return 0; -} - +#include +#include + +using namespace std; + +int main () { + string s, t; + while (1) { + getline(cin, s); + getline(cin, t); + if (!cin) break; + vector> dp(s.length()+1, vector(t.length()+1, 0)); + for (int i = 0; i < s.length(); i++) { + for (int j = 0; j < t.length(); j++) { + if (s[i] == t[j]) dp[i+1][j+1] = dp[i][j] + 1; + else dp[i+1][j+1] = max(dp[i+1][j], dp[i][j+1]); + } + } + cout << dp[s.length()][t.length()] << endl; + } + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest02/D-uva147.cpp b/assets/ipl/solutions/18fa/contest02/D-uva147.cpp index 4447ef5..6549e4c 100644 --- a/assets/ipl/solutions/18fa/contest02/D-uva147.cpp +++ b/assets/ipl/solutions/18fa/contest02/D-uva147.cpp @@ -1,29 +1,29 @@ -#include -#include -#include -#include -#define LL long long - -using namespace std; - - - -int main () { - vector coins {0, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000}; - vector> dp(12, vector(30001, 0)); - for (int i = 0; i < 12; i++) dp[i][0] = 1; - for (int i = 1; i < coins.size(); i++) { - for (int j = 1; j <= 30000; j++) { - for (int k = 0; k * coins[i] <= j; k++) { - dp[i][j] += dp[i-1][j-k*coins[i]]; - } - } - } - double n; - while (cin >> n && n) { - printf("%6.2f%17lld\n", n, dp[11][int(round(100*n))]); - } - - return 0; -} - +#include +#include +#include +#include +#define LL long long + +using namespace std; + + + +int main () { + vector coins {0, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000}; + vector> dp(12, vector(30001, 0)); + for (int i = 0; i < 12; i++) dp[i][0] = 1; + for (int i = 1; i < coins.size(); i++) { + for (int j = 1; j <= 30000; j++) { + for (int k = 0; k * coins[i] <= j; k++) { + dp[i][j] += dp[i-1][j-k*coins[i]]; + } + } + } + double n; + while (cin >> n && n) { + printf("%6.2f%17lld\n", n, dp[11][int(round(100*n))]); + } + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest02/E-uva12097.cpp b/assets/ipl/solutions/18fa/contest02/E-uva12097.cpp index aa3a76e..35673b2 100644 --- a/assets/ipl/solutions/18fa/contest02/E-uva12097.cpp +++ b/assets/ipl/solutions/18fa/contest02/E-uva12097.cpp @@ -1,34 +1,34 @@ -#include -#include -#include -#include - -using namespace std; - -double PI = acos(-1.0); - - - -int main () { - int t; cin >> t; - while (t--) { - int n, f; cin >> n >> f; - vector a(n); - for (int i = 0; i < n; i++) { - double r; cin >> r; - a[i] = PI * r * r; - } - double lo = 1e-4, hi = 1e9; - while (hi - lo > 1e-5) { - double mi = (lo + hi) / 2; - int cnt = 0; - for (int i = 0; i < n; i++) cnt += (int)(a[i] / mi); - if (cnt >= f + 1) lo = mi; - else hi = mi; - } - cout << setiosflags(ios::fixed) << setprecision(4) << lo << endl; - } - - return 0; -} - +#include +#include +#include +#include + +using namespace std; + +double PI = acos(-1.0); + + + +int main () { + int t; cin >> t; + while (t--) { + int n, f; cin >> n >> f; + vector a(n); + for (int i = 0; i < n; i++) { + double r; cin >> r; + a[i] = PI * r * r; + } + double lo = 1e-4, hi = 1e9; + while (hi - lo > 1e-5) { + double mi = (lo + hi) / 2; + int cnt = 0; + for (int i = 0; i < n; i++) cnt += (int)(a[i] / mi); + if (cnt >= f + 1) lo = mi; + else hi = mi; + } + cout << setiosflags(ios::fixed) << setprecision(4) << lo << endl; + } + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest02/F-uva10608.cpp b/assets/ipl/solutions/18fa/contest02/F-uva10608.cpp index 1993175..5286ee6 100644 --- a/assets/ipl/solutions/18fa/contest02/F-uva10608.cpp +++ b/assets/ipl/solutions/18fa/contest02/F-uva10608.cpp @@ -1,44 +1,44 @@ -#include - -using namespace std; - -int n, m; -int p[30000]; - -int find (int u) { - return p[u] < 0 ? u : (p[u] = find(p[u])); -} -void unione (int u, int v) { - u = find(u); - v = find(v); - if (u == v) return; - if (p[u] < p[v]) { - p[u] += p[v]; - p[v] = u; - } else { - p[v] += p[u]; - p[u] = v; - } -} - -int main () { - int t; cin >> t; - while (t--) { - cin >> n >> m; - for (int i = 0; i < n; i++) p[i] = -1; - while (m--) { - int u, v; - cin >> u >> v; - u--; v--; - unione(u, v); - } - int ans = 0; - for (int i = 0; i < n; i++) { - ans = max(ans, -p[find(i)]); - } - cout << ans << endl; - } - - return 0; -} - +#include + +using namespace std; + +int n, m; +int p[30000]; + +int find (int u) { + return p[u] < 0 ? u : (p[u] = find(p[u])); +} +void unione (int u, int v) { + u = find(u); + v = find(v); + if (u == v) return; + if (p[u] < p[v]) { + p[u] += p[v]; + p[v] = u; + } else { + p[v] += p[u]; + p[u] = v; + } +} + +int main () { + int t; cin >> t; + while (t--) { + cin >> n >> m; + for (int i = 0; i < n; i++) p[i] = -1; + while (m--) { + int u, v; + cin >> u >> v; + u--; v--; + unione(u, v); + } + int ans = 0; + for (int i = 0; i < n; i++) { + ans = max(ans, -p[find(i)]); + } + cout << ans << endl; + } + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest02/G-uva11402.cpp b/assets/ipl/solutions/18fa/contest02/G-uva11402.cpp index b790140..4211053 100644 --- a/assets/ipl/solutions/18fa/contest02/G-uva11402.cpp +++ b/assets/ipl/solutions/18fa/contest02/G-uva11402.cpp @@ -1,123 +1,123 @@ -#include -#include - -using namespace std; - -struct Node { - int l, r; - int v; - int lazy; -}; -Node nodes[3000000]; - -int n, s; - -void propagate (int u, int delta) { - if (delta == 1) { // F, 0->1 - nodes[u].lazy = 1; - nodes[u].v = nodes[u].r - nodes[u].l + 1; - } else if (delta == 2) { // E, 1->0 - nodes[u].lazy = 2; - nodes[u].v = 0; - } else if (delta == 3) { // I, invert - if (nodes[u].lazy == 0) { - nodes[u].lazy = 3; - nodes[u].v = nodes[u].r - nodes[u].l + 1 - nodes[u].v; - } else if (nodes[u].lazy == 1) { - nodes[u].lazy = 2; - nodes[u].v = 0; - } else if (nodes[u].lazy == 2) { - nodes[u].lazy = 1; - nodes[u].v = nodes[u].r - nodes[u].l + 1; - } else { - nodes[u].lazy = 0; - nodes[u].v = nodes[u].r - nodes[u].l + 1 - nodes[u].v; - } - } -} - -void modify (int u, int l, int r, int delta) { - if (l == nodes[u].l && r == nodes[u].r) { - propagate(u, delta); - return; - } - propagate(2*u, nodes[u].lazy); - propagate(2*u+1, nodes[u].lazy); - nodes[u].lazy = 0; - if (r <= nodes[2*u].r) { - modify(2*u, l, r, delta); - nodes[u].v = nodes[2*u].v + nodes[2*u+1].v; - } else if (l >= nodes[2*u+1].l) { - modify(2*u+1, l, r, delta); - nodes[u].v = nodes[2*u].v + nodes[2*u+1].v; - } else { - modify(2*u, l, nodes[2*u].r, delta); - modify(2*u+1, nodes[2*u+1].l, r, delta); - nodes[u].v = nodes[2*u].v + nodes[2*u+1].v; - } -} - -int query (int u, int l, int r) { - if (l == nodes[u].l && r == nodes[u].r) { - return nodes[u].v; - } - propagate(2*u, nodes[u].lazy); - propagate(2*u+1, nodes[u].lazy); - nodes[u].lazy = 0; - if (r <= nodes[2*u].r) { - return query(2*u, l, r); - } else if (l >= nodes[2*u+1].l) { - return query(2*u+1, l, r); - } else { - return query(2*u, l, nodes[2*u].r) + query(2*u+1, nodes[2*u+1].l, r); - } -} - -int main () { - cin.tie(0); - ios_base::sync_with_stdio(0); - int t; cin >> t; - for (int tt = 1; tt <= t; tt++) { - string S; - int m; cin >> m; - while (m--) { - int T; string s; - cin >> T >> s; - while (T--) { - S += s; - } - } - n = S.length(); - s = 1; - while (s <= n) s <<= 1; - for (int i = 0; i < n; i++) { - nodes[s+i].l = nodes[s+i].r = i; - nodes[s+i].v = S[i] == '1'; - nodes[s+i].lazy = 0; - } - for (int i = n; i < s; i++) { - nodes[s+i].l = nodes[s+i].r = i; - nodes[s+i].v = 0; - nodes[s+i].lazy = 0; - } - for (int i = s-1; i > 0; i--) { - nodes[i].l = nodes[2*i].l; - nodes[i].r = nodes[2*i+1].r; - nodes[i].v = nodes[2*i].v + nodes[2*i+1].v; - nodes[i].lazy = 0; - } - cout << "Case " << tt << ":" << endl; - int q; cin >> q; - int qqq = 1; - for (int qq = 1; qq <= q; qq++) { - char c; int l, r; - cin >> c >> l >> r; - if (c == 'F') modify(1, l, r, 1); - else if (c == 'E') modify(1, l, r, 2); - else if (c == 'I') modify(1, l, r, 3); - else cout << "Q" << qqq++ << ": " << query(1, l, r) << endl; - } - } - - return 0; -} +#include +#include + +using namespace std; + +struct Node { + int l, r; + int v; + int lazy; +}; +Node nodes[3000000]; + +int n, s; + +void propagate (int u, int delta) { + if (delta == 1) { // F, 0->1 + nodes[u].lazy = 1; + nodes[u].v = nodes[u].r - nodes[u].l + 1; + } else if (delta == 2) { // E, 1->0 + nodes[u].lazy = 2; + nodes[u].v = 0; + } else if (delta == 3) { // I, invert + if (nodes[u].lazy == 0) { + nodes[u].lazy = 3; + nodes[u].v = nodes[u].r - nodes[u].l + 1 - nodes[u].v; + } else if (nodes[u].lazy == 1) { + nodes[u].lazy = 2; + nodes[u].v = 0; + } else if (nodes[u].lazy == 2) { + nodes[u].lazy = 1; + nodes[u].v = nodes[u].r - nodes[u].l + 1; + } else { + nodes[u].lazy = 0; + nodes[u].v = nodes[u].r - nodes[u].l + 1 - nodes[u].v; + } + } +} + +void modify (int u, int l, int r, int delta) { + if (l == nodes[u].l && r == nodes[u].r) { + propagate(u, delta); + return; + } + propagate(2*u, nodes[u].lazy); + propagate(2*u+1, nodes[u].lazy); + nodes[u].lazy = 0; + if (r <= nodes[2*u].r) { + modify(2*u, l, r, delta); + nodes[u].v = nodes[2*u].v + nodes[2*u+1].v; + } else if (l >= nodes[2*u+1].l) { + modify(2*u+1, l, r, delta); + nodes[u].v = nodes[2*u].v + nodes[2*u+1].v; + } else { + modify(2*u, l, nodes[2*u].r, delta); + modify(2*u+1, nodes[2*u+1].l, r, delta); + nodes[u].v = nodes[2*u].v + nodes[2*u+1].v; + } +} + +int query (int u, int l, int r) { + if (l == nodes[u].l && r == nodes[u].r) { + return nodes[u].v; + } + propagate(2*u, nodes[u].lazy); + propagate(2*u+1, nodes[u].lazy); + nodes[u].lazy = 0; + if (r <= nodes[2*u].r) { + return query(2*u, l, r); + } else if (l >= nodes[2*u+1].l) { + return query(2*u+1, l, r); + } else { + return query(2*u, l, nodes[2*u].r) + query(2*u+1, nodes[2*u+1].l, r); + } +} + +int main () { + cin.tie(0); + ios_base::sync_with_stdio(0); + int t; cin >> t; + for (int tt = 1; tt <= t; tt++) { + string S; + int m; cin >> m; + while (m--) { + int T; string s; + cin >> T >> s; + while (T--) { + S += s; + } + } + n = S.length(); + s = 1; + while (s <= n) s <<= 1; + for (int i = 0; i < n; i++) { + nodes[s+i].l = nodes[s+i].r = i; + nodes[s+i].v = S[i] == '1'; + nodes[s+i].lazy = 0; + } + for (int i = n; i < s; i++) { + nodes[s+i].l = nodes[s+i].r = i; + nodes[s+i].v = 0; + nodes[s+i].lazy = 0; + } + for (int i = s-1; i > 0; i--) { + nodes[i].l = nodes[2*i].l; + nodes[i].r = nodes[2*i+1].r; + nodes[i].v = nodes[2*i].v + nodes[2*i+1].v; + nodes[i].lazy = 0; + } + cout << "Case " << tt << ":" << endl; + int q; cin >> q; + int qqq = 1; + for (int qq = 1; qq <= q; qq++) { + char c; int l, r; + cin >> c >> l >> r; + if (c == 'F') modify(1, l, r, 1); + else if (c == 'E') modify(1, l, r, 2); + else if (c == 'I') modify(1, l, r, 3); + else cout << "Q" << qqq++ << ": " << query(1, l, r) << endl; + } + } + + return 0; +} diff --git a/assets/ipl/solutions/18fa/contest03/D-uva118.cpp b/assets/ipl/solutions/18fa/contest03/D-uva118.cpp index 874515c..e2bd93f 100644 --- a/assets/ipl/solutions/18fa/contest03/D-uva118.cpp +++ b/assets/ipl/solutions/18fa/contest03/D-uva118.cpp @@ -1,47 +1,47 @@ -#include -#include -#include -#include - -using namespace std; - -map d {{'E',0},{'N',1},{'W',2},{'S',3}}; -map D {{0,'E'},{1,'N'},{2,'W'},{3,'S'}}; -vector> f {{1,0},{0,1},{-1,0},{0,-1}}; -set> fall; - -int main () { - int X, Y; cin >> X >> Y; - int x, y; char dir; string s; - while (cin >> x >> y >> dir >> s) { - int forw = d[dir]; - bool lost = false; - for (char ss : s) { - if (ss == 'F') { - int xx = x + f[forw].first; - int yy = y + f[forw].second; - if (xx < 0 || xx > X || yy < 0 || yy > Y) { - if (fall.find({x, y}) == fall.end()) { - fall.insert({x, y}); - lost = true; - break; - } else { - continue; - } - } else { - x = xx; y = yy; - } - } else if (ss == 'L') { - forw = (forw + 1) % 4; - } else if (ss == 'R') { - forw = (forw + 3) % 4; - } - } - cout << x << ' ' << y << ' ' << D[forw]; - if (lost) cout << " LOST"; - cout << endl; - } - - return 0; -} - +#include +#include +#include +#include + +using namespace std; + +map d {{'E',0},{'N',1},{'W',2},{'S',3}}; +map D {{0,'E'},{1,'N'},{2,'W'},{3,'S'}}; +vector> f {{1,0},{0,1},{-1,0},{0,-1}}; +set> fall; + +int main () { + int X, Y; cin >> X >> Y; + int x, y; char dir; string s; + while (cin >> x >> y >> dir >> s) { + int forw = d[dir]; + bool lost = false; + for (char ss : s) { + if (ss == 'F') { + int xx = x + f[forw].first; + int yy = y + f[forw].second; + if (xx < 0 || xx > X || yy < 0 || yy > Y) { + if (fall.find({x, y}) == fall.end()) { + fall.insert({x, y}); + lost = true; + break; + } else { + continue; + } + } else { + x = xx; y = yy; + } + } else if (ss == 'L') { + forw = (forw + 1) % 4; + } else if (ss == 'R') { + forw = (forw + 3) % 4; + } + } + cout << x << ' ' << y << ' ' << D[forw]; + if (lost) cout << " LOST"; + cout << endl; + } + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest04/A-uva272.cpp b/assets/ipl/solutions/18fa/contest04/A-uva272.cpp index 7ee8cf2..24e2464 100644 --- a/assets/ipl/solutions/18fa/contest04/A-uva272.cpp +++ b/assets/ipl/solutions/18fa/contest04/A-uva272.cpp @@ -1,24 +1,24 @@ -#include - -using namespace std; - - - -int main () { - int a = 0; - string s; - while (getline(cin, s)) { - for (char c : s) { - if (c == '"') { - if (a % 2 == 0) cout << "``"; - else cout << "''"; - a++; - } else { - cout << c; - } - } - cout << endl; - } - return 0; -} - +#include + +using namespace std; + + + +int main () { + int a = 0; + string s; + while (getline(cin, s)) { + for (char c : s) { + if (c == '"') { + if (a % 2 == 0) cout << "``"; + else cout << "''"; + a++; + } else { + cout << c; + } + } + cout << endl; + } + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest04/B-uva11332.cpp b/assets/ipl/solutions/18fa/contest04/B-uva11332.cpp index 08bae40..04b8dfa 100644 --- a/assets/ipl/solutions/18fa/contest04/B-uva11332.cpp +++ b/assets/ipl/solutions/18fa/contest04/B-uva11332.cpp @@ -1,28 +1,28 @@ -#include - -using namespace std; - -int f (int x) { - int ans = 0; - while (x) { - ans += x % 10; - x /= 10; - } - return ans; -} - -int g (int x) { - while (x >= 10) { - x = f(x); - } - return x; -} - -int main () { - int x; - while (cin >> x && x) { - cout << g(x) << endl; - } - return 0; -} - +#include + +using namespace std; + +int f (int x) { + int ans = 0; + while (x) { + ans += x % 10; + x /= 10; + } + return ans; +} + +int g (int x) { + while (x >= 10) { + x = f(x); + } + return x; +} + +int main () { + int x; + while (cin >> x && x) { + cout << g(x) << endl; + } + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest04/D-uva10004.cpp b/assets/ipl/solutions/18fa/contest04/D-uva10004.cpp index 4930e01..c23d1e0 100644 --- a/assets/ipl/solutions/18fa/contest04/D-uva10004.cpp +++ b/assets/ipl/solutions/18fa/contest04/D-uva10004.cpp @@ -1,43 +1,43 @@ -#include -#include - -using namespace std; - -vector adj[200]; -int color[200]; - -bool dfs (int u) { - bool ans = true; - for (int c : adj[u]) { - if (color[c] == 0) { - color[c] = 3 - color[u]; - ans = ans && dfs(c); - } else if (color[c] == color[u]) { - return false; - } - } - return true; -} - -int main () { - int n; - while (cin >> n && n) { - for (int i = 0; i < n; i++) { - adj[i].clear(); - color[i] = 0; - } - int l; cin >> l; - while (l--) { - int u, v; cin >> u >> v; - adj[u].push_back(v); - adj[v].push_back(u); - } - color[0] = 1; - bool ans = dfs(0); - if (ans) cout << "BICOLORABLE." << endl; - else cout << "NOT BICOLORABLE." << endl; - } - - return 0; -} - +#include +#include + +using namespace std; + +vector adj[200]; +int color[200]; + +bool dfs (int u) { + bool ans = true; + for (int c : adj[u]) { + if (color[c] == 0) { + color[c] = 3 - color[u]; + ans = ans && dfs(c); + } else if (color[c] == color[u]) { + return false; + } + } + return true; +} + +int main () { + int n; + while (cin >> n && n) { + for (int i = 0; i < n; i++) { + adj[i].clear(); + color[i] = 0; + } + int l; cin >> l; + while (l--) { + int u, v; cin >> u >> v; + adj[u].push_back(v); + adj[v].push_back(u); + } + color[0] = 1; + bool ans = dfs(0); + if (ans) cout << "BICOLORABLE." << endl; + else cout << "NOT BICOLORABLE." << endl; + } + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest04/E-uva821.cpp b/assets/ipl/solutions/18fa/contest04/E-uva821.cpp index 2bcf484..c0c089d 100644 --- a/assets/ipl/solutions/18fa/contest04/E-uva821.cpp +++ b/assets/ipl/solutions/18fa/contest04/E-uva821.cpp @@ -1,46 +1,46 @@ -#include - -using namespace std; - -bool e[101]; -int d[101][101]; - -int main () { - for (int t = 1; ; t++) { - for (int i = 1; i <= 100; i++) { - e[i] = false; - for (int j = 1; j <= 100; j++) { - d[i][j] = i == j ? 0 : 1000; - } - } - bool flag = false; - while (1) { - int u, v; - cin >> u >> v; - if (u == 0 && v == 0) break; - flag = true; - e[u] = e[v] = true; - d[u][v] = 1; - } - if (!flag) break; - for (int k = 1; k <= 100; k++) { - for (int i = 1; i <= 100; i++) { - for (int j = 1; j <= 100; j++) { - d[i][j] = min(d[i][j], d[i][k] + d[k][j]); - } - } - } - double ans = 0; - double cnt = 0; - for (int i = 1; i <= 100; i++) { if (!e[i]) continue; - for (int j = 1; j <= 100; j++) { if (!e[j]) continue; if (i == j) continue; - ans += d[i][j]; - cnt ++; - } - } - printf("Case %d: average length between pages = %.3f clicks\n", t, ans / cnt); - } - - return 0; -} - +#include + +using namespace std; + +bool e[101]; +int d[101][101]; + +int main () { + for (int t = 1; ; t++) { + for (int i = 1; i <= 100; i++) { + e[i] = false; + for (int j = 1; j <= 100; j++) { + d[i][j] = i == j ? 0 : 1000; + } + } + bool flag = false; + while (1) { + int u, v; + cin >> u >> v; + if (u == 0 && v == 0) break; + flag = true; + e[u] = e[v] = true; + d[u][v] = 1; + } + if (!flag) break; + for (int k = 1; k <= 100; k++) { + for (int i = 1; i <= 100; i++) { + for (int j = 1; j <= 100; j++) { + d[i][j] = min(d[i][j], d[i][k] + d[k][j]); + } + } + } + double ans = 0; + double cnt = 0; + for (int i = 1; i <= 100; i++) { if (!e[i]) continue; + for (int j = 1; j <= 100; j++) { if (!e[j]) continue; if (i == j) continue; + ans += d[i][j]; + cnt ++; + } + } + printf("Case %d: average length between pages = %.3f clicks\n", t, ans / cnt); + } + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest04/F-uva11733.cpp b/assets/ipl/solutions/18fa/contest04/F-uva11733.cpp index 78b1bba..7cbeb4c 100644 --- a/assets/ipl/solutions/18fa/contest04/F-uva11733.cpp +++ b/assets/ipl/solutions/18fa/contest04/F-uva11733.cpp @@ -1,60 +1,60 @@ -#include -#include -#include - -using namespace std; - -int p[10001]; -vector>> e; -int n, m, a; - -int find (int u) { - return p[u] < 0 ? u : (p[u] = find(p[u])); -} - -void unione (int u, int v) { - u = find(u); - v = find(v); - if (p[u] < p[v]) { - p[u] += p[v]; - p[v] = u; - } else { - p[v] += p[u]; - p[u] = v; - } -} - -int main () { - cin.tie(0); - ios_base::sync_with_stdio(0); - int t; cin >> t; - for (int tt = 1; tt <= t; tt++) { - for (int i = 1; i <= 10000; i++) { - p[i] = -1; - } - e.clear(); - cin >> n >> m >> a; - while (m--) { - int x, y, c; - cin >> x >> y >> c; - e.push_back({c, {x, y}}); - } - sort(e.begin(), e.end()); - int cost = 0, road = 0; - for (auto ee : e) { - int c = ee.first; - int x = ee.second.first, y = ee.second.second; - if (c >= a) break; - if (find(x) == find(y)) continue; - unione(x, y); - cost += c; - road ++; - } - int airp = n - road; - cost += a * airp; - printf("Case #%d: %d %d\n", tt, cost, airp); - } - - return 0; -} - +#include +#include +#include + +using namespace std; + +int p[10001]; +vector>> e; +int n, m, a; + +int find (int u) { + return p[u] < 0 ? u : (p[u] = find(p[u])); +} + +void unione (int u, int v) { + u = find(u); + v = find(v); + if (p[u] < p[v]) { + p[u] += p[v]; + p[v] = u; + } else { + p[v] += p[u]; + p[u] = v; + } +} + +int main () { + cin.tie(0); + ios_base::sync_with_stdio(0); + int t; cin >> t; + for (int tt = 1; tt <= t; tt++) { + for (int i = 1; i <= 10000; i++) { + p[i] = -1; + } + e.clear(); + cin >> n >> m >> a; + while (m--) { + int x, y, c; + cin >> x >> y >> c; + e.push_back({c, {x, y}}); + } + sort(e.begin(), e.end()); + int cost = 0, road = 0; + for (auto ee : e) { + int c = ee.first; + int x = ee.second.first, y = ee.second.second; + if (c >= a) break; + if (find(x) == find(y)) continue; + unione(x, y); + cost += c; + road ++; + } + int airp = n - road; + cost += a * airp; + printf("Case #%d: %d %d\n", tt, cost, airp); + } + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest05/A-uva11547.cpp b/assets/ipl/solutions/18fa/contest05/A-uva11547.cpp index 741d6d2..89e8539 100644 --- a/assets/ipl/solutions/18fa/contest05/A-uva11547.cpp +++ b/assets/ipl/solutions/18fa/contest05/A-uva11547.cpp @@ -1,18 +1,18 @@ -#include -#include - -using namespace std; - - -int main () { - int t; cin >> t; - while (t--) { - int n; cin >> n; - int ans = (n * 567 / 9 + 7492) * 235 / 47 - 498; - ans = abs(ans) / 10 % 10; - cout << ans << endl; - } - - return 0; -} - +#include +#include + +using namespace std; + + +int main () { + int t; cin >> t; + while (t--) { + int n; cin >> n; + int ans = (n * 567 / 9 + 7492) * 235 / 47 - 498; + ans = abs(ans) / 10 % 10; + cout << ans << endl; + } + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest05/B-uva12157.cpp b/assets/ipl/solutions/18fa/contest05/B-uva12157.cpp index 551d9d8..5764558 100644 --- a/assets/ipl/solutions/18fa/contest05/B-uva12157.cpp +++ b/assets/ipl/solutions/18fa/contest05/B-uva12157.cpp @@ -1,23 +1,23 @@ -#include - -using namespace std; - -int main () { - int t; cin >> t; - for (int tt = 1; tt <= t; tt++) { - int n; cin >> n; - int mile = 0, juice = 0; - while (n--) { - int x; cin >> x; - mile += (x / 30 + 1) * 10; - juice += (x / 60 + 1) * 15; - } - cout << "Case " << tt << ": "; - if (mile < juice) cout << "Mile " << mile << endl; - else if (mile > juice) cout << "Juice " << juice << endl; - else cout << "Mile Juice " << mile << endl; - } - - return 0; -} - +#include + +using namespace std; + +int main () { + int t; cin >> t; + for (int tt = 1; tt <= t; tt++) { + int n; cin >> n; + int mile = 0, juice = 0; + while (n--) { + int x; cin >> x; + mile += (x / 30 + 1) * 10; + juice += (x / 60 + 1) * 15; + } + cout << "Case " << tt << ": "; + if (mile < juice) cout << "Mile " << mile << endl; + else if (mile > juice) cout << "Juice " << juice << endl; + else cout << "Mile Juice " << mile << endl; + } + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest05/C-uva11479.cpp b/assets/ipl/solutions/18fa/contest05/C-uva11479.cpp index 6bcc131..21c06a8 100644 --- a/assets/ipl/solutions/18fa/contest05/C-uva11479.cpp +++ b/assets/ipl/solutions/18fa/contest05/C-uva11479.cpp @@ -1,19 +1,19 @@ -#include -#define LL long long - -using namespace std; - -int main () { - int t; cin >> t; - for (int tt = 1; tt <= t; tt++) { - LL a, b, c; cin >> a >> b >> c; - cout << "Case " << tt << ": "; - if (a <= 0 || b <= 0 || c <= 0 || a + b <= c || b + c <= a || c + a <= b) cout << "Invalid" << endl; - else if (a == b && b == c && c == a) cout << "Equilateral" << endl; - else if (a == b || b == c || c == a) cout << "Isosceles" << endl; - else cout << "Scalene" << endl; - } - - return 0; -} - +#include +#define LL long long + +using namespace std; + +int main () { + int t; cin >> t; + for (int tt = 1; tt <= t; tt++) { + LL a, b, c; cin >> a >> b >> c; + cout << "Case " << tt << ": "; + if (a <= 0 || b <= 0 || c <= 0 || a + b <= c || b + c <= a || c + a <= b) cout << "Invalid" << endl; + else if (a == b && b == c && c == a) cout << "Equilateral" << endl; + else if (a == b || b == c || c == a) cout << "Isosceles" << endl; + else cout << "Scalene" << endl; + } + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest05/D-uva378.cpp b/assets/ipl/solutions/18fa/contest05/D-uva378.cpp index 275e5d2..e7978a5 100644 --- a/assets/ipl/solutions/18fa/contest05/D-uva378.cpp +++ b/assets/ipl/solutions/18fa/contest05/D-uva378.cpp @@ -1,28 +1,28 @@ -#include -#include - -using namespace std; - -int main () { - int t; cin >> t; - cout << "INTERSECTING LINES OUTPUT" << endl; - while (t--) { - int x1, y1, x2, y2, x3, y3, x4, y4; - cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4; - if ((x3 - x1) * (y3 - y2) == (y3 - y1) * (x3 - x2) && (x4 - x1) * (y4 - y2) == (y4 - y1) * (x4 - x2)) { - cout << "LINE" << endl; - } else if ((x4 - x3) * (y2 - y1) == (y4 - y3) * (x2 - x1)) { - cout << "NONE" << endl; - } else { - double a1 = y2 - y1, b1 = x1 - x2, c1 = x2 * y1 - x1 * y2; - double a2 = y4 - y3, b2 = x3 - x4, c2 = x4 * y3 - x3 * y4; - double x = -(c1 * b2 - b1 * c2) / (a1 * b2 - b1 * a2); - double y = -(c1 * a2 - a1 * c2) / (b1 * a2 - a1 * b2); - cout << setiosflags(ios::fixed) << setprecision(2) << "POINT " << x << ' ' << y << endl; - } - } - cout << "END OF OUTPUT" << endl; - - return 0; -} - +#include +#include + +using namespace std; + +int main () { + int t; cin >> t; + cout << "INTERSECTING LINES OUTPUT" << endl; + while (t--) { + int x1, y1, x2, y2, x3, y3, x4, y4; + cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4; + if ((x3 - x1) * (y3 - y2) == (y3 - y1) * (x3 - x2) && (x4 - x1) * (y4 - y2) == (y4 - y1) * (x4 - x2)) { + cout << "LINE" << endl; + } else if ((x4 - x3) * (y2 - y1) == (y4 - y3) * (x2 - x1)) { + cout << "NONE" << endl; + } else { + double a1 = y2 - y1, b1 = x1 - x2, c1 = x2 * y1 - x1 * y2; + double a2 = y4 - y3, b2 = x3 - x4, c2 = x4 * y3 - x3 * y4; + double x = -(c1 * b2 - b1 * c2) / (a1 * b2 - b1 * a2); + double y = -(c1 * a2 - a1 * c2) / (b1 * a2 - a1 * b2); + cout << setiosflags(ios::fixed) << setprecision(2) << "POINT " << x << ' ' << y << endl; + } + } + cout << "END OF OUTPUT" << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest06/B-cf1066a.cpp b/assets/ipl/solutions/18fa/contest06/B-cf1066a.cpp index 2bd7055..864b5ac 100644 --- a/assets/ipl/solutions/18fa/contest06/B-cf1066a.cpp +++ b/assets/ipl/solutions/18fa/contest06/B-cf1066a.cpp @@ -1,17 +1,17 @@ -#include - -using namespace std; - - - -int main () { - int t; cin >> t; - while (t--) { - int L, v, l, r; - cin >> L >> v >> l >> r; - int ans = L / v - r / v + (l-1) / v; - cout << ans << endl; - } - return 0; -} - +#include + +using namespace std; + + + +int main () { + int t; cin >> t; + while (t--) { + int L, v, l, r; + cin >> L >> v >> l >> r; + int ans = L / v - r / v + (l-1) / v; + cout << ans << endl; + } + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest06/D-cf983a.cpp b/assets/ipl/solutions/18fa/contest06/D-cf983a.cpp index f0a1935..d192f0a 100644 --- a/assets/ipl/solutions/18fa/contest06/D-cf983a.cpp +++ b/assets/ipl/solutions/18fa/contest06/D-cf983a.cpp @@ -1,28 +1,28 @@ -#include -#define LL long long - -using namespace std; - -LL gcd (LL p, LL q) { return q == 0 ? p : gcd(q, p%q); } - -int main () { - cin.tie(0); - ios_base::sync_with_stdio(0); - int t; cin >> t; - while (t--) { - LL p, q, b; - cin >> p >> q >> b; - LL g = gcd(p, q); - p /= g; q /= g; - while (true) { - LL g = gcd(b, q); - if (g == 1) break; - while (q % g == 0) q /= g; - } - if (q == 1) cout << "Finite" << endl; - else cout << "Infinite" << endl; - } - - return 0; -} - +#include +#define LL long long + +using namespace std; + +LL gcd (LL p, LL q) { return q == 0 ? p : gcd(q, p%q); } + +int main () { + cin.tie(0); + ios_base::sync_with_stdio(0); + int t; cin >> t; + while (t--) { + LL p, q, b; + cin >> p >> q >> b; + LL g = gcd(p, q); + p /= g; q /= g; + while (true) { + LL g = gcd(b, q); + if (g == 1) break; + while (q % g == 0) q /= g; + } + if (q == 1) cout << "Finite" << endl; + else cout << "Infinite" << endl; + } + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest06/E-cf1041c.cpp b/assets/ipl/solutions/18fa/contest06/E-cf1041c.cpp index a3bbd64..017a29e 100644 --- a/assets/ipl/solutions/18fa/contest06/E-cf1041c.cpp +++ b/assets/ipl/solutions/18fa/contest06/E-cf1041c.cpp @@ -1,30 +1,30 @@ -#include -#include -#include - -using namespace std; - - - -int main () { - int n, m, d; cin >> n >> m >> d; - vector> a(n); - for (int i = 0; i < n; i++) { - cin >> a[i].first; - a[i].second = i; - } - sort(a.begin(), a.end()); - int ptr = 0, ans = 0; - for (int i = 0; i < n; i++) { - while (a[i].first - a[ptr].first > d) ptr++; - ans = max(ans, i - ptr + 1); - } - vector b(n); - for (int i = 0; i < n; i++) b[a[i].second] = i % ans + 1; - cout << ans << endl; - for (int i = 0; i < n; i++) cout << b[i] << ' '; - cout << endl; - - return 0; -} - +#include +#include +#include + +using namespace std; + + + +int main () { + int n, m, d; cin >> n >> m >> d; + vector> a(n); + for (int i = 0; i < n; i++) { + cin >> a[i].first; + a[i].second = i; + } + sort(a.begin(), a.end()); + int ptr = 0, ans = 0; + for (int i = 0; i < n; i++) { + while (a[i].first - a[ptr].first > d) ptr++; + ans = max(ans, i - ptr + 1); + } + vector b(n); + for (int i = 0; i < n; i++) b[a[i].second] = i % ans + 1; + cout << ans << endl; + for (int i = 0; i < n; i++) cout << b[i] << ' '; + cout << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest06/F-cf1060d.cpp b/assets/ipl/solutions/18fa/contest06/F-cf1060d.cpp index 5d6f3f1..64e99c6 100644 --- a/assets/ipl/solutions/18fa/contest06/F-cf1060d.cpp +++ b/assets/ipl/solutions/18fa/contest06/F-cf1060d.cpp @@ -1,23 +1,23 @@ -#include -#include -#include - -using namespace std; - - - -int main () { - cin.tie(0); - ios_base::sync_with_stdio(0); - int n; cin >> n; - vector l(n), r(n); - for (int i = 0; i < n; i++) cin >> l[i] >> r[i]; - sort(l.begin(), l.end()); - sort(r.begin(), r.end()); - long long ans = 0; - for (int i = 0; i < n; i++) ans += max(l[i], r[i]); - ans += n; - cout << ans << endl; - return 0; -} - +#include +#include +#include + +using namespace std; + + + +int main () { + cin.tie(0); + ios_base::sync_with_stdio(0); + int n; cin >> n; + vector l(n), r(n); + for (int i = 0; i < n; i++) cin >> l[i] >> r[i]; + sort(l.begin(), l.end()); + sort(r.begin(), r.end()); + long long ans = 0; + for (int i = 0; i < n; i++) ans += max(l[i], r[i]); + ans += n; + cout << ans << endl; + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest07/E-cf1051d.cpp b/assets/ipl/solutions/18fa/contest07/E-cf1051d.cpp index bf3dd79..8545b33 100644 --- a/assets/ipl/solutions/18fa/contest07/E-cf1051d.cpp +++ b/assets/ipl/solutions/18fa/contest07/E-cf1051d.cpp @@ -1,26 +1,26 @@ -#include -#define LL long long -#define MOD 998244353 - -using namespace std; - -LL dp[1001][2001][4]; - -int main () { - int n, k; cin >> n >> k; - dp[0][1][0] = dp[0][1][3] = 1; - dp[0][2][1] = dp[0][2][2] = 1; - for (int x = 1; x < n; x++) { - for (int y = 1; y <= 2000; y++) { - dp[x][y][0] = (dp[x-1][y][0] + dp[x-1][y][1] + dp[x-1][y][2] + dp[x-1][y-1][3]) % MOD; - dp[x][y][1] = (dp[x-1][y-1][0] + dp[x-1][y][1] + (y == 1 ? 0 : dp[x-1][y-2][2]) + dp[x-1][y-1][3]) % MOD; - dp[x][y][2] = (dp[x-1][y-1][0] + (y == 1 ? 0 : dp[x-1][y-2][1]) + dp[x-1][y][2] + dp[x-1][y-1][3]) % MOD; - dp[x][y][3] = (dp[x-1][y-1][0] + dp[x-1][y][1] + dp[x-1][y][2] + dp[x-1][y][3]) % MOD; - } - } - LL ans = (dp[n-1][k][0] + dp[n-1][k][1] + dp[n-1][k][2] + dp[n-1][k][3]) % MOD; - cout << ans << endl; - - return 0; -} - +#include +#define LL long long +#define MOD 998244353 + +using namespace std; + +LL dp[1001][2001][4]; + +int main () { + int n, k; cin >> n >> k; + dp[0][1][0] = dp[0][1][3] = 1; + dp[0][2][1] = dp[0][2][2] = 1; + for (int x = 1; x < n; x++) { + for (int y = 1; y <= 2000; y++) { + dp[x][y][0] = (dp[x-1][y][0] + dp[x-1][y][1] + dp[x-1][y][2] + dp[x-1][y-1][3]) % MOD; + dp[x][y][1] = (dp[x-1][y-1][0] + dp[x-1][y][1] + (y == 1 ? 0 : dp[x-1][y-2][2]) + dp[x-1][y-1][3]) % MOD; + dp[x][y][2] = (dp[x-1][y-1][0] + (y == 1 ? 0 : dp[x-1][y-2][1]) + dp[x-1][y][2] + dp[x-1][y-1][3]) % MOD; + dp[x][y][3] = (dp[x-1][y-1][0] + dp[x-1][y][1] + dp[x-1][y][2] + dp[x-1][y][3]) % MOD; + } + } + LL ans = (dp[n-1][k][0] + dp[n-1][k][1] + dp[n-1][k][2] + dp[n-1][k][3]) % MOD; + cout << ans << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest07/F-cf1065f.cpp b/assets/ipl/solutions/18fa/contest07/F-cf1065f.cpp index f7c9001..81664b9 100644 --- a/assets/ipl/solutions/18fa/contest07/F-cf1065f.cpp +++ b/assets/ipl/solutions/18fa/contest07/F-cf1065f.cpp @@ -1,88 +1,88 @@ -#include -#include -#define NMAX 1000001 - -using namespace std; - -int n, k; -int p[NMAX]; -vector c[NMAX]; -int dep[NMAX]; -int dep2cnt[NMAX + NMAX]; -int depkleafcnt[NMAX]; -int depgekleafcnt[NMAX]; -int cntleaf[NMAX]; -int dp0[NMAX]; // must return -int dp1[NMAX]; // may not return - -void dfs (int u, int d) { - dep[u] = d; - if (c[u].empty()) { - dep2cnt[d] ++; - cntleaf[u] = 1; - } - int tmp = dep2cnt[d+k]; - for (int v : c[u]) { - dfs(v, d+1); - depgekleafcnt[u] += depgekleafcnt[v]; - cntleaf[u] += cntleaf[v]; - } - depkleafcnt[u] = dep2cnt[d+k] - tmp; - depgekleafcnt[u] += depkleafcnt[u]; -} - -void work (int u) { - for (int v : c[u]) { - work(v); - } - /* - int ans = cntleaf[u] - depgekleafcnt[u] + depkleafcnt[u]; - int delta = 0; - for (int v : c[u]) { - int d = dp[v] - (cntleaf[v] - depgekleafcnt[v]); - delta = max(delta, d); - } - ans += delta; - dp[u] = ans; - */ - if (c[u].empty()) { - dp0[u] = dp1[u] = 1; - return; - } - if (cntleaf[u] == depgekleafcnt[u]) { - dp0[u] = 0; - } else { - for (int v : c[u]) { - dp0[u] += dp0[v]; - } - } - - for (int v : c[u]) { - if (cntleaf[v] > depgekleafcnt[v]) { - dp1[u] += dp0[v]; - } - } - int delta = 0; - for (int v : c[u]) { - delta = max(delta, dp1[v] - dp0[v]); - } - dp1[u] += delta; -} - -int main () { - cin.tie(0); - ios_base::sync_with_stdio(0); - cin >> n >> k; - for (int i = 2; i <= n; i++) { - cin >> p[i]; - c[p[i]].push_back(i); - } -// for (int i = 1; i <= n; i++) { cout << i << ": "; for (int v : c[i]) cout << v << ' '; cout << endl; } - dfs(1, 0); - work(1); -// for (int i = 1; i <= n; i++) cout << i << ": " << cntleaf[i] << ' ' << depkleafcnt[i] << ' ' << depgekleafcnt[i] << ' ' << dp0[i] << ' ' << dp1[i] << endl; - cout << dp1[1] << endl; - - return 0; -} - +#include +#include +#define NMAX 1000001 + +using namespace std; + +int n, k; +int p[NMAX]; +vector c[NMAX]; +int dep[NMAX]; +int dep2cnt[NMAX + NMAX]; +int depkleafcnt[NMAX]; +int depgekleafcnt[NMAX]; +int cntleaf[NMAX]; +int dp0[NMAX]; // must return +int dp1[NMAX]; // may not return + +void dfs (int u, int d) { + dep[u] = d; + if (c[u].empty()) { + dep2cnt[d] ++; + cntleaf[u] = 1; + } + int tmp = dep2cnt[d+k]; + for (int v : c[u]) { + dfs(v, d+1); + depgekleafcnt[u] += depgekleafcnt[v]; + cntleaf[u] += cntleaf[v]; + } + depkleafcnt[u] = dep2cnt[d+k] - tmp; + depgekleafcnt[u] += depkleafcnt[u]; +} + +void work (int u) { + for (int v : c[u]) { + work(v); + } + /* + int ans = cntleaf[u] - depgekleafcnt[u] + depkleafcnt[u]; + int delta = 0; + for (int v : c[u]) { + int d = dp[v] - (cntleaf[v] - depgekleafcnt[v]); + delta = max(delta, d); + } + ans += delta; + dp[u] = ans; + */ + if (c[u].empty()) { + dp0[u] = dp1[u] = 1; + return; + } + if (cntleaf[u] == depgekleafcnt[u]) { + dp0[u] = 0; + } else { + for (int v : c[u]) { + dp0[u] += dp0[v]; + } + } + + for (int v : c[u]) { + if (cntleaf[v] > depgekleafcnt[v]) { + dp1[u] += dp0[v]; + } + } + int delta = 0; + for (int v : c[u]) { + delta = max(delta, dp1[v] - dp0[v]); + } + dp1[u] += delta; +} + +int main () { + cin.tie(0); + ios_base::sync_with_stdio(0); + cin >> n >> k; + for (int i = 2; i <= n; i++) { + cin >> p[i]; + c[p[i]].push_back(i); + } +// for (int i = 1; i <= n; i++) { cout << i << ": "; for (int v : c[i]) cout << v << ' '; cout << endl; } + dfs(1, 0); + work(1); +// for (int i = 1; i <= n; i++) cout << i << ": " << cntleaf[i] << ' ' << depkleafcnt[i] << ' ' << depgekleafcnt[i] << ' ' << dp0[i] << ' ' << dp1[i] << endl; + cout << dp1[1] << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest09/A-cf1011a.cpp b/assets/ipl/solutions/18fa/contest09/A-cf1011a.cpp index 47104c4..a71d05b 100644 --- a/assets/ipl/solutions/18fa/contest09/A-cf1011a.cpp +++ b/assets/ipl/solutions/18fa/contest09/A-cf1011a.cpp @@ -1,25 +1,25 @@ -#include -#include - -using namespace std; - - - -int main () { - int n, k; cin >> n >> k; - bool a[27]; - for (int i = 1; i <= 26; i++) a[i] = false; - string s; cin >> s; - for (char c : s) a[c - 'a' + 1] = true; - int prev = -1, ans = 0, cnt = 0; - for (int i = 1; i <= 26; i++) { - if (i - prev < 2 || !a[i]) continue; - ans += i; cnt++; prev = i; - if (cnt == k) break; - } - if (cnt == k) cout << ans << endl; - else cout << -1 << endl; - - return 0; -} - +#include +#include + +using namespace std; + + + +int main () { + int n, k; cin >> n >> k; + bool a[27]; + for (int i = 1; i <= 26; i++) a[i] = false; + string s; cin >> s; + for (char c : s) a[c - 'a' + 1] = true; + int prev = -1, ans = 0, cnt = 0; + for (int i = 1; i <= 26; i++) { + if (i - prev < 2 || !a[i]) continue; + ans += i; cnt++; prev = i; + if (cnt == k) break; + } + if (cnt == k) cout << ans << endl; + else cout << -1 << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest09/B-cf1011b.cpp b/assets/ipl/solutions/18fa/contest09/B-cf1011b.cpp index 477db4e..11ec821 100644 --- a/assets/ipl/solutions/18fa/contest09/B-cf1011b.cpp +++ b/assets/ipl/solutions/18fa/contest09/B-cf1011b.cpp @@ -1,23 +1,23 @@ -#include -#include - -using namespace std; - - - -int main () { - int n, m; cin >> n >> m; - vector a(101, 0); - for (int i = 0; i < m; i++) { - int ai; cin >> ai; a[ai]++; - } - for (int ans = 100; ans > 0; ans--) { - int cnt = 0; - for (int i : a) cnt += i / ans; - if (cnt >= n) { cout << ans << endl; return 0; } - } - cout << 0 << endl; - - return 0; -} - +#include +#include + +using namespace std; + + + +int main () { + int n, m; cin >> n >> m; + vector a(101, 0); + for (int i = 0; i < m; i++) { + int ai; cin >> ai; a[ai]++; + } + for (int ans = 100; ans > 0; ans--) { + int cnt = 0; + for (int i : a) cnt += i / ans; + if (cnt >= n) { cout << ans << endl; return 0; } + } + cout << 0 << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest10/A-cf664a.cpp b/assets/ipl/solutions/18fa/contest10/A-cf664a.cpp index cecee2b..03e343d 100644 --- a/assets/ipl/solutions/18fa/contest10/A-cf664a.cpp +++ b/assets/ipl/solutions/18fa/contest10/A-cf664a.cpp @@ -1,12 +1,12 @@ -#include - -using namespace std; - -int main () { - string s, t; - cin >> s >> t; - if (s == t) cout << s << endl; - else cout << 1 << endl; - return 0; -} - +#include + +using namespace std; + +int main () { + string s, t; + cin >> s >> t; + if (s == t) cout << s << endl; + else cout << 1 << endl; + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest10/A-cf664a.txt b/assets/ipl/solutions/18fa/contest10/A-cf664a.txt index 9ba3d4d..8887dee 100644 --- a/assets/ipl/solutions/18fa/contest10/A-cf664a.txt +++ b/assets/ipl/solutions/18fa/contest10/A-cf664a.txt @@ -1,7 +1,7 @@ -Greatest common divisor $GCD(a,b)$ of two positive integers a and b is equal to the biggest integer d such that both integers a and b are divisible by d. There are many efficient algorithms to find greatest common divisor $GCD(a,b)$, for example, Euclid algorithm.
Formally, find the biggest integer d, such that all integers $a, a+1, a+2, ..., b$ are divisible by d. To make the problem even more complicated we allow a and b to be up to googol, 10100 — such number do not fit even in 64-bit integer type!
-## Input: -The only line of the input contains two integers a and b ($1 \\le a \\le b \\le 10^{100}$).
-## Output: -Output one integer — greatest common divisor of all integers from a to b inclusive.
-## Sample: -
Input
1 2
Output
1
Input
61803398874989484820458683436563811772030917980576 61803398874989484820458683436563811772030917980576
Output
61803398874989484820458683436563811772030917980576
+Greatest common divisor $GCD(a,b)$ of two positive integers a and b is equal to the biggest integer d such that both integers a and b are divisible by d. There are many efficient algorithms to find greatest common divisor $GCD(a,b)$, for example, Euclid algorithm.
Formally, find the biggest integer d, such that all integers $a, a+1, a+2, ..., b$ are divisible by d. To make the problem even more complicated we allow a and b to be up to googol, 10100 — such number do not fit even in 64-bit integer type!
+## Input: +The only line of the input contains two integers a and b ($1 \\le a \\le b \\le 10^{100}$).
+## Output: +Output one integer — greatest common divisor of all integers from a to b inclusive.
+## Sample: +
Input
1 2
Output
1
Input
61803398874989484820458683436563811772030917980576 61803398874989484820458683436563811772030917980576
Output
61803398874989484820458683436563811772030917980576
diff --git a/assets/ipl/solutions/18fa/contest10/B-cf959a.cpp b/assets/ipl/solutions/18fa/contest10/B-cf959a.cpp index e9e7d39..62511f7 100644 --- a/assets/ipl/solutions/18fa/contest10/B-cf959a.cpp +++ b/assets/ipl/solutions/18fa/contest10/B-cf959a.cpp @@ -1,11 +1,11 @@ -#include - -using namespace std; - -int main () { - int n; cin >> n; - if (n % 2) cout << "Ehab" << endl; - else cout << "Mahmoud" << endl; - return 0; -} - +#include + +using namespace std; + +int main () { + int n; cin >> n; + if (n % 2) cout << "Ehab" << endl; + else cout << "Mahmoud" << endl; + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest10/B-cf959a.txt b/assets/ipl/solutions/18fa/contest10/B-cf959a.txt index c19349d..d5e7f8a 100644 --- a/assets/ipl/solutions/18fa/contest10/B-cf959a.txt +++ b/assets/ipl/solutions/18fa/contest10/B-cf959a.txt @@ -1,9 +1,9 @@ -Mahmoud and Ehab play a game called the even-odd game. Ehab chooses his favorite integer n and then they take turns, starting from Mahmoud. In each player\'s turn, he has to choose an integer a and subtract it from n such that:
  • $1 \\le a \\le n$.
  • If it\'s Mahmoud\'s turn, a has to be even, but if it\'s Ehab\'s turn, a has to be odd.
If the current player can\'t choose any number satisfying the conditions, he loses. Can you determine the winner if they both play optimally?
-## Input: -The only line contains an integer n ($1 \\le n \\le 10^9$), the number at the beginning of the game.
-## Output: -Output "Mahmoud" (without quotes) if Mahmoud wins and "Ehab" (without quotes) otherwise.
-## Sample: -
Input
1
Output
Ehab
Input
2
Output
Mahmoud
-## Note: +Mahmoud and Ehab play a game called the even-odd game. Ehab chooses his favorite integer n and then they take turns, starting from Mahmoud. In each player\'s turn, he has to choose an integer a and subtract it from n such that:
  • $1 \\le a \\le n$.
  • If it\'s Mahmoud\'s turn, a has to be even, but if it\'s Ehab\'s turn, a has to be odd.
If the current player can\'t choose any number satisfying the conditions, he loses. Can you determine the winner if they both play optimally?
+## Input: +The only line contains an integer n ($1 \\le n \\le 10^9$), the number at the beginning of the game.
+## Output: +Output "Mahmoud" (without quotes) if Mahmoud wins and "Ehab" (without quotes) otherwise.
+## Sample: +
Input
1
Output
Ehab
Input
2
Output
Mahmoud
+## Note: In the first sample, Mahmoud can\'t choose any integer a initially because there is no positive even integer less than or equal to 1 so Ehab wins.
In the second sample, Mahmoud has to choose a?=?2 and subtract it from n. It\'s Ehab\'s turn and n?=?0. There is no positive odd integer less than or equal to 0 so Mahmoud wins.
\ No newline at end of file diff --git a/assets/ipl/solutions/18fa/contest10/C-cf980c.cpp b/assets/ipl/solutions/18fa/contest10/C-cf980c.cpp index a0309d7..2f0aec6 100644 --- a/assets/ipl/solutions/18fa/contest10/C-cf980c.cpp +++ b/assets/ipl/solutions/18fa/contest10/C-cf980c.cpp @@ -1,29 +1,29 @@ -#include -#include - -using namespace std; - - - -int main () { - int n, k; cin >> n >> k; - vector p(n); - for (int i = 0; i < n; i++) cin >> p[i]; - vector a(256, -1); - for (int i = 0; i < n; i++) { - if (a[p[i]] == -1) { - int j; - for (j = p[i]; j-1 > p[i] - k && j-1 >= 0 && a[j-1] == -1; j--); - if (j-1 >= 0 && a[j-1] != -1 && p[i] - a[j-1] < k) { - for (int l = j; l <= p[i]; l++) a[l] = a[j-1]; - } else { - for (int l = j; l <= p[i]; l++) a[l] = j; - } - } - cout << a[p[i]] << ' '; - } - cout << endl; - - return 0; -} - +#include +#include + +using namespace std; + + + +int main () { + int n, k; cin >> n >> k; + vector p(n); + for (int i = 0; i < n; i++) cin >> p[i]; + vector a(256, -1); + for (int i = 0; i < n; i++) { + if (a[p[i]] == -1) { + int j; + for (j = p[i]; j-1 > p[i] - k && j-1 >= 0 && a[j-1] == -1; j--); + if (j-1 >= 0 && a[j-1] != -1 && p[i] - a[j-1] < k) { + for (int l = j; l <= p[i]; l++) a[l] = a[j-1]; + } else { + for (int l = j; l <= p[i]; l++) a[l] = j; + } + } + cout << a[p[i]] << ' '; + } + cout << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest10/D-cf15c.cpp b/assets/ipl/solutions/18fa/contest10/D-cf15c.cpp index 9866bf1..722f079 100644 --- a/assets/ipl/solutions/18fa/contest10/D-cf15c.cpp +++ b/assets/ipl/solutions/18fa/contest10/D-cf15c.cpp @@ -1,29 +1,29 @@ -#include -#define LL long long - -using namespace std; - -// computes XOR sum of 1..n -LL work (LL n) { - LL ans = 0; - if (n % 2 == 0) { ans = n; n--; } - if ((n+1) % 4) ans ^= 1; - return ans; -} - -int main () { - cin.tie(0); - ios_base::sync_with_stdio(0); - - LL ans = 0; - int n; cin >> n; - while (n--) { - LL x, m; cin >> x >> m; - ans ^= work(x + m - 1) ^ work(x - 1); - } - if (ans) cout << "tolik" << endl; - else cout << "bolik" << endl; - - return 0; -} - +#include +#define LL long long + +using namespace std; + +// computes XOR sum of 1..n +LL work (LL n) { + LL ans = 0; + if (n % 2 == 0) { ans = n; n--; } + if ((n+1) % 4) ans ^= 1; + return ans; +} + +int main () { + cin.tie(0); + ios_base::sync_with_stdio(0); + + LL ans = 0; + int n; cin >> n; + while (n--) { + LL x, m; cin >> x >> m; + ans ^= work(x + m - 1) ^ work(x - 1); + } + if (ans) cout << "tolik" << endl; + else cout << "bolik" << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest10/D-cf15c.txt b/assets/ipl/solutions/18fa/contest10/D-cf15c.txt index 84a74d2..658649c 100644 --- a/assets/ipl/solutions/18fa/contest10/D-cf15c.txt +++ b/assets/ipl/solutions/18fa/contest10/D-cf15c.txt @@ -1,7 +1,7 @@ -There are n stone quarries in Petrograd.
Each quarry owns mi dumpers ($1 \\le i \\le n$). It is known that the first dumper of the i-th quarry has xi stones in it, the second dumper has $x_i + 1$ stones in it, the third has $x_i + 2$, and the mi-th dumper (the last for the i-th quarry) has $x_i + m_i - 1$ stones in it.
Two oligarchs play a well-known game Nim. Players take turns removing stones from dumpers. On each turn, a player can select any dumper and remove any non-zero amount of stones from it. The player who cannot take a stone loses.
Your task is to find out which oligarch will win, provided that both of them play optimally. The oligarchs asked you not to reveal their names. So, let\'s call the one who takes the first stone «tolik» and the other one «bolik».
-## Input: -The first line of the input contains one integer number n ($1 \\le n \\le 10^5$) — the amount of quarries. Then there follow n lines, each of them contains two space-separated integers xi and mi ($1 \\le x_i, m_i \\le 10^{16}$) — the amount of stones in the first dumper of the i-th quarry and the number of dumpers at the i-th quarry.
-## Output: -Output «tolik» if the oligarch who takes a stone first wins, and «bolik» otherwise.
-## Sample: +There are n stone quarries in Petrograd.
Each quarry owns mi dumpers ($1 \\le i \\le n$). It is known that the first dumper of the i-th quarry has xi stones in it, the second dumper has $x_i + 1$ stones in it, the third has $x_i + 2$, and the mi-th dumper (the last for the i-th quarry) has $x_i + m_i - 1$ stones in it.
Two oligarchs play a well-known game Nim. Players take turns removing stones from dumpers. On each turn, a player can select any dumper and remove any non-zero amount of stones from it. The player who cannot take a stone loses.
Your task is to find out which oligarch will win, provided that both of them play optimally. The oligarchs asked you not to reveal their names. So, let\'s call the one who takes the first stone «tolik» and the other one «bolik».
+## Input: +The first line of the input contains one integer number n ($1 \\le n \\le 10^5$) — the amount of quarries. Then there follow n lines, each of them contains two space-separated integers xi and mi ($1 \\le x_i, m_i \\le 10^{16}$) — the amount of stones in the first dumper of the i-th quarry and the number of dumpers at the i-th quarry.
+## Output: +Output «tolik» if the oligarch who takes a stone first wins, and «bolik» otherwise.
+## Sample:
Input
2
2 1
3 2
Output
tolik
Input
4
1 1
1 1
1 1
1 1
Output
bolik
\ No newline at end of file diff --git a/assets/ipl/solutions/18fa/contest10/F-cf87c.cpp b/assets/ipl/solutions/18fa/contest10/F-cf87c.cpp index bf7903b..13dbb69 100644 --- a/assets/ipl/solutions/18fa/contest10/F-cf87c.cpp +++ b/assets/ipl/solutions/18fa/contest10/F-cf87c.cpp @@ -1,37 +1,37 @@ -#include -#include -#include -#include - -using namespace std; - -int mex (set suc) { - for (int i = 0; ; i++) { - if (suc.find(i) == suc.end()) { - return i; - } - } -} - -int main () { - int n; cin >> n; - vector sg(n+1, 0); - int ans = -1; - for (int x = 3; x <= n; x++) { - set suc; - for (int m = 2; m * (m+1) / 2 <= x; m++) { - int r = x - m * (m+1) / 2; - if (r % m) continue; - int a = r / m + 1; - int xor_sum = 0; - for (int j = 0; j < m; j++) xor_sum ^= sg[a + j]; - suc.insert(xor_sum); - if (x == n && xor_sum == 0 && ans == -1) ans = m; - } - sg[x] = mex(suc); - } - cout << ans << endl; - - return 0; -} - +#include +#include +#include +#include + +using namespace std; + +int mex (set suc) { + for (int i = 0; ; i++) { + if (suc.find(i) == suc.end()) { + return i; + } + } +} + +int main () { + int n; cin >> n; + vector sg(n+1, 0); + int ans = -1; + for (int x = 3; x <= n; x++) { + set suc; + for (int m = 2; m * (m+1) / 2 <= x; m++) { + int r = x - m * (m+1) / 2; + if (r % m) continue; + int a = r / m + 1; + int xor_sum = 0; + for (int j = 0; j < m; j++) xor_sum ^= sg[a + j]; + suc.insert(xor_sum); + if (x == n && xor_sum == 0 && ans == -1) ans = m; + } + sg[x] = mex(suc); + } + cout << ans << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest10/F-cf87c.txt b/assets/ipl/solutions/18fa/contest10/F-cf87c.txt index c2a051e..966af57 100644 --- a/assets/ipl/solutions/18fa/contest10/F-cf87c.txt +++ b/assets/ipl/solutions/18fa/contest10/F-cf87c.txt @@ -1,7 +1,7 @@ -Two best friends Serozha and Gena play a game.
Initially there is one pile consisting of n stones on the table. During one move one pile should be taken and divided into an arbitrary number of piles consisting of $a_1 > a_2 > ... > a_k > 0$ stones. The piles should meet the condition $a_1 - a_2 = a_2 - a_3 = ... = a_{k-1} - a_k = 1$. Naturally, the number of piles k should be no less than two.
The friends play in turns. The player who cannot make a move loses. Serozha makes the first move. Who will win if both players play in the optimal way?
-## Input: -The single line contains a single integer n ($1 \\le n \\le 10^5$).
-## Output: -If Serozha wins, print k, which represents the minimal number of piles into which he can split the initial one during the first move in order to win the game.
If Gena wins, print "-1" (without the quotes).
-## Sample: +Two best friends Serozha and Gena play a game.
Initially there is one pile consisting of n stones on the table. During one move one pile should be taken and divided into an arbitrary number of piles consisting of $a_1 > a_2 > ... > a_k > 0$ stones. The piles should meet the condition $a_1 - a_2 = a_2 - a_3 = ... = a_{k-1} - a_k = 1$. Naturally, the number of piles k should be no less than two.
The friends play in turns. The player who cannot make a move loses. Serozha makes the first move. Who will win if both players play in the optimal way?
+## Input: +The single line contains a single integer n ($1 \\le n \\le 10^5$).
+## Output: +If Serozha wins, print k, which represents the minimal number of piles into which he can split the initial one during the first move in order to win the game.
If Gena wins, print "-1" (without the quotes).
+## Sample:
Input
3
Output
2
Input
6
Output
-1
Input
100
Output
8
\ No newline at end of file diff --git a/assets/ipl/solutions/18fa/contest10/G-cf603.txt b/assets/ipl/solutions/18fa/contest10/G-cf603.txt index 1972fb2..cf828cc 100644 --- a/assets/ipl/solutions/18fa/contest10/G-cf603.txt +++ b/assets/ipl/solutions/18fa/contest10/G-cf603.txt @@ -1,9 +1,9 @@ -Kevin and Nicky Sun have invented a new game called Lieges of Legendre. In this game, two players take turns modifying the game state with Kevin moving first. Initially, the game is set up so that there are n piles of cows, with the i-th pile containing ai cows. During each player\'s turn, that player calls upon the power of Sunlight, and uses it to either:
  1. Remove a single cow from a chosen non-empty pile.
  2. Choose a pile of cows with even size x ($x > 0$), and replace it with k piles of x cows each.
The player who removes the last cow wins. Given n, k, and a sequence $a_1, a_2, ..., a_n$, help Kevin and Nicky find the winner, given that both sides play in optimal way.
-## Input: -The first line of the input contains two space-separated integers n and k ($1 \\le n \\le 100000$,$1 \\le k \\le 10^9$).
The second line contains n integers, $a_1, a_2, ..., a_n$ ($1 \\le a_i \\le 10^9$) describing the initial state of the game.
-## Output: -Output the name of the winning player, either "Kevin" or "Nicky" (without quotes).
-## Sample: -
Input
2 1
3 4
Output
Kevin
Input
1 2
3
Output
Nicky
-## Note: +Kevin and Nicky Sun have invented a new game called Lieges of Legendre. In this game, two players take turns modifying the game state with Kevin moving first. Initially, the game is set up so that there are n piles of cows, with the i-th pile containing ai cows. During each player\'s turn, that player calls upon the power of Sunlight, and uses it to either:
  1. Remove a single cow from a chosen non-empty pile.
  2. Choose a pile of cows with even size x ($x > 0$), and replace it with k piles of x cows each.
The player who removes the last cow wins. Given n, k, and a sequence $a_1, a_2, ..., a_n$, help Kevin and Nicky find the winner, given that both sides play in optimal way.
+## Input: +The first line of the input contains two space-separated integers n and k ($1 \\le n \\le 100000$,$1 \\le k \\le 10^9$).
The second line contains n integers, $a_1, a_2, ..., a_n$ ($1 \\le a_i \\le 10^9$) describing the initial state of the game.
+## Output: +Output the name of the winning player, either "Kevin" or "Nicky" (without quotes).
+## Sample: +
Input
2 1
3 4
Output
Kevin
Input
1 2
3
Output
Nicky
+## Note: In the second sample, Nicky can win in the following way: Kevin moves first and is forced to remove a cow, so the pile contains two cows after his move. Next, Nicky replaces this pile of size 2 with two piles of size 1. So the game state is now two piles of size 1. Kevin then removes one of the remaining cows and Nicky wins by removing the other.
\ No newline at end of file diff --git a/assets/ipl/solutions/18fa/contest10/G-cf603c.cpp b/assets/ipl/solutions/18fa/contest10/G-cf603c.cpp index 31b60b4..c58341c 100644 --- a/assets/ipl/solutions/18fa/contest10/G-cf603c.cpp +++ b/assets/ipl/solutions/18fa/contest10/G-cf603c.cpp @@ -1,38 +1,38 @@ -#include - -using namespace std; - -int n, k; -int ans = 0; - -int SG (int x) { - if (x == 0) return 0; - if (x == 1) return 1; - if (k % 2 == 0) { - if (x == 2) return 2; - if (x % 2 == 0) return 1; - return 0; - } else { - if (x == 2) return 0; - if (x == 3) return 1; - if (x == 4) return 2; - if (x % 2 == 1) return 0; - return SG(x / 2) == 1 ? 2 : 1; - } -} - -int main () { - cin.tie(0); - ios_base::sync_with_stdio(0); - - cin >> n >> k; - for (int i = 0, x; i < n; i++) { - cin >> x; - ans ^= SG(x); - } - if (ans) cout << "Kevin" << endl; - else cout << "Nicky" << endl; - - return 0; -} - +#include + +using namespace std; + +int n, k; +int ans = 0; + +int SG (int x) { + if (x == 0) return 0; + if (x == 1) return 1; + if (k % 2 == 0) { + if (x == 2) return 2; + if (x % 2 == 0) return 1; + return 0; + } else { + if (x == 2) return 0; + if (x == 3) return 1; + if (x == 4) return 2; + if (x % 2 == 1) return 0; + return SG(x / 2) == 1 ? 2 : 1; + } +} + +int main () { + cin.tie(0); + ios_base::sync_with_stdio(0); + + cin >> n >> k; + for (int i = 0, x; i < n; i++) { + cin >> x; + ans ^= SG(x); + } + if (ans) cout << "Kevin" << endl; + else cout << "Nicky" << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest11/B-cf472b.cpp b/assets/ipl/solutions/18fa/contest11/B-cf472b.cpp index 8b9e7f9..be743c5 100644 --- a/assets/ipl/solutions/18fa/contest11/B-cf472b.cpp +++ b/assets/ipl/solutions/18fa/contest11/B-cf472b.cpp @@ -1,23 +1,23 @@ -#include -#include -#include - -using namespace std; - - - -int main () { - int n, k; - cin >> n >> k; - vector f(n); - for (int i = 0; i < n; i++) cin >> f[i]; - sort(f.begin(), f.end(), greater()); - int ans = 0; - for (int i = 0; i < n; i += k) { - ans += 2 * (f[i] - 1); - } - cout << ans << endl; - - return 0; -} - +#include +#include +#include + +using namespace std; + + + +int main () { + int n, k; + cin >> n >> k; + vector f(n); + for (int i = 0; i < n; i++) cin >> f[i]; + sort(f.begin(), f.end(), greater()); + int ans = 0; + for (int i = 0; i < n; i += k) { + ans += 2 * (f[i] - 1); + } + cout << ans << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest11/B-cf472b.txt b/assets/ipl/solutions/18fa/contest11/B-cf472b.txt index 0f2cdbf..ba28268 100644 --- a/assets/ipl/solutions/18fa/contest11/B-cf472b.txt +++ b/assets/ipl/solutions/18fa/contest11/B-cf472b.txt @@ -1,9 +1,9 @@ -One way to create a task is to learn from life. You can choose some experience in real life, formalize it and then you will get a new task.
Let\'s think about a scene in real life: there are lots of people waiting in front of the elevator, each person wants to go to a certain floor. We can formalize it in the following way. We have n people standing on the first floor, the i-th person wants to go to the fi-th floor. Unfortunately, there is only one elevator and its capacity equal to k (that is at most k people can use it simultaneously). Initially the elevator is located on the first floor. The elevator needs $|a-b|$ seconds to move from the a-th floor to the b-th floor (we don\'t count the time the people need to get on and off the elevator).
What is the minimal number of seconds that is needed to transport all the people to the corresponding floors and then return the elevator to the first floor?
-## Input: -The first line contains two integers n and k $1 \\le n,k \\le 2000$ — the number of people and the maximal capacity of the elevator.
The next line contains n integers: $f_1, f_2, ..., f_n$ ($2 \\le f_i \\le 2000$), where fi denotes the target floor of the i-th person.
-## Output: -Output a single integer — the minimal time needed to achieve the goal.
-## Sample: -
Input
3 2
2 3 4
Output
8
Input
4 2
50 100 50 100
Output
296
Input
10 3
2 2 2 2 2 2 2 2 2 2
Output
8
-## Note: +One way to create a task is to learn from life. You can choose some experience in real life, formalize it and then you will get a new task.
Let\'s think about a scene in real life: there are lots of people waiting in front of the elevator, each person wants to go to a certain floor. We can formalize it in the following way. We have n people standing on the first floor, the i-th person wants to go to the fi-th floor. Unfortunately, there is only one elevator and its capacity equal to k (that is at most k people can use it simultaneously). Initially the elevator is located on the first floor. The elevator needs $|a-b|$ seconds to move from the a-th floor to the b-th floor (we don\'t count the time the people need to get on and off the elevator).
What is the minimal number of seconds that is needed to transport all the people to the corresponding floors and then return the elevator to the first floor?
+## Input: +The first line contains two integers n and k $1 \\le n,k \\le 2000$ — the number of people and the maximal capacity of the elevator.
The next line contains n integers: $f_1, f_2, ..., f_n$ ($2 \\le f_i \\le 2000$), where fi denotes the target floor of the i-th person.
+## Output: +Output a single integer — the minimal time needed to achieve the goal.
+## Sample: +
Input
3 2
2 3 4
Output
8
Input
4 2
50 100 50 100
Output
296
Input
10 3
2 2 2 2 2 2 2 2 2 2
Output
8
+## Note: In first sample, an optimal solution is:
  1. The elevator takes up person #1 and person #2.
  2. It goes to the 2nd floor.
  3. Both people go out of the elevator.
  4. The elevator goes back to the 1st floor.
  5. Then the elevator takes up person #3.
  6. And it goes to the 2nd floor.
  7. It picks up person #2.
  8. Then it goes to the 3rd floor.
  9. Person #2 goes out.
  10. Then it goes to the 4th floor, where person #3 goes out.
  11. The elevator goes back to the 1st floor.
\ No newline at end of file diff --git a/assets/ipl/solutions/18fa/contest11/C-cf746c.txt b/assets/ipl/solutions/18fa/contest11/C-cf746c.txt index c30e48f..4e76513 100644 --- a/assets/ipl/solutions/18fa/contest11/C-cf746c.txt +++ b/assets/ipl/solutions/18fa/contest11/C-cf746c.txt @@ -1,9 +1,9 @@ -The tram in Berland goes along a straight line from the point 0 to the point s and back, passing 1 meter per t1 seconds in both directions. It means that the tram is always in the state of uniform rectilinear motion, instantly turning around at points $x = 0$ and $x = s$.
Igor is at the point x1. He should reach the point x2. Igor passes 1 meter per t2 seconds.
Your task is to determine the minimum time Igor needs to get from the point x1 to the point x2, if it is known where the tram is and in what direction it goes at the moment Igor comes to the point x1.
Igor can enter the tram unlimited number of times at any moment when his and the tram\'s positions coincide. It is not obligatory that points in which Igor enter and exit the tram are integers. Assume that any boarding and unboarding happens instantly. Igor can move arbitrary along the line (but not faster than 1 meter per t2 seconds). He can also stand at some point for some time.
-## Input: -The first line contains three integers s, x1 and x2 ($2 \\le s \\le 1000$, $0 \\le x_1, x_2 \\le s$, $x_1 \\ne x_2$) — the maximum coordinate of the point to which the tram goes, the point Igor is at, and the point he should come to.
The second line contains two integers t1 and t2 ($1 \\le t_1, t_2 \\le 1000$) — the time in seconds in which the tram passes 1 meter and the time in seconds in which Igor passes 1 meter.
The third line contains two integers p and d ($1 \\le p \\le s-1$, d is either $1$ or $-1$) — the position of the tram in the moment Igor came to the point x1 and the direction of the tram at this moment. If $d = -1$, the tram goes in the direction from the point s to the point 0. If $d = 1$, the tram goes in the direction from the point 0 to the point s.
-## Output: -Print the minimum time in seconds which Igor needs to get from the point x1 to the point x2.
-## Sample: -
Input
4 2 4
3 4
1 1
Output
8
Input
5 4 0
1 2
3 1
Output
7
-## Note: +The tram in Berland goes along a straight line from the point 0 to the point s and back, passing 1 meter per t1 seconds in both directions. It means that the tram is always in the state of uniform rectilinear motion, instantly turning around at points $x = 0$ and $x = s$.
Igor is at the point x1. He should reach the point x2. Igor passes 1 meter per t2 seconds.
Your task is to determine the minimum time Igor needs to get from the point x1 to the point x2, if it is known where the tram is and in what direction it goes at the moment Igor comes to the point x1.
Igor can enter the tram unlimited number of times at any moment when his and the tram\'s positions coincide. It is not obligatory that points in which Igor enter and exit the tram are integers. Assume that any boarding and unboarding happens instantly. Igor can move arbitrary along the line (but not faster than 1 meter per t2 seconds). He can also stand at some point for some time.
+## Input: +The first line contains three integers s, x1 and x2 ($2 \\le s \\le 1000$, $0 \\le x_1, x_2 \\le s$, $x_1 \\ne x_2$) — the maximum coordinate of the point to which the tram goes, the point Igor is at, and the point he should come to.
The second line contains two integers t1 and t2 ($1 \\le t_1, t_2 \\le 1000$) — the time in seconds in which the tram passes 1 meter and the time in seconds in which Igor passes 1 meter.
The third line contains two integers p and d ($1 \\le p \\le s-1$, d is either $1$ or $-1$) — the position of the tram in the moment Igor came to the point x1 and the direction of the tram at this moment. If $d = -1$, the tram goes in the direction from the point s to the point 0. If $d = 1$, the tram goes in the direction from the point 0 to the point s.
+## Output: +Print the minimum time in seconds which Igor needs to get from the point x1 to the point x2.
+## Sample: +
Input
4 2 4
3 4
1 1
Output
8
Input
5 4 0
1 2
3 1
Output
7
+## Note: In the first example it is profitable for Igor to go by foot and not to wait the tram. Thus, he has to pass 2 meters and it takes 8 seconds in total, because he passes 1 meter per 4 seconds.
In the second example Igor can, for example, go towards the point x2 and get to the point 1 in 6 seconds (because he has to pass 3 meters, but he passes 1 meters per 2 seconds). At that moment the tram will be at the point 1, so Igor can enter the tram and pass 1 meter in 1 second. Thus, Igor will reach the point x2 in 7 seconds in total.
\ No newline at end of file diff --git a/assets/ipl/solutions/18fa/contest11/E-cf627a.cpp b/assets/ipl/solutions/18fa/contest11/E-cf627a.cpp index 8bfd7a0..a93573d 100644 --- a/assets/ipl/solutions/18fa/contest11/E-cf627a.cpp +++ b/assets/ipl/solutions/18fa/contest11/E-cf627a.cpp @@ -1,42 +1,42 @@ -#include - -using namespace std; - -int ss[50], xx[50]; - -int main () { - long long s, x; - cin >> s >> x; - long long _s = s, _x = x; - for (int i = 0; i < 50; i++) { - ss[i] = s & 1; - s >>= 1; - xx[i] = x & 1; - x >>= 1; - } - long long ans = 1; - int jin = 0; - for (int i = 0; i < 49; i++) { - if (ss[i] == 0 && xx[i] == 0) { - if (jin == 0) { jin = ss[i+1] ^ xx[i+1]; } - else { cout << 0 << endl; return 0; } - } - if (ss[i] == 0 && xx[i] == 1) { - if (jin == 0) { cout << 0 << endl; return 0; } - else { ans <<= 1; } - } - if (ss[i] == 1 && xx[i] == 0) { - if (jin == 0) { cout << 0 << endl; return 0; } - else { jin = ss[i+1] ^ xx[i+1]; } - } - if (ss[i] == 1 && xx[i] == 1) { - if (jin == 0) { ans <<= 1; } - else { cout << 0 << endl; return 0; } - } - } - if (_s == _x) ans -= 2; - cout << ans << endl; - - return 0; -} - +#include + +using namespace std; + +int ss[50], xx[50]; + +int main () { + long long s, x; + cin >> s >> x; + long long _s = s, _x = x; + for (int i = 0; i < 50; i++) { + ss[i] = s & 1; + s >>= 1; + xx[i] = x & 1; + x >>= 1; + } + long long ans = 1; + int jin = 0; + for (int i = 0; i < 49; i++) { + if (ss[i] == 0 && xx[i] == 0) { + if (jin == 0) { jin = ss[i+1] ^ xx[i+1]; } + else { cout << 0 << endl; return 0; } + } + if (ss[i] == 0 && xx[i] == 1) { + if (jin == 0) { cout << 0 << endl; return 0; } + else { ans <<= 1; } + } + if (ss[i] == 1 && xx[i] == 0) { + if (jin == 0) { cout << 0 << endl; return 0; } + else { jin = ss[i+1] ^ xx[i+1]; } + } + if (ss[i] == 1 && xx[i] == 1) { + if (jin == 0) { ans <<= 1; } + else { cout << 0 << endl; return 0; } + } + } + if (_s == _x) ans -= 2; + cout << ans << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/18fa/contest11/E-cf627a.txt b/assets/ipl/solutions/18fa/contest11/E-cf627a.txt index 33cc63b..727b173 100644 --- a/assets/ipl/solutions/18fa/contest11/E-cf627a.txt +++ b/assets/ipl/solutions/18fa/contest11/E-cf627a.txt @@ -1,9 +1,9 @@ -Two positive integers $a$ and $b$ have a sum of $s$ and a bitwise XOR of $x$. How many possible values are there for the ordered pair $(a,b)$?
-## Input: -The first line of the input contains two integers $s$ and $x$ ($2 \\le s \\le 10^{12}$, $0 \\le x \\le 10^{12}$), the sum and bitwise xor of the pair of positive integers, respectively.
-## Output: -Print a single integer, the number of solutions to the given conditions. If no solutions exist, print 0.
-## Sample: -
Input
9 5
Output
4
Input
3 3
Output
2
Input
5 2
Output
0
-## Note: +Two positive integers $a$ and $b$ have a sum of $s$ and a bitwise XOR of $x$. How many possible values are there for the ordered pair $(a,b)$?
+## Input: +The first line of the input contains two integers $s$ and $x$ ($2 \\le s \\le 10^{12}$, $0 \\le x \\le 10^{12}$), the sum and bitwise xor of the pair of positive integers, respectively.
+## Output: +Print a single integer, the number of solutions to the given conditions. If no solutions exist, print 0.
+## Sample: +
Input
9 5
Output
4
Input
3 3
Output
2
Input
5 2
Output
0
+## Note: In the first sample, we have the following solutions: $(2,7)$, $(3,6)$, $(6,3)$, $(7,2)$.
In the second sample, the only solutions are $(1,2)$ and $(2,1)$.
\ No newline at end of file diff --git a/assets/ipl/solutions/18sp/cf/cf116c.cpp b/assets/ipl/solutions/18sp/cf/cf116c.cpp index f86abf8..f84aaec 100644 --- a/assets/ipl/solutions/18sp/cf/cf116c.cpp +++ b/assets/ipl/solutions/18sp/cf/cf116c.cpp @@ -1,26 +1,26 @@ -#include - -using namespace std; - -int p[2001]; -int dep[2001]; - -int calc_dep(int i) { - if (i == -1) return 0; - if (dep[i]) return dep[i]; - return dep[i] = calc_dep(p[i]) + 1; -} - -int main () { - int n; - cin >> n; - for (int i = 1; i <= n; i ++) cin >> p[i]; - for (int i = 1; i <= n; i ++) { - calc_dep(i); - } - int ans = 0; - for (int i = 1; i <= n; i ++) ans = max(ans, dep[i]); - cout << ans << endl; - return 0; -} - +#include + +using namespace std; + +int p[2001]; +int dep[2001]; + +int calc_dep(int i) { + if (i == -1) return 0; + if (dep[i]) return dep[i]; + return dep[i] = calc_dep(p[i]) + 1; +} + +int main () { + int n; + cin >> n; + for (int i = 1; i <= n; i ++) cin >> p[i]; + for (int i = 1; i <= n; i ++) { + calc_dep(i); + } + int ans = 0; + for (int i = 1; i <= n; i ++) ans = max(ans, dep[i]); + cout << ans << endl; + return 0; +} + diff --git a/assets/ipl/solutions/18sp/cf/cf384a.cpp b/assets/ipl/solutions/18sp/cf/cf384a.cpp index 424435e..9d46114 100644 --- a/assets/ipl/solutions/18sp/cf/cf384a.cpp +++ b/assets/ipl/solutions/18sp/cf/cf384a.cpp @@ -1,18 +1,18 @@ -#include - -using namespace std; - -int main () { - int n; - cin >> n; - cout << (n * n + 1) / 2 << endl; - for (int i = 0; i < n; i ++) { - for (int j = 0; j < n; j ++) { - if ((i & 1) == (j & 1)) cout << 'C'; - else cout << '.'; - } - cout << endl; - } - return 0; -} - +#include + +using namespace std; + +int main () { + int n; + cin >> n; + cout << (n * n + 1) / 2 << endl; + for (int i = 0; i < n; i ++) { + for (int j = 0; j < n; j ++) { + if ((i & 1) == (j & 1)) cout << 'C'; + else cout << '.'; + } + cout << endl; + } + return 0; +} + diff --git a/assets/ipl/solutions/18sp/cf/cf459c.cpp b/assets/ipl/solutions/18sp/cf/cf459c.cpp index ad30952..71ca1d8 100644 --- a/assets/ipl/solutions/18sp/cf/cf459c.cpp +++ b/assets/ipl/solutions/18sp/cf/cf459c.cpp @@ -1,26 +1,26 @@ -#include -#include - -using namespace std; - -int main () { - int n, k, d; - cin >> n >> k >> d; - if (log(n) / log(k) > d + 1e-08) { - cout << -1 << endl; - } else { - long long base = 1; - for (int i = 0; i < d; i ++) { - int out = 0; - for (int j = 0; j < n; j ++) { - if (j % base == 0) out = out % k + 1; - cout << out << ' '; - } - base = min((long long)0x7fffffff, base * k); - cout << endl; - } - } - - return 0; -} - +#include +#include + +using namespace std; + +int main () { + int n, k, d; + cin >> n >> k >> d; + if (log(n) / log(k) > d + 1e-08) { + cout << -1 << endl; + } else { + long long base = 1; + for (int i = 0; i < d; i ++) { + int out = 0; + for (int j = 0; j < n; j ++) { + if (j % base == 0) out = out % k + 1; + cout << out << ' '; + } + base = min((long long)0x7fffffff, base * k); + cout << endl; + } + } + + return 0; +} + diff --git a/assets/ipl/solutions/18sp/cf/cf460b.cpp b/assets/ipl/solutions/18sp/cf/cf460b.cpp index ab70fad..994caa0 100644 --- a/assets/ipl/solutions/18sp/cf/cf460b.cpp +++ b/assets/ipl/solutions/18sp/cf/cf460b.cpp @@ -1,37 +1,37 @@ -#include -#include - -using namespace std; - -int s (int x) { - int ans = 0; - while (x) { - ans += x % 10; - x /= 10; - } - return ans; -} - -int pow (int base, int p) { - int ans = 1; - while (p--) ans *= base; - return ans; -} - -int main () { - int a, b, c; - cin >> a >> b >> c; - vector ans; - for (int i = 1; i <= 81; i ++) { - long long x = (long long)b * pow(i, a) + c; - if ((int)(x) != x) continue; - if (s(x) == i && x < 1e9) ans.push_back(x); - } - cout << ans.size() << endl; - for (int i : ans) { - cout << i << ' '; - } - cout << endl; - return 0; -} - +#include +#include + +using namespace std; + +int s (int x) { + int ans = 0; + while (x) { + ans += x % 10; + x /= 10; + } + return ans; +} + +int pow (int base, int p) { + int ans = 1; + while (p--) ans *= base; + return ans; +} + +int main () { + int a, b, c; + cin >> a >> b >> c; + vector ans; + for (int i = 1; i <= 81; i ++) { + long long x = (long long)b * pow(i, a) + c; + if ((int)(x) != x) continue; + if (s(x) == i && x < 1e9) ans.push_back(x); + } + cout << ans.size() << endl; + for (int i : ans) { + cout << i << ' '; + } + cout << endl; + return 0; +} + diff --git a/assets/ipl/solutions/18sp/cf/cf460c.cpp b/assets/ipl/solutions/18sp/cf/cf460c.cpp index 1b67e08..37f0133 100644 --- a/assets/ipl/solutions/18sp/cf/cf460c.cpp +++ b/assets/ipl/solutions/18sp/cf/cf460c.cpp @@ -1,34 +1,34 @@ -#include -#include - -using namespace std; - -int main () { - int n, m, w; - cin >> n >> m >> w; - vector a(n); - int minn = 0x7fffffff; - for (int i = 0; i < n; i ++) { - cin >> a[i]; - minn = min(minn, a[i]); - } - int lo = minn, hi = minn + m + 1; - while (hi - lo > 1) { - int mi = lo + (hi - lo) / 2; - long long days = 0; - int cover = 0; - vector st(n); - for (int i = 0; i < n; i ++) { - if (i >= w) cover -= st[i-w]; - st[i] = max(0, mi - a[i] - cover); - days += st[i]; - cover += st[i]; - } - if (days <= m) lo = mi; - else hi = mi; - } - cout << lo << endl; - - return 0; -} - +#include +#include + +using namespace std; + +int main () { + int n, m, w; + cin >> n >> m >> w; + vector a(n); + int minn = 0x7fffffff; + for (int i = 0; i < n; i ++) { + cin >> a[i]; + minn = min(minn, a[i]); + } + int lo = minn, hi = minn + m + 1; + while (hi - lo > 1) { + int mi = lo + (hi - lo) / 2; + long long days = 0; + int cover = 0; + vector st(n); + for (int i = 0; i < n; i ++) { + if (i >= w) cover -= st[i-w]; + st[i] = max(0, mi - a[i] - cover); + days += st[i]; + cover += st[i]; + } + if (days <= m) lo = mi; + else hi = mi; + } + cout << lo << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/18sp/cf/cf462a.cpp b/assets/ipl/solutions/18sp/cf/cf462a.cpp index ed09780..a64efff 100644 --- a/assets/ipl/solutions/18sp/cf/cf462a.cpp +++ b/assets/ipl/solutions/18sp/cf/cf462a.cpp @@ -1,32 +1,32 @@ -#include - -using namespace std; - -int main () { - int n; - cin >> n; - char a[100][100]; - for (int i = 0; i < n; i ++) { - string s; - cin >> s; - for (int j = 0; j < n; j ++) { - a[i][j] = s[j]; - } - } - bool flag = true; - for (int i = 0; i < n; i ++) { - for (int j = 0; j < n; j ++) { - int cnt = 0; - if (i > 0 && a[i-1][j] == 'o') cnt++; - if (i < n-1 && a[i+1][j] == 'o') cnt++; - if (j > 0 && a[i][j-1] == 'o') cnt++; - if (j < n-1 && a[i][j+1] == 'o') cnt++; - flag &= (cnt % 2 == 0); - } - } - if (flag) cout << "YES" << endl; - else cout << "NO" << endl; - - return 0; -} - +#include + +using namespace std; + +int main () { + int n; + cin >> n; + char a[100][100]; + for (int i = 0; i < n; i ++) { + string s; + cin >> s; + for (int j = 0; j < n; j ++) { + a[i][j] = s[j]; + } + } + bool flag = true; + for (int i = 0; i < n; i ++) { + for (int j = 0; j < n; j ++) { + int cnt = 0; + if (i > 0 && a[i-1][j] == 'o') cnt++; + if (i < n-1 && a[i+1][j] == 'o') cnt++; + if (j > 0 && a[i][j-1] == 'o') cnt++; + if (j < n-1 && a[i][j+1] == 'o') cnt++; + flag &= (cnt % 2 == 0); + } + } + if (flag) cout << "YES" << endl; + else cout << "NO" << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/18sp/cf/cf463b.cpp b/assets/ipl/solutions/18sp/cf/cf463b.cpp index bc46911..64ca8a4 100644 --- a/assets/ipl/solutions/18sp/cf/cf463b.cpp +++ b/assets/ipl/solutions/18sp/cf/cf463b.cpp @@ -1,13 +1,13 @@ -#include - -using namespace std; - -int main () { - int n; - cin >> n; - int ans = 0; - while (n--) { int h; cin >> h; ans = max(ans, h); } - cout << ans << endl; - return 0; -} - +#include + +using namespace std; + +int main () { + int n; + cin >> n; + int ans = 0; + while (n--) { int h; cin >> h; ans = max(ans, h); } + cout << ans << endl; + return 0; +} + diff --git a/assets/ipl/solutions/18sp/cf/cf465a.cpp b/assets/ipl/solutions/18sp/cf/cf465a.cpp index 1812b00..88d4c83 100644 --- a/assets/ipl/solutions/18sp/cf/cf465a.cpp +++ b/assets/ipl/solutions/18sp/cf/cf465a.cpp @@ -1,14 +1,14 @@ -#include - -using namespace std; - -int main () { - int n; string s; - cin >> n >> s; - int ans = 0; - for (; ans < n && s[ans] == '1'; ans++); - if (ans == n) cout << ans << endl; - else cout << ans + 1 << endl; - return 0; -} - +#include + +using namespace std; + +int main () { + int n; string s; + cin >> n >> s; + int ans = 0; + for (; ans < n && s[ans] == '1'; ans++); + if (ans == n) cout << ans << endl; + else cout << ans + 1 << endl; + return 0; +} + diff --git a/assets/ipl/solutions/18sp/cf/cf465b.cpp b/assets/ipl/solutions/18sp/cf/cf465b.cpp index 12b97ee..69da2ac 100644 --- a/assets/ipl/solutions/18sp/cf/cf465b.cpp +++ b/assets/ipl/solutions/18sp/cf/cf465b.cpp @@ -1,24 +1,24 @@ -#include - -using namespace std; - -int main () { - int n; - cin >> n; - bool nonzero = false; - int nonzero_cnt = 0, seg_cnt = 0; - while (n--) { - int x; cin >> x; - if (x) { - if (nonzero == false) seg_cnt ++; - nonzero = true; - nonzero_cnt ++; - } else { - nonzero = false; - } - } - if (seg_cnt == 0) cout << 0 << endl; - else cout << nonzero_cnt + seg_cnt - 1 << endl; - return 0; -} - +#include + +using namespace std; + +int main () { + int n; + cin >> n; + bool nonzero = false; + int nonzero_cnt = 0, seg_cnt = 0; + while (n--) { + int x; cin >> x; + if (x) { + if (nonzero == false) seg_cnt ++; + nonzero = true; + nonzero_cnt ++; + } else { + nonzero = false; + } + } + if (seg_cnt == 0) cout << 0 << endl; + else cout << nonzero_cnt + seg_cnt - 1 << endl; + return 0; +} + diff --git a/assets/ipl/solutions/18sp/cf/cf465d.cpp b/assets/ipl/solutions/18sp/cf/cf465d.cpp index 8ab93de..1dcb960 100644 --- a/assets/ipl/solutions/18sp/cf/cf465d.cpp +++ b/assets/ipl/solutions/18sp/cf/cf465d.cpp @@ -1,64 +1,64 @@ -#include -#include -#include -#define LL long long - -using namespace std; - -int a[8][3], b[8][3]; - -LL sq_dist (int i, int j) { - return (LL)(b[i][0] - b[j][0]) * (b[i][0] - b[j][0]) + - (LL)(b[i][1] - b[j][1]) * (b[i][1] - b[j][1]) + - (LL)(b[i][2] - b[j][2]) * (b[i][2] - b[j][2]); -} - -bool is_cube () { - for (int i = 0; i < 8; i++) { - vector ds; - for (int j = 0; j < 8; j++) if (i!=j) { - ds.push_back(sq_dist(i, j)); - } - sort(ds.begin(), ds.end()); - if (ds[0] && ds[2] == ds[0] && ds[3] == 2*ds[0] && ds[5] == 2*ds[0] && ds[6] == 3*ds[0]) continue; - return false; - } - return true; -} - -void permute (int id, int how) { - if (how == 0) { b[id][0] = a[id][0]; b[id][1] = a[id][1]; b[id][2] = a[id][2]; } - if (how == 1) { b[id][0] = a[id][0]; b[id][1] = a[id][2]; b[id][2] = a[id][1]; } - if (how == 2) { b[id][0] = a[id][1]; b[id][1] = a[id][0]; b[id][2] = a[id][2]; } - if (how == 3) { b[id][0] = a[id][1]; b[id][1] = a[id][2]; b[id][2] = a[id][0]; } - if (how == 4) { b[id][0] = a[id][2]; b[id][1] = a[id][0]; b[id][2] = a[id][1]; } - if (how == 5) { b[id][0] = a[id][2]; b[id][1] = a[id][1]; b[id][2] = a[id][0]; } -} - -bool dfs_permute (int id) { - if (id == 8) return is_cube(); - for (int how = 0; how < 6; how++) { - permute(id, how); - if (dfs_permute(id+1)) return true; - } - return false; -} - -int main () { - for (int id = 0; id < 8; id++) { - for (int j = 0; j < 3; j++) { - cin >> a[id][j]; - } - } - if (dfs_permute(0)) { - cout << "YES" << endl; - for (int id = 0; id < 8; id++) { - for (int j = 0; j < 3; j++) { - cout << b[id][j] << ' '; - } - cout << endl; - } - } else { cout << "NO" << endl; } - return 0; -} - +#include +#include +#include +#define LL long long + +using namespace std; + +int a[8][3], b[8][3]; + +LL sq_dist (int i, int j) { + return (LL)(b[i][0] - b[j][0]) * (b[i][0] - b[j][0]) + + (LL)(b[i][1] - b[j][1]) * (b[i][1] - b[j][1]) + + (LL)(b[i][2] - b[j][2]) * (b[i][2] - b[j][2]); +} + +bool is_cube () { + for (int i = 0; i < 8; i++) { + vector ds; + for (int j = 0; j < 8; j++) if (i!=j) { + ds.push_back(sq_dist(i, j)); + } + sort(ds.begin(), ds.end()); + if (ds[0] && ds[2] == ds[0] && ds[3] == 2*ds[0] && ds[5] == 2*ds[0] && ds[6] == 3*ds[0]) continue; + return false; + } + return true; +} + +void permute (int id, int how) { + if (how == 0) { b[id][0] = a[id][0]; b[id][1] = a[id][1]; b[id][2] = a[id][2]; } + if (how == 1) { b[id][0] = a[id][0]; b[id][1] = a[id][2]; b[id][2] = a[id][1]; } + if (how == 2) { b[id][0] = a[id][1]; b[id][1] = a[id][0]; b[id][2] = a[id][2]; } + if (how == 3) { b[id][0] = a[id][1]; b[id][1] = a[id][2]; b[id][2] = a[id][0]; } + if (how == 4) { b[id][0] = a[id][2]; b[id][1] = a[id][0]; b[id][2] = a[id][1]; } + if (how == 5) { b[id][0] = a[id][2]; b[id][1] = a[id][1]; b[id][2] = a[id][0]; } +} + +bool dfs_permute (int id) { + if (id == 8) return is_cube(); + for (int how = 0; how < 6; how++) { + permute(id, how); + if (dfs_permute(id+1)) return true; + } + return false; +} + +int main () { + for (int id = 0; id < 8; id++) { + for (int j = 0; j < 3; j++) { + cin >> a[id][j]; + } + } + if (dfs_permute(0)) { + cout << "YES" << endl; + for (int id = 0; id < 8; id++) { + for (int j = 0; j < 3; j++) { + cout << b[id][j] << ' '; + } + cout << endl; + } + } else { cout << "NO" << endl; } + return 0; +} + diff --git a/assets/ipl/solutions/18sp/cf/cf465e.cpp b/assets/ipl/solutions/18sp/cf/cf465e.cpp index ca3d687..6cb6047 100644 --- a/assets/ipl/solutions/18sp/cf/cf465e.cpp +++ b/assets/ipl/solutions/18sp/cf/cf465e.cpp @@ -1,54 +1,54 @@ -#include -#include -#include -#include -#include - -using namespace std; - -#define LL long long -#define MOD 1000000007 -LL pow10_mod (int e) { - LL base = 10, ans = 1; - while (e) { - if (e & 1) ans = (ans * base) % MOD; - base = (base * base) % MOD; - e >>= 1; - } - return ans; -} - -char s[100001]; - -int main () { - int n; - scanf("%s %d\n", s, &n); - string t(s); - stack > rules; - rules.push({'9'+1, t}); - for (int i = 0; i < n; i++) { - char d; - scanf("%c->", &d); - cin.getline(s, 100001); - string t(s); - rules.push({d, t}); - } - int digs[11], rem[11]; - for (int i = 0; i < 10; i++) { digs[i] = 1; rem[i] = i; } - while (!rules.empty()) { - auto p = rules.top(); rules.pop(); - int c = p.first - '0'; string t = p.second; - int r = 0, cnt = 0; - for (char tt : t) { - r = (int)((r * pow10_mod(digs[tt - '0']) + rem[tt - '0']) % MOD); - cnt = (cnt + digs[tt - '0']) % (MOD - 1); // Fermat's Little Theorem - } - rem[c] = r; - digs[c] = cnt; - } - cout << rem[10] << endl; - - return 0; -} - - +#include +#include +#include +#include +#include + +using namespace std; + +#define LL long long +#define MOD 1000000007 +LL pow10_mod (int e) { + LL base = 10, ans = 1; + while (e) { + if (e & 1) ans = (ans * base) % MOD; + base = (base * base) % MOD; + e >>= 1; + } + return ans; +} + +char s[100001]; + +int main () { + int n; + scanf("%s %d\n", s, &n); + string t(s); + stack > rules; + rules.push({'9'+1, t}); + for (int i = 0; i < n; i++) { + char d; + scanf("%c->", &d); + cin.getline(s, 100001); + string t(s); + rules.push({d, t}); + } + int digs[11], rem[11]; + for (int i = 0; i < 10; i++) { digs[i] = 1; rem[i] = i; } + while (!rules.empty()) { + auto p = rules.top(); rules.pop(); + int c = p.first - '0'; string t = p.second; + int r = 0, cnt = 0; + for (char tt : t) { + r = (int)((r * pow10_mod(digs[tt - '0']) + rem[tt - '0']) % MOD); + cnt = (cnt + digs[tt - '0']) % (MOD - 1); // Fermat's Little Theorem + } + rem[c] = r; + digs[c] = cnt; + } + cout << rem[10] << endl; + + return 0; +} + + diff --git a/assets/ipl/solutions/18sp/cf/cf466a.cpp b/assets/ipl/solutions/18sp/cf/cf466a.cpp index 81d1954..e3b28d1 100644 --- a/assets/ipl/solutions/18sp/cf/cf466a.cpp +++ b/assets/ipl/solutions/18sp/cf/cf466a.cpp @@ -1,14 +1,14 @@ -#include - -using namespace std; - -int main () { - int n, m, a, b; - cin >> n >> m >> a >> b; - int ans1 = (n / m) * b + (n % m) * a; // mixed - int ans2 = ((n + m - 1) / m) * b; // all multiple - int ans3 = n * a; // all single - cout << min(min(ans1, ans2), ans3) << endl; - return 0; -} - +#include + +using namespace std; + +int main () { + int n, m, a, b; + cin >> n >> m >> a >> b; + int ans1 = (n / m) * b + (n % m) * a; // mixed + int ans2 = ((n + m - 1) / m) * b; // all multiple + int ans3 = n * a; // all single + cout << min(min(ans1, ans2), ans3) << endl; + return 0; +} + diff --git a/assets/ipl/solutions/18sp/cf/cf466c.cpp b/assets/ipl/solutions/18sp/cf/cf466c.cpp index fc18b5e..dd215a3 100644 --- a/assets/ipl/solutions/18sp/cf/cf466c.cpp +++ b/assets/ipl/solutions/18sp/cf/cf466c.cpp @@ -1,34 +1,34 @@ -#include -#include -#define LL long long - -using namespace std; - -int main () { - int n; - cin >> n; - vector a(n); - LL sum = 0; - for (int i = 0; i < n; i++) { - cin >> a[i]; - sum += a[i]; - } - vector pts; - int cnt1 = 0, cnt2 = 0; - LL acc = 0; - for (int i = 0; i < n-1; i++) { - acc += a[i]; - // this order is critical because we don't want i=j - if (3 * acc == 2 * sum) { pts.push_back(2); cnt2++; } - if (3 * acc == sum) { pts.push_back(1); cnt1++; } - } - LL ans = 0; - for (int p : pts) { - if (p == 1) ans += cnt2; - else cnt2--; - } - cout << ans << endl; - - return 0; -} - +#include +#include +#define LL long long + +using namespace std; + +int main () { + int n; + cin >> n; + vector a(n); + LL sum = 0; + for (int i = 0; i < n; i++) { + cin >> a[i]; + sum += a[i]; + } + vector pts; + int cnt1 = 0, cnt2 = 0; + LL acc = 0; + for (int i = 0; i < n-1; i++) { + acc += a[i]; + // this order is critical because we don't want i=j + if (3 * acc == 2 * sum) { pts.push_back(2); cnt2++; } + if (3 * acc == sum) { pts.push_back(1); cnt1++; } + } + LL ans = 0; + for (int p : pts) { + if (p == 1) ans += cnt2; + else cnt2--; + } + cout << ans << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/18sp/cf/cf467b.cpp b/assets/ipl/solutions/18sp/cf/cf467b.cpp index 8c9e03c..3b2ac8e 100644 --- a/assets/ipl/solutions/18sp/cf/cf467b.cpp +++ b/assets/ipl/solutions/18sp/cf/cf467b.cpp @@ -1,27 +1,27 @@ -#include -#include - -using namespace std; - -int diff (int p, int q) { - int cnt = 0; - while (p || q) { - if ((p & 1) != (q & 1)) cnt++; - p >>= 1; q >>= 1; - } - return cnt; -} - -int main () { - int n, m, k; - cin >> n >> m >> k; - vector a(m+1); - for (int i = 0; i <= m; i++) cin >> a[i]; - int ans = 0; - for (int i = 0; i < m; i++) { - if (diff(a[i], a[m]) <= k) ans++; - } - cout << ans << endl; - return 0; -} - +#include +#include + +using namespace std; + +int diff (int p, int q) { + int cnt = 0; + while (p || q) { + if ((p & 1) != (q & 1)) cnt++; + p >>= 1; q >>= 1; + } + return cnt; +} + +int main () { + int n, m, k; + cin >> n >> m >> k; + vector a(m+1); + for (int i = 0; i <= m; i++) cin >> a[i]; + int ans = 0; + for (int i = 0; i < m; i++) { + if (diff(a[i], a[m]) <= k) ans++; + } + cout << ans << endl; + return 0; +} + diff --git a/assets/ipl/solutions/18sp/cf/cf551a.cpp b/assets/ipl/solutions/18sp/cf/cf551a.cpp index 5de528d..722bebc 100644 --- a/assets/ipl/solutions/18sp/cf/cf551a.cpp +++ b/assets/ipl/solutions/18sp/cf/cf551a.cpp @@ -1,29 +1,29 @@ -#include -#include -#include -#include - -using namespace std; - -int main () { - int n; - cin >> n; - vector > a(n); - for (int i = 0; i < n; i ++) { - cin >> a[i].first; - a[i].second = i; - } - sort(a.begin(), a.end(), greater >()); - vector rank(n); - for (int i = 0; i < n; i ++) { - if (i > 0 && a[i-1].first == a[i].first) rank[a[i].second] = rank[a[i-1].second]; - else rank[a[i].second] = i + 1; - } - for (int i = 0; i < n; i ++) { - cout << rank[i] << ' '; - } - cout << endl; - - return 0; -} - +#include +#include +#include +#include + +using namespace std; + +int main () { + int n; + cin >> n; + vector > a(n); + for (int i = 0; i < n; i ++) { + cin >> a[i].first; + a[i].second = i; + } + sort(a.begin(), a.end(), greater >()); + vector rank(n); + for (int i = 0; i < n; i ++) { + if (i > 0 && a[i-1].first == a[i].first) rank[a[i].second] = rank[a[i-1].second]; + else rank[a[i].second] = i + 1; + } + for (int i = 0; i < n; i ++) { + cout << rank[i] << ' '; + } + cout << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/18sp/cf/cf598a.cpp b/assets/ipl/solutions/18sp/cf/cf598a.cpp index e9461e3..47d733b 100644 --- a/assets/ipl/solutions/18sp/cf/cf598a.cpp +++ b/assets/ipl/solutions/18sp/cf/cf598a.cpp @@ -1,19 +1,19 @@ -#include - -using namespace std; - -int main() { - int t; - cin >> t; - while (t--) { - int n; - cin >> n; - long long ans = (long long) n * (n+1) / 2; - int max_pow_2 = 1; - while (max_pow_2 * 2 <= n) max_pow_2 *= 2; - ans -= (max_pow_2 * 2 - 1) * 2; - cout << ans << endl; - } - return 0; -} - +#include + +using namespace std; + +int main() { + int t; + cin >> t; + while (t--) { + int n; + cin >> n; + long long ans = (long long) n * (n+1) / 2; + int max_pow_2 = 1; + while (max_pow_2 * 2 <= n) max_pow_2 *= 2; + ans -= (max_pow_2 * 2 - 1) * 2; + cout << ans << endl; + } + return 0; +} + diff --git a/assets/ipl/solutions/18sp/cf/cf658A.py b/assets/ipl/solutions/18sp/cf/cf658A.py index fa6002b..d01c9ce 100644 --- a/assets/ipl/solutions/18sp/cf/cf658A.py +++ b/assets/ipl/solutions/18sp/cf/cf658A.py @@ -1,14 +1,14 @@ -# example input "6 2 -5" -# input(): read the line "6 2 -5" -# split(): split the line by spaces into list ["6", "2", "-5"] -# [int(s) ... ]: list comprehension, convert the strings to integers -# ["6", "2", "-5"] => [6, 2, -5] -# n, a, b = [6, 2, -5]: unpack the list and assign values to the variables -n, a, b = [int(s) for s in input().split()] - -# it is more convinient to deal with indices starting with 0 -r = (a - 1 + b) % n -if r < 0: - r += n -# add 1 back so the indices start with 1 -print(r + 1) +# example input "6 2 -5" +# input(): read the line "6 2 -5" +# split(): split the line by spaces into list ["6", "2", "-5"] +# [int(s) ... ]: list comprehension, convert the strings to integers +# ["6", "2", "-5"] => [6, 2, -5] +# n, a, b = [6, 2, -5]: unpack the list and assign values to the variables +n, a, b = [int(s) for s in input().split()] + +# it is more convinient to deal with indices starting with 0 +r = (a - 1 + b) % n +if r < 0: + r += n +# add 1 back so the indices start with 1 +print(r + 1) diff --git a/assets/ipl/solutions/18sp/cf/cf672A.py b/assets/ipl/solutions/18sp/cf/cf672A.py index 9d153c5..1560cb9 100644 --- a/assets/ipl/solutions/18sp/cf/cf672A.py +++ b/assets/ipl/solutions/18sp/cf/cf672A.py @@ -1,10 +1,10 @@ -# read the integer n, note indices start with 0 in python -n = int(input()) - 1 -# generate a list with 500 strings ["1", "2", "3", ..., "500"] -v = [str(i) for i in range(1, 500)] -# concatenate all the strings together and we get "1234567891011..." -s = ''.join(v) -print(s[n]) - -# one line solution -#print(''.join([str(i) for i in range(1, 500)])[int(input()) - 1]) +# read the integer n, note indices start with 0 in python +n = int(input()) - 1 +# generate a list with 500 strings ["1", "2", "3", ..., "500"] +v = [str(i) for i in range(1, 500)] +# concatenate all the strings together and we get "1234567891011..." +s = ''.join(v) +print(s[n]) + +# one line solution +#print(''.join([str(i) for i in range(1, 500)])[int(input()) - 1]) diff --git a/assets/ipl/solutions/18sp/cf/cf686A.py b/assets/ipl/solutions/18sp/cf/cf686A.py index 510a075..f343167 100644 --- a/assets/ipl/solutions/18sp/cf/cf686A.py +++ b/assets/ipl/solutions/18sp/cf/cf686A.py @@ -1,16 +1,16 @@ -# read n, x -n, x = [int(s) for s in input().split()] - -# number of sad kids -m = 0 -for i in range(n): - a, d = input().split() - d = int(d) - if a == '+': - x += d - elif x >= d: - x -= d - else: - m += 1 - -print(x, m) +# read n, x +n, x = [int(s) for s in input().split()] + +# number of sad kids +m = 0 +for i in range(n): + a, d = input().split() + d = int(d) + if a == '+': + x += d + elif x >= d: + x -= d + else: + m += 1 + +print(x, m) diff --git a/assets/ipl/solutions/18sp/cf/cf844a.cpp b/assets/ipl/solutions/18sp/cf/cf844a.cpp index c4d525f..8abe1ad 100644 --- a/assets/ipl/solutions/18sp/cf/cf844a.cpp +++ b/assets/ipl/solutions/18sp/cf/cf844a.cpp @@ -1,20 +1,20 @@ -#include -#include - -using namespace std; - -int main () { - string s; - int k; - cin >> s >> k; - bool exist[26]; - for (int i = 0; i < 26; i ++) exist[i] = false; - for (char c : s) exist[c - 'a'] = true; - int cnt = 0; - for (int i = 0; i < 26; i ++) cnt += exist[i]; - if (cnt >= k) cout << 0 << endl; - else if (k <= s.length()) cout << k - cnt << endl; - else cout << "impossible" << endl; - return 0; -} - +#include +#include + +using namespace std; + +int main () { + string s; + int k; + cin >> s >> k; + bool exist[26]; + for (int i = 0; i < 26; i ++) exist[i] = false; + for (char c : s) exist[c - 'a'] = true; + int cnt = 0; + for (int i = 0; i < 26; i ++) cnt += exist[i]; + if (cnt >= k) cout << 0 << endl; + else if (k <= s.length()) cout << k - cnt << endl; + else cout << "impossible" << endl; + return 0; +} + diff --git a/assets/ipl/solutions/18sp/cf/cf845d.cpp b/assets/ipl/solutions/18sp/cf/cf845d.cpp index 72ef951..0a7f2d6 100644 --- a/assets/ipl/solutions/18sp/cf/cf845d.cpp +++ b/assets/ipl/solutions/18sp/cf/cf845d.cpp @@ -1,51 +1,51 @@ -#include -#include - -using namespace std; - -int main () { - int n; - cin >> n; - int speed; - int ignore = 0; - stack speed_limits; - int overtake_limits = 0; - while (n--) { - int t; - cin >> t; - switch (t) { - case 1: - cin >> speed; - while (!speed_limits.empty() && speed > speed_limits.top()) { - speed_limits.pop(); - ignore ++; - } - break; - case 2: - ignore += overtake_limits; - overtake_limits = 0; - break; - case 3: - int speed_limit; - cin >> speed_limit; - speed_limits.push(speed_limit); - while (!speed_limits.empty() && speed > speed_limits.top()) { - speed_limits.pop(); - ignore ++; - } - break; - case 4: - overtake_limits = 0; - break; - case 5: - while (!speed_limits.empty()) speed_limits.pop(); - break; - case 6: - overtake_limits ++; - break; - } - } - cout << ignore << endl; - return 0; -} - +#include +#include + +using namespace std; + +int main () { + int n; + cin >> n; + int speed; + int ignore = 0; + stack speed_limits; + int overtake_limits = 0; + while (n--) { + int t; + cin >> t; + switch (t) { + case 1: + cin >> speed; + while (!speed_limits.empty() && speed > speed_limits.top()) { + speed_limits.pop(); + ignore ++; + } + break; + case 2: + ignore += overtake_limits; + overtake_limits = 0; + break; + case 3: + int speed_limit; + cin >> speed_limit; + speed_limits.push(speed_limit); + while (!speed_limits.empty() && speed > speed_limits.top()) { + speed_limits.pop(); + ignore ++; + } + break; + case 4: + overtake_limits = 0; + break; + case 5: + while (!speed_limits.empty()) speed_limits.pop(); + break; + case 6: + overtake_limits ++; + break; + } + } + cout << ignore << endl; + return 0; +} + diff --git a/assets/ipl/solutions/18sp/cf/cf939a.cpp b/assets/ipl/solutions/18sp/cf/cf939a.cpp index 85ceec0..ba23b84 100644 --- a/assets/ipl/solutions/18sp/cf/cf939a.cpp +++ b/assets/ipl/solutions/18sp/cf/cf939a.cpp @@ -1,15 +1,15 @@ -#include -#include - -using namespace std; - -int main () { - int n; - cin >> n; - vector a(n+1); - for (int i = 1; i <= n; i ++) cin >> a[i]; - for (int i = 1; i <= n; i ++) if (a[a[a[i]]] == i) { cout << "YES" << endl; return 0; } - cout << "NO" << endl; - return 0; -} - +#include +#include + +using namespace std; + +int main () { + int n; + cin >> n; + vector a(n+1); + for (int i = 1; i <= n; i ++) cin >> a[i]; + for (int i = 1; i <= n; i ++) if (a[a[a[i]]] == i) { cout << "YES" << endl; return 0; } + cout << "NO" << endl; + return 0; +} + diff --git a/assets/ipl/solutions/18sp/cf/cf939c.cpp b/assets/ipl/solutions/18sp/cf/cf939c.cpp index e05bd7b..1ce5570 100644 --- a/assets/ipl/solutions/18sp/cf/cf939c.cpp +++ b/assets/ipl/solutions/18sp/cf/cf939c.cpp @@ -1,27 +1,27 @@ -#include -#include - -using namespace std; - -int main () { - int n; - cin >> n; - vector a(n); - for (int i = 0; i < n; i++) cin >> a[i]; - int s, f; - cin >> s >> f; - int ans = 0; - int real_ans = n; - int sum = 0, best = 0; - for (int i = 0; i < f-s; i++) sum += a[i]; - for (int pos = 0; pos < n; pos++) { - sum -= a[pos]; sum += a[(pos + (f-s)) % n]; - if (sum > best) { best = sum; ans = pos + 1; real_ans = (s - ans + n - 1) % n + 1; } - else if (sum == best) { int new_real_ans = (s - (pos + 1) + n - 1) % n + 1; if (new_real_ans < real_ans) { real_ans = new_real_ans; ans = pos + 1; }} - } - // in time zone ans+1 the start time is s - cout << real_ans << endl; - - return 0; -} - +#include +#include + +using namespace std; + +int main () { + int n; + cin >> n; + vector a(n); + for (int i = 0; i < n; i++) cin >> a[i]; + int s, f; + cin >> s >> f; + int ans = 0; + int real_ans = n; + int sum = 0, best = 0; + for (int i = 0; i < f-s; i++) sum += a[i]; + for (int pos = 0; pos < n; pos++) { + sum -= a[pos]; sum += a[(pos + (f-s)) % n]; + if (sum > best) { best = sum; ans = pos + 1; real_ans = (s - ans + n - 1) % n + 1; } + else if (sum == best) { int new_real_ans = (s - (pos + 1) + n - 1) % n + 1; if (new_real_ans < real_ans) { real_ans = new_real_ans; ans = pos + 1; }} + } + // in time zone ans+1 the start time is s + cout << real_ans << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/18sp/cf/cf939d.cpp b/assets/ipl/solutions/18sp/cf/cf939d.cpp index faa256a..258c115 100644 --- a/assets/ipl/solutions/18sp/cf/cf939d.cpp +++ b/assets/ipl/solutions/18sp/cf/cf939d.cpp @@ -1,40 +1,40 @@ -#include -#include -#include - -using namespace std; - -int main () { - int n; cin >> n; - string s, t; - cin >> s >> t; - bool a[26][26]; - for (int i = 0; i < 26; i++) for (int j = 0; j < 26; j++) a[i][j] = 0; - for (int i = 0; i < s.length(); i++) { - a[s[i] - 'a'][t[i] - 'a'] = a[t[i] - 'a'][s[i] - 'a'] = 1; - } - bool vis[26]; - for (int i = 0; i < 26; i++) vis[i] = 0; - vector > ans; - for (int i = 0; i < 26; i++) { - if (!vis[i]) { - vector rea; - queue q; q.push(i); vis[i] = 1; - while (!q.empty()) { - int u = q.front(); q.pop(); - for (int v = 0; v < 26; v++) if (a[u][v] && !vis[v]) { - vis[v] = 1; - q.push(v); - rea.push_back(v); - } - } - for (int v : rea) ans.push_back({i, v}); - } - } - cout << ans.size() << endl; - for (auto p : ans) { - cout << char('a' + p.first) << ' ' << char('a' + p.second) << endl; - } - return 0; -} - +#include +#include +#include + +using namespace std; + +int main () { + int n; cin >> n; + string s, t; + cin >> s >> t; + bool a[26][26]; + for (int i = 0; i < 26; i++) for (int j = 0; j < 26; j++) a[i][j] = 0; + for (int i = 0; i < s.length(); i++) { + a[s[i] - 'a'][t[i] - 'a'] = a[t[i] - 'a'][s[i] - 'a'] = 1; + } + bool vis[26]; + for (int i = 0; i < 26; i++) vis[i] = 0; + vector > ans; + for (int i = 0; i < 26; i++) { + if (!vis[i]) { + vector rea; + queue q; q.push(i); vis[i] = 1; + while (!q.empty()) { + int u = q.front(); q.pop(); + for (int v = 0; v < 26; v++) if (a[u][v] && !vis[v]) { + vis[v] = 1; + q.push(v); + rea.push_back(v); + } + } + for (int v : rea) ans.push_back({i, v}); + } + } + cout << ans.size() << endl; + for (auto p : ans) { + cout << char('a' + p.first) << ' ' << char('a' + p.second) << endl; + } + return 0; +} + diff --git a/assets/ipl/solutions/18sp/cf/cf939e.cpp b/assets/ipl/solutions/18sp/cf/cf939e.cpp index 5538c37..9473f9f 100644 --- a/assets/ipl/solutions/18sp/cf/cf939e.cpp +++ b/assets/ipl/solutions/18sp/cf/cf939e.cpp @@ -1,32 +1,32 @@ -#include -#include -#include -#include -#define LL long long - -using namespace std; - -int main () { - int q; - cin >> q; - vector a; - int cnt = 0; LL sum = 0; - while (q--) { - int t; scanf("%d", &t); - if (t == 1) { - int x; scanf("%d", &x); - while (cnt < a.size()) { - if ((sum + x) > (LL)a[cnt] * (cnt + 1)) { - sum += a[cnt++]; - } else break; - } - a.push_back(x); - } else { - printf("%.8lf\n", a[a.size()-1] - (double) (sum + a[a.size()-1]) / (cnt + 1)); - } - } - - - return 0; -} - +#include +#include +#include +#include +#define LL long long + +using namespace std; + +int main () { + int q; + cin >> q; + vector a; + int cnt = 0; LL sum = 0; + while (q--) { + int t; scanf("%d", &t); + if (t == 1) { + int x; scanf("%d", &x); + while (cnt < a.size()) { + if ((sum + x) > (LL)a[cnt] * (cnt + 1)) { + sum += a[cnt++]; + } else break; + } + a.push_back(x); + } else { + printf("%.8lf\n", a[a.size()-1] - (double) (sum + a[a.size()-1]) / (cnt + 1)); + } + } + + + return 0; +} + diff --git a/assets/ipl/solutions/18sp/codechef/flipcoin.cpp b/assets/ipl/solutions/18sp/codechef/flipcoin.cpp index 8a613d8..1134b8e 100644 --- a/assets/ipl/solutions/18sp/codechef/flipcoin.cpp +++ b/assets/ipl/solutions/18sp/codechef/flipcoin.cpp @@ -1,69 +1,69 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -const int maxN = 1e5 + 10; - -int t[4 * maxN], g[4 * maxN], n, q; - -int get_head(int k, int l, int r) { - return (g[k] ? (r - l + 1) - t[k] : t[k]); -} - -void lazy_update(int k, int l, int r) { - if (l != r) { - g[k * 2] ^= g[k]; - g[k * 2 + 1] ^= g[k]; - g[k] = 0; - int mid = (l + r) >> 1; - t[k] = get_head(k * 2, l, mid) + - get_head(k * 2 + 1, mid + 1, r); - return; - } - t[k] = g[k] ^ t[k]; - g[k] = 0; -} - -void update(int k, int l, int r, int i, int j) { - if (j < l || r < i) return; - lazy_update(k, l, r); - if (i <= l && r <= j) { - g[k] ^= 1; - return; - } - int mid = (l + r) >> 1; - update(k * 2, l, mid, i, j); - update(k * 2 + 1, mid + 1, r, i, j); - t[k] = get_head(k * 2, l, mid) + - get_head(k * 2 + 1, mid + 1, r); -} - -int get(int k, int l, int r, int i, int j) { - if (j < l || r < i) return 0; - lazy_update(k, l, r); - if (i <= l && r <= j) return t[k]; - int mid = (l + r) >> 1; - return get(k * 2, l, mid, i, j) + - get(k * 2 + 1, mid + 1, r, i, j); -} - -int main() { - cin >> n >> q; - for (int i = 0; i < q; ++i) { - int t, l, r; - cin >> t >> l >> r; - ++l; ++r; - if (t == 0) - update(1, 1, n, l, r); - else - cout << get(1, 1, n, l, r) << endl; - } -} +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +const int maxN = 1e5 + 10; + +int t[4 * maxN], g[4 * maxN], n, q; + +int get_head(int k, int l, int r) { + return (g[k] ? (r - l + 1) - t[k] : t[k]); +} + +void lazy_update(int k, int l, int r) { + if (l != r) { + g[k * 2] ^= g[k]; + g[k * 2 + 1] ^= g[k]; + g[k] = 0; + int mid = (l + r) >> 1; + t[k] = get_head(k * 2, l, mid) + + get_head(k * 2 + 1, mid + 1, r); + return; + } + t[k] = g[k] ^ t[k]; + g[k] = 0; +} + +void update(int k, int l, int r, int i, int j) { + if (j < l || r < i) return; + lazy_update(k, l, r); + if (i <= l && r <= j) { + g[k] ^= 1; + return; + } + int mid = (l + r) >> 1; + update(k * 2, l, mid, i, j); + update(k * 2 + 1, mid + 1, r, i, j); + t[k] = get_head(k * 2, l, mid) + + get_head(k * 2 + 1, mid + 1, r); +} + +int get(int k, int l, int r, int i, int j) { + if (j < l || r < i) return 0; + lazy_update(k, l, r); + if (i <= l && r <= j) return t[k]; + int mid = (l + r) >> 1; + return get(k * 2, l, mid, i, j) + + get(k * 2 + 1, mid + 1, r, i, j); +} + +int main() { + cin >> n >> q; + for (int i = 0; i < q; ++i) { + int t, l, r; + cin >> t >> l >> r; + ++l; ++r; + if (t == 0) + update(1, 1, n, l, r); + else + cout << get(1, 1, n, l, r) << endl; + } +} diff --git a/assets/ipl/solutions/18sp/solution/solution-s3c1.md b/assets/ipl/solutions/18sp/solution/solution-s3c1.md index f08fbfb..3430326 100644 --- a/assets/ipl/solutions/18sp/solution/solution-s3c1.md +++ b/assets/ipl/solutions/18sp/solution/solution-s3c1.md @@ -1,33 +1,33 @@ -A - Relational Operator - -Check if the two numbers satisfy either of the three relations, and print the corresponding operator as string. - - -B1 - Division of Nlogonia - -Be sure to correctly cover all cases. - - -B2 - Diversity - -Count the number of different chars in the original string. If the count already exceeds k, then no change is need. Otherwise, we can change (k - count) chars if k does not exceed the length of the string. Otherwise it's impossible. - - -C - GukiZ and Contest - -The problem reduces to finding the rank of each number in an array. Given the small input range, one of the easiest way is to use counting sort. You may also keep record of the original location of each number, sort them, and then assign ranks. - - -D - Driving Test - -Let's notice that you should never say that you didn't notice signs "no speed limit" and "overtake is allowed". Also if you drive with speed sp, you don't want to remove signs "speed limit" with number greater or equal to sp. - -Thus, greedy solution will work. Process all the events in chronological order. We should maintain stack of signs "speed limit" and amount of signs "no overtake allowed". - -If we meet sign "speed limit", we push its limit to stack, sign "no overtake allowed" — increase cnt, "no speed limit" — clear stack, "overtake is allowed" — assign cnt to zero. After every event we should check if our speed is fine. While value of sign on the top of the stack is less than current speed, pop it and increase answer. If we overtake someone, we add cnt to answer and assign cnt to zero. - - -E - Pashmak and Buses - -The bus numbers over d days for a specific student form a sequence of base k and length d. Your construction would suffice if all sequences are distinct. This is possible iff n<=k^d. Pick the first n numbers of base k and length d to form the construction. - +A - Relational Operator + +Check if the two numbers satisfy either of the three relations, and print the corresponding operator as string. + + +B1 - Division of Nlogonia + +Be sure to correctly cover all cases. + + +B2 - Diversity + +Count the number of different chars in the original string. If the count already exceeds k, then no change is need. Otherwise, we can change (k - count) chars if k does not exceed the length of the string. Otherwise it's impossible. + + +C - GukiZ and Contest + +The problem reduces to finding the rank of each number in an array. Given the small input range, one of the easiest way is to use counting sort. You may also keep record of the original location of each number, sort them, and then assign ranks. + + +D - Driving Test + +Let's notice that you should never say that you didn't notice signs "no speed limit" and "overtake is allowed". Also if you drive with speed sp, you don't want to remove signs "speed limit" with number greater or equal to sp. + +Thus, greedy solution will work. Process all the events in chronological order. We should maintain stack of signs "speed limit" and amount of signs "no overtake allowed". + +If we meet sign "speed limit", we push its limit to stack, sign "no overtake allowed" — increase cnt, "no speed limit" — clear stack, "overtake is allowed" — assign cnt to zero. After every event we should check if our speed is fine. While value of sign on the top of the stack is less than current speed, pop it and increase answer. If we overtake someone, we add cnt to answer and assign cnt to zero. + + +E - Pashmak and Buses + +The bus numbers over d days for a specific student form a sequence of base k and length d. Your construction would suffice if all sequences are distinct. This is possible iff n<=k^d. Pick the first n numbers of base k and length d to form the construction. + diff --git a/assets/ipl/solutions/18sp/solution/solution-s3c2.md b/assets/ipl/solutions/18sp/solution/solution-s3c2.md index 62cba22..e38797b 100644 --- a/assets/ipl/solutions/18sp/solution/solution-s3c2.md +++ b/assets/ipl/solutions/18sp/solution/solution-s3c2.md @@ -1,24 +1,24 @@ -A - Jolly Jumpers - -Take difference between all adjacent pairs and check if 1~(n-1) all exist. - - -B2 - Tricky Sum - -Let m be the largest power of 2 not exceeding n. Answer is 1+...+n - 2*(1+2+4+...+m). - - -C - Coder - -By simple math the answer is (n*n+1)//2. Put on all even diagonals (aka (i+j) mod 2 = 0). - - -D - Party - -Superior relations can be represented by a tree. Note that there can be more than one tree, so this is a forest. In a single tree, employees in the longest path from root to leave must be in distinct groups. So the answer is the max depth among all trees. - - -E - Present - -First note that answer lies in [min{a}, min{a}+m], so we can binary search the answer. For each fixed target minimum height, scan the flowers from left to right: if a flower is below target, then dedicate a day watering a segment starting from it and extend right-ward. Check if total number of days needed does not exceed m. - +A - Jolly Jumpers + +Take difference between all adjacent pairs and check if 1~(n-1) all exist. + + +B2 - Tricky Sum + +Let m be the largest power of 2 not exceeding n. Answer is 1+...+n - 2*(1+2+4+...+m). + + +C - Coder + +By simple math the answer is (n*n+1)//2. Put on all even diagonals (aka (i+j) mod 2 = 0). + + +D - Party + +Superior relations can be represented by a tree. Note that there can be more than one tree, so this is a forest. In a single tree, employees in the longest path from root to leave must be in distinct groups. So the answer is the max depth among all trees. + + +E - Present + +First note that answer lies in [min{a}, min{a}+m], so we can binary search the answer. For each fixed target minimum height, scan the flowers from left to right: if a flower is below target, then dedicate a day watering a segment starting from it and extend right-ward. Check if total number of days needed does not exceed m. + diff --git a/assets/ipl/solutions/18sp/uva/uva10038.cpp b/assets/ipl/solutions/18sp/uva/uva10038.cpp index dbbbe8f..2273b2a 100644 --- a/assets/ipl/solutions/18sp/uva/uva10038.cpp +++ b/assets/ipl/solutions/18sp/uva/uva10038.cpp @@ -1,25 +1,25 @@ -#include - -using namespace std; - -bool a[10000]; - -int main () { - int n; - while (cin >> n) { - int prev = 0; - for (int i = 0; i < n; i ++) a[i] = 0; - for (int i = 0; i < n; i ++) { - int x; - cin >> x; - if (i) a[abs(x - prev)] = true; - prev = x; - } - bool flag = true; - for (int i = 1; i < n; i ++) flag &= a[i]; - if (flag) cout << "Jolly" << endl; - else cout << "Not jolly" << endl; - } - return 0; -} - +#include + +using namespace std; + +bool a[10000]; + +int main () { + int n; + while (cin >> n) { + int prev = 0; + for (int i = 0; i < n; i ++) a[i] = 0; + for (int i = 0; i < n; i ++) { + int x; + cin >> x; + if (i) a[abs(x - prev)] = true; + prev = x; + } + bool flag = true; + for (int i = 1; i < n; i ++) flag &= a[i]; + if (flag) cout << "Jolly" << endl; + else cout << "Not jolly" << endl; + } + return 0; +} + diff --git a/assets/ipl/solutions/18sp/uva/uva11094.cpp b/assets/ipl/solutions/18sp/uva/uva11094.cpp index 202beb6..0bd278b 100644 --- a/assets/ipl/solutions/18sp/uva/uva11094.cpp +++ b/assets/ipl/solutions/18sp/uva/uva11094.cpp @@ -1,49 +1,49 @@ -#include -#include -#include - -using namespace std; - -int n, m; -char c[20][20]; -int x, y; // current coordinate -char land, water = 0; - -// bfs from one cell, mark all reachable cells, and return size -int bfs (int x, int y) { - int cnt = 0; - queue > q; - if (c[x][y] == land) { q.push({x,y}); c[x][y] = water; } - while (!q.empty()) { - pair p = q.front(); q.pop(); cnt++; - int x = p.first, y = p.second; - if (x>0 && c[(x+n-1)%n][y] == land) {c[(x+n-1)%n][y] = water; q.push({(x+n-1)%n,y}); } - if (x +#include +#include + +using namespace std; + +int n, m; +char c[20][20]; +int x, y; // current coordinate +char land, water = 0; + +// bfs from one cell, mark all reachable cells, and return size +int bfs (int x, int y) { + int cnt = 0; + queue > q; + if (c[x][y] == land) { q.push({x,y}); c[x][y] = water; } + while (!q.empty()) { + pair p = q.front(); q.pop(); cnt++; + int x = p.first, y = p.second; + if (x>0 && c[(x+n-1)%n][y] == land) {c[(x+n-1)%n][y] = water; q.push({(x+n-1)%n,y}); } + if (x - -using namespace std; - -int main () { - int t; - cin >> t; - while (t--) { - int a, b; - cin >> a >> b; - if (a < b) { - cout << "<" << endl; - } else if (a == b) { - cout << "=" << endl; - } else { - cout << ">" << endl; - } - } - return 0; -} - +#include + +using namespace std; + +int main () { + int t; + cin >> t; + while (t--) { + int a, b; + cin >> a >> b; + if (a < b) { + cout << "<" << endl; + } else if (a == b) { + cout << "=" << endl; + } else { + cout << ">" << endl; + } + } + return 0; +} + diff --git a/assets/ipl/solutions/18sp/uva/uva11498.cpp b/assets/ipl/solutions/18sp/uva/uva11498.cpp index ed0b1ff..d93b5be 100644 --- a/assets/ipl/solutions/18sp/uva/uva11498.cpp +++ b/assets/ipl/solutions/18sp/uva/uva11498.cpp @@ -1,24 +1,24 @@ -#include - -using namespace std; - -int main () { - int K; - while (1) { - cin >> K; - if (K == 0) break; - int x0, y0; - cin >> x0 >> y0; - while (K--) { - int x, y; - cin >> x >> y; - if (x == x0 || y == y0) cout << "divisa" << endl; - else if (x < x0 && y < y0) cout << "SO" << endl; - else if (x < x0 && y > y0) cout << "NO" << endl; - else if (x > x0 && y < y0) cout << "SE" << endl; - else if (x > x0 && y > y0) cout << "NE" << endl; - } - } - return 0; -} - +#include + +using namespace std; + +int main () { + int K; + while (1) { + cin >> K; + if (K == 0) break; + int x0, y0; + cin >> x0 >> y0; + while (K--) { + int x, y; + cin >> x >> y; + if (x == x0 || y == y0) cout << "divisa" << endl; + else if (x < x0 && y < y0) cout << "SO" << endl; + else if (x < x0 && y > y0) cout << "NO" << endl; + else if (x > x0 && y < y0) cout << "SE" << endl; + else if (x > x0 && y > y0) cout << "NE" << endl; + } + } + return 0; +} + diff --git a/assets/ipl/solutions/18sp/uva/uva11634.cpp b/assets/ipl/solutions/18sp/uva/uva11634.cpp index cd2f06e..c753f4f 100644 --- a/assets/ipl/solutions/18sp/uva/uva11634.cpp +++ b/assets/ipl/solutions/18sp/uva/uva11634.cpp @@ -1,21 +1,21 @@ -#include -#include - -using namespace std; - -int main() { - int n; - while (1) { - cin >> n; - if (!n) break; - set exist; - while (1) { - if (exist.find(n) != exist.end()) break; - exist.insert(n); - n = n * n / 100 % 10000; - } - cout << exist.size() << endl; - } - return 0; -} - +#include +#include + +using namespace std; + +int main() { + int n; + while (1) { + cin >> n; + if (!n) break; + set exist; + while (1) { + if (exist.find(n) != exist.end()) break; + exist.insert(n); + n = n * n / 100 % 10000; + } + cout << exist.size() << endl; + } + return 0; +} + diff --git a/assets/ipl/solutions/18sp/uva/uva11799.cpp b/assets/ipl/solutions/18sp/uva/uva11799.cpp index ac9de11..fa240bb 100644 --- a/assets/ipl/solutions/18sp/uva/uva11799.cpp +++ b/assets/ipl/solutions/18sp/uva/uva11799.cpp @@ -1,17 +1,17 @@ -#include - -using namespace std; - -int main() { - int t; - cin >> t; - for (int i = 1; i <= t; i++) { - int n; - cin >> n; - int maxx = 0; - while (n--) { int x; cin >> x; maxx = max(maxx, x); } - cout << "Case " << i << ": " << maxx << endl; - } - return 0; -} - +#include + +using namespace std; + +int main() { + int t; + cin >> t; + for (int i = 1; i <= t; i++) { + int n; + cin >> n; + int maxx = 0; + while (n--) { int x; cin >> x; maxx = max(maxx, x); } + cout << "Case " << i << ": " << maxx << endl; + } + return 0; +} + diff --git a/assets/ipl/solutions/18sp/uva/uva11875.cpp b/assets/ipl/solutions/18sp/uva/uva11875.cpp index 54689b1..a48af8a 100644 --- a/assets/ipl/solutions/18sp/uva/uva11875.cpp +++ b/assets/ipl/solutions/18sp/uva/uva11875.cpp @@ -1,20 +1,20 @@ -#include -#include -#include - -using namespace std; - -int main () { - int t; - cin >> t; - for (int tt = 1; tt <= t; tt++) { - int n; - cin >> n; - vector a(n); - for (int i = 0; i < n; i++) cin >> a[i]; - sort(a.begin(), a.end()); - cout << "Case " << tt << ": " << a[n/2] << endl; - } - return 0; -} - +#include +#include +#include + +using namespace std; + +int main () { + int t; + cin >> t; + for (int tt = 1; tt <= t; tt++) { + int n; + cin >> n; + vector a(n); + for (int i = 0; i < n; i++) cin >> a[i]; + sort(a.begin(), a.end()); + cout << "Case " << tt << ": " << a[n/2] << endl; + } + return 0; +} + diff --git a/assets/ipl/solutions/19sp/contests/2.11.19/GcdFib.cpp b/assets/ipl/solutions/19sp/contests/2.11.19/GcdFib.cpp index a4791d7..f8923d9 100755 --- a/assets/ipl/solutions/19sp/contests/2.11.19/GcdFib.cpp +++ b/assets/ipl/solutions/19sp/contests/2.11.19/GcdFib.cpp @@ -1,42 +1,42 @@ -#include -using namespace std; - -const int mod = 1e9+7; -long long int a[100000]; - -template -struct Matrix{ - long long int entry[maxn][maxn]; - Matrix(){memset(entry,0,sizeof entry);} - Matrix operator*(const Matrix &rhs) const{ - Matrix res; - for(int i=0;i Fib(Matrix<2> T,long long int x){ - if(x==1) return T; - Matrix<2> ans=Fib(T,x/2); - ans=ans*ans; - if(x%2) ans=ans*T; - return ans; -} -int main(){ - ios_base::sync_with_stdio(0); - cin.tie(0); - int n; - cin>>n; - for(int i=0;i>a[i]; - a[0]=__gcd(a[0],a[i]); - } - Matrix<2> trans; - trans.entry[0][0]=1; - trans.entry[0][1]=1; - trans.entry[1][0]=1; - trans.entry[1][1]=0; - cout< +using namespace std; + +const int mod = 1e9+7; +long long int a[100000]; + +template +struct Matrix{ + long long int entry[maxn][maxn]; + Matrix(){memset(entry,0,sizeof entry);} + Matrix operator*(const Matrix &rhs) const{ + Matrix res; + for(int i=0;i Fib(Matrix<2> T,long long int x){ + if(x==1) return T; + Matrix<2> ans=Fib(T,x/2); + ans=ans*ans; + if(x%2) ans=ans*T; + return ans; +} +int main(){ + ios_base::sync_with_stdio(0); + cin.tie(0); + int n; + cin>>n; + for(int i=0;i>a[i]; + a[0]=__gcd(a[0],a[i]); + } + Matrix<2> trans; + trans.entry[0][0]=1; + trans.entry[0][1]=1; + trans.entry[1][0]=1; + trans.entry[1][1]=0; + cout< - -using namespace std; - -int n, m; // variables to store number of benches, number of additional people - -int a[105]; // array to store input counts for each bench - -/* - * @param possible_minimum our "guess" for the potential minimum amount of people - * on each bench - * @return 1 if possible_minimum is reachable upper bound), otherwise 0 - * implying possible_minimum is an unreachable lower bound - */ -bool check(int possible_minimum) { - int remain = m; // remain will represent how many additional people we have to place - for (int i = 0; i < n; i++) { - if (a[i] > possible_minimum) return 0; // can't have more people on a bench than the minimum - remain -= (possible_minimum - a[i]); // decrement amount of people remaining - check out slides for logic - } - return remain <= 0; -} - -int main() { - int minimum, maximum, a_i; - cin >> n >> m; - maximum = 0; - for (int i = 0; i < n; i++) { - cin >> a_i; - a[i] = a_i; - maximum = max(maximum, a_i); - } - maximum += m; // maximum amount of people is the largest input bench plus all the people to place - int left = 1, right = maximum; - while (left != right) { // BINARY SEARCH PORTION - search for the minimum amount on a bench - int med = left + (right - left)/2; - if (check(med)) { - right = med; - } else { - left = med + 1; - } - } - minimum = left; - cout << minimum << " " << maximum; - return 0; -} +#include + +using namespace std; + +int n, m; // variables to store number of benches, number of additional people + +int a[105]; // array to store input counts for each bench + +/* + * @param possible_minimum our "guess" for the potential minimum amount of people + * on each bench + * @return 1 if possible_minimum is reachable upper bound), otherwise 0 + * implying possible_minimum is an unreachable lower bound + */ +bool check(int possible_minimum) { + int remain = m; // remain will represent how many additional people we have to place + for (int i = 0; i < n; i++) { + if (a[i] > possible_minimum) return 0; // can't have more people on a bench than the minimum + remain -= (possible_minimum - a[i]); // decrement amount of people remaining - check out slides for logic + } + return remain <= 0; +} + +int main() { + int minimum, maximum, a_i; + cin >> n >> m; + maximum = 0; + for (int i = 0; i < n; i++) { + cin >> a_i; + a[i] = a_i; + maximum = max(maximum, a_i); + } + maximum += m; // maximum amount of people is the largest input bench plus all the people to place + int left = 1, right = maximum; + while (left != right) { // BINARY SEARCH PORTION - search for the minimum amount on a bench + int med = left + (right - left)/2; + if (check(med)) { + right = med; + } else { + left = med + 1; + } + } + minimum = left; + cout << minimum << " " << maximum; + return 0; +} diff --git a/assets/ipl/solutions/19sp/contests/2.11.19/inorder_postorder.cpp b/assets/ipl/solutions/19sp/contests/2.11.19/inorder_postorder.cpp index 434afa1..78b9703 100755 --- a/assets/ipl/solutions/19sp/contests/2.11.19/inorder_postorder.cpp +++ b/assets/ipl/solutions/19sp/contests/2.11.19/inorder_postorder.cpp @@ -1,31 +1,31 @@ -#include -using namespace std; - -int inorder[10000],postorder[10000],pos[10000]; -bool recur(int in_start,int post_start,int length){ - if(length==0) - return true; - int rootpos=pos[postorder[post_start+length-1]]; - if(rootpos>=in_start&&rootpos>n; - for(int i=0;i>inorder[i]; - pos[inorder[i]]=i; - } - for(int i=0;i>postorder[i]; - if(recur(0,0,n)) cout<<"Valid"< +using namespace std; + +int inorder[10000],postorder[10000],pos[10000]; +bool recur(int in_start,int post_start,int length){ + if(length==0) + return true; + int rootpos=pos[postorder[post_start+length-1]]; + if(rootpos>=in_start&&rootpos>n; + for(int i=0;i>inorder[i]; + pos[inorder[i]]=i; + } + for(int i=0;i>postorder[i]; + if(recur(0,0,n)) cout<<"Valid"< -#include - -using namespace std; - - -// THIS CODE IS SLIGHTLY INEFFICIENT AS THERE IS NO NEED TO ACTUALLY GENERATE THE STRING -// .. Can do it with plain math, so check out the Python solution -int helper(string curr, int& count, int numLeft, int numRight, int allowedParan) { - if (curr.size() == allowedParan*2) { - return 1; - } - if (numLeft < allowedParan) { - count += helper(curr + '(', count, numLeft + 1, numRight, allowedParan); - } - - if (numRight < numLeft) { - count += helper(curr + ')', count, numLeft, numRight + 1, allowedParan); - } - return 0; -} - - -int main() { - int n, x; // number of parentheses to generate - cin >> n; - int count = 0; - if (n % 2 == 0) { - x = helper("(", count, 1, 0, n/2); // start out recursion with "(", every string must have this symbol first anyway - } else { - count = 0; - } - cout << count << endl; -} +#include +#include + +using namespace std; + + +// THIS CODE IS SLIGHTLY INEFFICIENT AS THERE IS NO NEED TO ACTUALLY GENERATE THE STRING +// .. Can do it with plain math, so check out the Python solution +int helper(string curr, int& count, int numLeft, int numRight, int allowedParan) { + if (curr.size() == allowedParan*2) { + return 1; + } + if (numLeft < allowedParan) { + count += helper(curr + '(', count, numLeft + 1, numRight, allowedParan); + } + + if (numRight < numLeft) { + count += helper(curr + ')', count, numLeft, numRight + 1, allowedParan); + } + return 0; +} + + +int main() { + int n, x; // number of parentheses to generate + cin >> n; + int count = 0; + if (n % 2 == 0) { + x = helper("(", count, 1, 0, n/2); // start out recursion with "(", every string must have this symbol first anyway + } else { + count = 0; + } + cout << count << endl; +} diff --git a/assets/ipl/solutions/19sp/contests/3.25.19/ColortheSoccer.py b/assets/ipl/solutions/19sp/contests/3.25.19/ColortheSoccer.py index 740d3b1..4311151 100644 --- a/assets/ipl/solutions/19sp/contests/3.25.19/ColortheSoccer.py +++ b/assets/ipl/solutions/19sp/contests/3.25.19/ColortheSoccer.py @@ -1,7 +1,7 @@ -mod = 1000000007 - -n = int(input()) - - -t = (20 * n ** 12 + 24 * n ** 8 + n ** 32 + 15 * n ** 16) // 60 -print(t % mod) +mod = 1000000007 + +n = int(input()) + + +t = (20 * n ** 12 + 24 * n ** 8 + n ** 32 + 15 * n ** 16) // 60 +print(t % mod) diff --git a/assets/ipl/solutions/19sp/contests/3.25.19/ComputetheProduct.py b/assets/ipl/solutions/19sp/contests/3.25.19/ComputetheProduct.py index ec52b35..49132ac 100644 --- a/assets/ipl/solutions/19sp/contests/3.25.19/ComputetheProduct.py +++ b/assets/ipl/solutions/19sp/contests/3.25.19/ComputetheProduct.py @@ -1,22 +1,22 @@ -n = int(input()) - -N = 10**6 -factors = [0] * (N + 1) -primes = [] -tot = 1 -M = 10**9 -for i in range(2, N): - if factors[i] == 0: - factors[i] = i - primes.append(i) - tot = tot * i % M - if len(primes) == n: - break - for j in primes: - v = i * j - if v >= N: - break - factors[v] = j - if i % j == 0: - break -print(tot) +n = int(input()) + +N = 10**6 +factors = [0] * (N + 1) +primes = [] +tot = 1 +M = 10**9 +for i in range(2, N): + if factors[i] == 0: + factors[i] = i + primes.append(i) + tot = tot * i % M + if len(primes) == n: + break + for j in primes: + v = i * j + if v >= N: + break + factors[v] = j + if i % j == 0: + break +print(tot) diff --git a/assets/ipl/solutions/19sp/contests/3.25.19/ContainsaPrime.py b/assets/ipl/solutions/19sp/contests/3.25.19/ContainsaPrime.py index 628a5ff..b0d7fbf 100644 --- a/assets/ipl/solutions/19sp/contests/3.25.19/ContainsaPrime.py +++ b/assets/ipl/solutions/19sp/contests/3.25.19/ContainsaPrime.py @@ -1,12 +1,12 @@ -inp = list(map(int, input().split())) -n = inp[0] -assert len(inp) == n + 1 -f = False -for v in inp[1:]: - for i in range(2, v + 1): - if i * i > v: - f = True - break - if v % i == 0: - break -print("YES" if f else "NO") +inp = list(map(int, input().split())) +n = inp[0] +assert len(inp) == n + 1 +f = False +for v in inp[1:]: + for i in range(2, v + 1): + if i * i > v: + f = True + break + if v % i == 0: + break +print("YES" if f else "NO") diff --git a/assets/ipl/solutions/19sp/contests/3.25.19/Equations.py b/assets/ipl/solutions/19sp/contests/3.25.19/Equations.py index 9f8c5b1..3c5a6e3 100644 --- a/assets/ipl/solutions/19sp/contests/3.25.19/Equations.py +++ b/assets/ipl/solutions/19sp/contests/3.25.19/Equations.py @@ -1,3 +1,3 @@ -A, B, C, D, E, F, G = list(map(int, input().split())) - -print(A - B - C - D + E + F + G) +A, B, C, D, E, F, G = list(map(int, input().split())) + +print(A - B - C - D + E + F + G) diff --git a/assets/ipl/solutions/19sp/contests/3.25.19/MrPandaandKakin.cpp b/assets/ipl/solutions/19sp/contests/3.25.19/MrPandaandKakin.cpp index 02e58de..8874337 100644 --- a/assets/ipl/solutions/19sp/contests/3.25.19/MrPandaandKakin.cpp +++ b/assets/ipl/solutions/19sp/contests/3.25.19/MrPandaandKakin.cpp @@ -1,49 +1,49 @@ -#include -using namespace std; -const long long int po = 1073741827; -#define ll long long int - -ll exgcd(ll a,ll b,ll& x,ll& y){ - if(b==0){x=1;y=0;return a;} - ll d=exgcd(b,a%b,y,x); - y-=a/b*x; - return d; -} -ll exp(ll a,ll b,ll mod){ - a%=mod; - ll res=1; - while(b){ - if(b&1) - res=res*a%mod; - a=a*a%mod; - b/=2; - } - return res; -} -int main(){ - ios_base::sync_with_stdio(0); - cin.tie(0); - int t; - cin>>t; - ll n,c,p,q; - for(int T=1;T<=t;T++){ - cin>>n>>c; - p=round(sqrt(n)); - for(;;p--){ - if(n%p==0){ - q=n/p; - break; - } - } - ll phi=(p-1)*(q-1); - ll x,y; - exgcd(po,phi,x,y); - x=(x%phi+phi)%phi; - ll u = exp(c,x,p); - ll v = exp(c,x,q); - ll ans =(v-u+q)%q; - ans=ans*exp(p,q-2,q)%q; - ans=(ans*p+u)%n; - cout<<"Case "< +using namespace std; +const long long int po = 1073741827; +#define ll long long int + +ll exgcd(ll a,ll b,ll& x,ll& y){ + if(b==0){x=1;y=0;return a;} + ll d=exgcd(b,a%b,y,x); + y-=a/b*x; + return d; +} +ll exp(ll a,ll b,ll mod){ + a%=mod; + ll res=1; + while(b){ + if(b&1) + res=res*a%mod; + a=a*a%mod; + b/=2; + } + return res; +} +int main(){ + ios_base::sync_with_stdio(0); + cin.tie(0); + int t; + cin>>t; + ll n,c,p,q; + for(int T=1;T<=t;T++){ + cin>>n>>c; + p=round(sqrt(n)); + for(;;p--){ + if(n%p==0){ + q=n/p; + break; + } + } + ll phi=(p-1)*(q-1); + ll x,y; + exgcd(po,phi,x,y); + x=(x%phi+phi)%phi; + ll u = exp(c,x,p); + ll v = exp(c,x,q); + ll ans =(v-u+q)%q; + ans=ans*exp(p,q-2,q)%q; + ans=(ans*p+u)%n; + cout<<"Case "< -using namespace std; -const int mod = 1e9+7; -int main(){ - long long int n,m,ans1,ans2; - cin>>n>>m; - if(n&1) - ans1=((n+1)*(n)*(n-1)/24)%mod*(n-2)%mod; - else - ans1=((n)*(n-1)*(n-2)/24)%mod*(n+1)%mod; - if(m&1) - ans2=((m+1)*(m)*(m-1)/24)%mod*(m-2)%mod; - else - ans2=((m)*(m-1)*(m-2)/24)%mod*(m+1)%mod; - cout< +using namespace std; +const int mod = 1e9+7; +int main(){ + long long int n,m,ans1,ans2; + cin>>n>>m; + if(n&1) + ans1=((n+1)*(n)*(n-1)/24)%mod*(n-2)%mod; + else + ans1=((n)*(n-1)*(n-2)/24)%mod*(n+1)%mod; + if(m&1) + ans2=((m+1)*(m)*(m-1)/24)%mod*(m-2)%mod; + else + ans2=((m)*(m-1)*(m-2)/24)%mod*(m+1)%mod; + cout< -using namespace std; -const long long int INF = 4e18;//0x7FFFFFFFFFFFFFFF; -long long int dp[1001],pos[1001]; - -int main(){ - ios_base::sync_with_stdio(0); - cin.tie(0); - long long int n,c; - cin>>n>>c; - for(int i=1;i<=n;i++) - cin>>pos[i]; - for(int i=0;i<=n;i++) - dp[i]=INF; - dp[0]=0; - for(int i=1;i<=n;i++) - for(int j=0;j +using namespace std; +const long long int INF = 4e18;//0x7FFFFFFFFFFFFFFF; +long long int dp[1001],pos[1001]; + +int main(){ + ios_base::sync_with_stdio(0); + cin.tie(0); + long long int n,c; + cin>>n>>c; + for(int i=1;i<=n;i++) + cin>>pos[i]; + for(int i=0;i<=n;i++) + dp[i]=INF; + dp[0]=0; + for(int i=1;i<=n;i++) + for(int j=0;j -using namespace std; - -long long int dp[1000001],pos[1000002]; -deque > dq; - -int main(){ - ios_base::sync_with_stdio(0); - cin.tie(0); - long long int n,c,slope,intercept; - cin>>n>>c; - for(int i=1;i<=n;i++) - cin>>pos[i]; - dp[0]=0; - dq.push_back({-2*pos[1],pos[1]*pos[1]+dp[0]}); - for(int i=1;i<=n;i++){ - while(dq.size()>=2&&dq[0].first*pos[i]+dq[0].second>=dq[1].first*pos[i]+dq[1].second) - dq.pop_front(); - dp[i]=c+pos[i]*pos[i]+dq[0].first*pos[i]+dq[0].second; - slope=-2*pos[i+1]; - intercept=pos[i+1]*pos[i+1]+dp[i]; - while(dq.size()>=2&&(dq[(int) dq.size()-2].first-dq[(int) dq.size()-1].first)*(intercept-dq[(int) dq.size()-1].second)<=(dq[(int) dq.size()-1].first-slope)*(dq[(int) dq.size()-1].second-dq[(int) dq.size()-2].second)) - dq.pop_back(); - dq.push_back({slope,intercept}); - } - cout< +using namespace std; + +long long int dp[1000001],pos[1000002]; +deque > dq; + +int main(){ + ios_base::sync_with_stdio(0); + cin.tie(0); + long long int n,c,slope,intercept; + cin>>n>>c; + for(int i=1;i<=n;i++) + cin>>pos[i]; + dp[0]=0; + dq.push_back({-2*pos[1],pos[1]*pos[1]+dp[0]}); + for(int i=1;i<=n;i++){ + while(dq.size()>=2&&dq[0].first*pos[i]+dq[0].second>=dq[1].first*pos[i]+dq[1].second) + dq.pop_front(); + dp[i]=c+pos[i]*pos[i]+dq[0].first*pos[i]+dq[0].second; + slope=-2*pos[i+1]; + intercept=pos[i+1]*pos[i+1]+dp[i]; + while(dq.size()>=2&&(dq[(int) dq.size()-2].first-dq[(int) dq.size()-1].first)*(intercept-dq[(int) dq.size()-1].second)<=(dq[(int) dq.size()-1].first-slope)*(dq[(int) dq.size()-1].second-dq[(int) dq.size()-2].second)) + dq.pop_back(); + dq.push_back({slope,intercept}); + } + cout< -using namespace std; -long long int dp[100]; -int main(){ - ios_base::sync_with_stdio(0); - cin.tie(0); - int n; - cin>>n; - dp[1]=1;dp[2]=2; - for(int i=3;i<=n;i++) - dp[i]=dp[i-1]+dp[i-2]; - cout< +using namespace std; +long long int dp[100]; +int main(){ + ios_base::sync_with_stdio(0); + cin.tie(0); + int n; + cin>>n; + dp[1]=1;dp[2]=2; + for(int i=3;i<=n;i++) + dp[i]=dp[i-1]+dp[i-2]; + cout< - -using namespace std; - -int main () { - int n, v; cin >> n >> v; - int ans = 0; - for (int i = n; i > 1; i--) { - ans += max(i-v, 1); - } - cout << ans << endl; - - return 0; -} +#include + +using namespace std; + +int main () { + int n, v; cin >> n >> v; + int ans = 0; + for (int i = n; i > 1; i--) { + ans += max(i-v, 1); + } + cout << ans << endl; + + return 0; +} diff --git a/assets/ipl/solutions/19sp/contests/3.4.19/cartrip1.cpp b/assets/ipl/solutions/19sp/contests/3.4.19/cartrip1.cpp index dbf95a0..807eb61 100644 --- a/assets/ipl/solutions/19sp/contests/3.4.19/cartrip1.cpp +++ b/assets/ipl/solutions/19sp/contests/3.4.19/cartrip1.cpp @@ -1,30 +1,30 @@ -#include - -using namespace std; - -int dp[101][101]; // dp[i][j] is the min money to arrive city i with j fuel - -int main () { - int n, v; - cin >> n >> v; - vector p(n+1); - for (int i = 1; i <= n; i++) cin >> p[i]; - // dp[i][j] = dp[i-1][j+1-k] + k * p[i-1] - for (int i = 1; i <= n; i++) { - for (int j = 1; j <= v; j++) { - dp[i][j] = 0x3fffffff; - } - } - dp[1][0] = 0; - for (int i = 2; i <= n; i++) { - for (int j = 0; j < v; j++) { - dp[i][j] = 0x3fffffff; - for (int k = 0; k <= j+1; k++) { - dp[i][j] = min(dp[i][j], dp[i-1][j+1-k] + k * p[i-1]); - } - } - } - cout << dp[n][0] << endl; - - return 0; -} +#include + +using namespace std; + +int dp[101][101]; // dp[i][j] is the min money to arrive city i with j fuel + +int main () { + int n, v; + cin >> n >> v; + vector p(n+1); + for (int i = 1; i <= n; i++) cin >> p[i]; + // dp[i][j] = dp[i-1][j+1-k] + k * p[i-1] + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= v; j++) { + dp[i][j] = 0x3fffffff; + } + } + dp[1][0] = 0; + for (int i = 2; i <= n; i++) { + for (int j = 0; j < v; j++) { + dp[i][j] = 0x3fffffff; + for (int k = 0; k <= j+1; k++) { + dp[i][j] = min(dp[i][j], dp[i-1][j+1-k] + k * p[i-1]); + } + } + } + cout << dp[n][0] << endl; + + return 0; +} diff --git a/assets/ipl/solutions/19sp/contests/3.4.19/cartrip2.cpp b/assets/ipl/solutions/19sp/contests/3.4.19/cartrip2.cpp index 227ab45..f9b6774 100644 --- a/assets/ipl/solutions/19sp/contests/3.4.19/cartrip2.cpp +++ b/assets/ipl/solutions/19sp/contests/3.4.19/cartrip2.cpp @@ -1,36 +1,36 @@ -#include - -using namespace std; - -int main () { - cin.tie(0); - ios_base::sync_with_stdio(0); - - int n, v; cin >> n >> v; - if (n == 1) { cout << 0 << endl; return 0; } - vector p(n+1); - p[0] = 0x3fffffff; - for (int i = 1; i <= n; i++) cin >> p[i]; - int ans = 0; - deque mq; - int l = n-1, r = n-1; - while (n - l <= v) { - while (!mq.empty() && mq.back() > p[l]) mq.pop_back(); - mq.push_back(p[l]); - l--; - if (l == 0) break; - } - while (1) { - if (mq.empty()) { cout << -1 << endl; return 0; } - ans += mq.front(); - while (!mq.empty() && mq.back() > p[l]) mq.pop_back(); - mq.push_back(p[l]); - if (l) l--; - if (mq.front() == p[r]) mq.pop_front(); - r--; - if (r == 0) break; - } - cout << ans << endl; - - return 0; -} +#include + +using namespace std; + +int main () { + cin.tie(0); + ios_base::sync_with_stdio(0); + + int n, v; cin >> n >> v; + if (n == 1) { cout << 0 << endl; return 0; } + vector p(n+1); + p[0] = 0x3fffffff; + for (int i = 1; i <= n; i++) cin >> p[i]; + int ans = 0; + deque mq; + int l = n-1, r = n-1; + while (n - l <= v) { + while (!mq.empty() && mq.back() > p[l]) mq.pop_back(); + mq.push_back(p[l]); + l--; + if (l == 0) break; + } + while (1) { + if (mq.empty()) { cout << -1 << endl; return 0; } + ans += mq.front(); + while (!mq.empty() && mq.back() > p[l]) mq.pop_back(); + mq.push_back(p[l]); + if (l) l--; + if (mq.front() == p[r]) mq.pop_front(); + r--; + if (r == 0) break; + } + cout << ans << endl; + + return 0; +} diff --git a/assets/ipl/solutions/19sp/lectures/2.18.19/Bicolorings.cpp b/assets/ipl/solutions/19sp/lectures/2.18.19/Bicolorings.cpp index 1ffcbd8..3123364 100644 --- a/assets/ipl/solutions/19sp/lectures/2.18.19/Bicolorings.cpp +++ b/assets/ipl/solutions/19sp/lectures/2.18.19/Bicolorings.cpp @@ -1,25 +1,25 @@ -#include -#define LL long long -#define MOD 998244353 - -using namespace std; - -LL dp[1001][2001][4]; - -int main () { - int n, k; cin >> n >> k; - dp[0][1][0] = dp[0][1][3] = 1; - dp[0][2][1] = dp[0][2][2] = 1; - for (int x = 1; x < n; x++) { - for (int y = 1; y <= 2000; y++) { - dp[x][y][0] = (dp[x-1][y][0] + dp[x-1][y][1] + dp[x-1][y][2] + dp[x-1][y-1][3]) % MOD; - dp[x][y][1] = (dp[x-1][y-1][0] + dp[x-1][y][1] + (y == 1 ? 0 : dp[x-1][y-2][2]) + dp[x-1][y-1][3]) % MOD; - dp[x][y][2] = (dp[x-1][y-1][0] + (y == 1 ? 0 : dp[x-1][y-2][1]) + dp[x-1][y][2] + dp[x-1][y-1][3]) % MOD; - dp[x][y][3] = (dp[x-1][y-1][0] + dp[x-1][y][1] + dp[x-1][y][2] + dp[x-1][y][3]) % MOD; - } - } - LL ans = (dp[n-1][k][0] + dp[n-1][k][1] + dp[n-1][k][2] + dp[n-1][k][3]) % MOD; - cout << ans << endl; - - return 0; -} +#include +#define LL long long +#define MOD 998244353 + +using namespace std; + +LL dp[1001][2001][4]; + +int main () { + int n, k; cin >> n >> k; + dp[0][1][0] = dp[0][1][3] = 1; + dp[0][2][1] = dp[0][2][2] = 1; + for (int x = 1; x < n; x++) { + for (int y = 1; y <= 2000; y++) { + dp[x][y][0] = (dp[x-1][y][0] + dp[x-1][y][1] + dp[x-1][y][2] + dp[x-1][y-1][3]) % MOD; + dp[x][y][1] = (dp[x-1][y-1][0] + dp[x-1][y][1] + (y == 1 ? 0 : dp[x-1][y-2][2]) + dp[x-1][y-1][3]) % MOD; + dp[x][y][2] = (dp[x-1][y-1][0] + (y == 1 ? 0 : dp[x-1][y-2][1]) + dp[x-1][y][2] + dp[x-1][y-1][3]) % MOD; + dp[x][y][3] = (dp[x-1][y-1][0] + dp[x-1][y][1] + dp[x-1][y][2] + dp[x-1][y][3]) % MOD; + } + } + LL ans = (dp[n-1][k][0] + dp[n-1][k][1] + dp[n-1][k][2] + dp[n-1][k][3]) % MOD; + cout << ans << endl; + + return 0; +} diff --git a/assets/ipl/solutions/19sp/lectures/2.18.19/Coins.cpp b/assets/ipl/solutions/19sp/lectures/2.18.19/Coins.cpp index 2e539f7..a727882 100644 --- a/assets/ipl/solutions/19sp/lectures/2.18.19/Coins.cpp +++ b/assets/ipl/solutions/19sp/lectures/2.18.19/Coins.cpp @@ -1,39 +1,39 @@ -#include - -using namespace std; -double probs[1005]; // allocate space for probability array - -double probability(int N) { // this param "N" is 1 greater than the input "N" so we can construct our matrix correctly - double matrix[N+1][N+1]; - // initialize our k = 0 values -- check out the slides if confused - matrix[0][0] = 1; - for (int i = 1; i < N+1; i++) { - matrix[i][0] = (1 - probs[i]) * matrix[i-1][0]; - } - // now fill out the rest of our matrix - for (int n = 0; n < N+1; n++) { - for (int k = 1; k < N+1; k++) { - if (n == 0) { - matrix[n][k] = 0.0; - } else { - matrix[n][k] = matrix[n-1][k]*(1-probs[n]) + matrix[n-1][k-1]*(probs[n]); // following the recursive formula - } - } - } - // now sum up all the n = N entries that have k >= floor(n/2) + 1 heads occurrences - double sum = 0; - for (int j = ((N)/2) + 1; j <= N; j++) { - sum += matrix[N][j]; - } - return sum; -} -int main() { - int N; - cin >> N; - probs[0] = 1.0; - for (int i = 1; i <= N; i++) { - cin >> probs[i]; - } - cout << probability(N) << endl; - return 0; -} +#include + +using namespace std; +double probs[1005]; // allocate space for probability array + +double probability(int N) { // this param "N" is 1 greater than the input "N" so we can construct our matrix correctly + double matrix[N+1][N+1]; + // initialize our k = 0 values -- check out the slides if confused + matrix[0][0] = 1; + for (int i = 1; i < N+1; i++) { + matrix[i][0] = (1 - probs[i]) * matrix[i-1][0]; + } + // now fill out the rest of our matrix + for (int n = 0; n < N+1; n++) { + for (int k = 1; k < N+1; k++) { + if (n == 0) { + matrix[n][k] = 0.0; + } else { + matrix[n][k] = matrix[n-1][k]*(1-probs[n]) + matrix[n-1][k-1]*(probs[n]); // following the recursive formula + } + } + } + // now sum up all the n = N entries that have k >= floor(n/2) + 1 heads occurrences + double sum = 0; + for (int j = ((N)/2) + 1; j <= N; j++) { + sum += matrix[N][j]; + } + return sum; +} +int main() { + int N; + cin >> N; + probs[0] = 1.0; + for (int i = 1; i <= N; i++) { + cin >> probs[i]; + } + cout << probability(N) << endl; + return 0; +} diff --git a/assets/ipl/solutions/19sp/lectures/2.18.19/EditDistance.cpp b/assets/ipl/solutions/19sp/lectures/2.18.19/EditDistance.cpp index 66bc83c..3e37f50 100644 --- a/assets/ipl/solutions/19sp/lectures/2.18.19/EditDistance.cpp +++ b/assets/ipl/solutions/19sp/lectures/2.18.19/EditDistance.cpp @@ -1,20 +1,20 @@ -#include -using namespace std; -int dp[1001][1001]; -string s,t; -int main(){ - cin>>s>>t; - int ls=s.length(); - int lt=t.length(); - s.insert(0," "); - t.insert(0," "); - for(int i=0;i<=ls;i++) - dp[i][0]=i; - for(int i=0;i<=lt;i++) - dp[0][i]=i; - for(int i=1;i<=ls;i++) - for(int j=1;j<=lt;j++) - dp[i][j]= s[i]==t[j] ? dp[i-1][j-1] : 1+min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1]); - cout< +using namespace std; +int dp[1001][1001]; +string s,t; +int main(){ + cin>>s>>t; + int ls=s.length(); + int lt=t.length(); + s.insert(0," "); + t.insert(0," "); + for(int i=0;i<=ls;i++) + dp[i][0]=i; + for(int i=0;i<=lt;i++) + dp[0][i]=i; + for(int i=1;i<=ls;i++) + for(int j=1;j<=lt;j++) + dp[i][j]= s[i]==t[j] ? dp[i-1][j-1] : 1+min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1]); + cout< -using namespace std; -long long int dp[1000005]; -int a[1000005]; -int main(){ - ios_base::sync_with_stdio(0); - cin.tie(0); - int n; - cin>>n; - for(int i=1;i<=n;i++){ - cin>>a[i]; - dp[i]=10000000000000LL; - } - dp[1]=0; - for(int i=1;i<=n;i++){ - dp[i+2]=min(dp[i]+abs(a[i+2]-a[i]),dp[i+2]); - dp[i+1]=min(dp[i]+abs(a[i+1]-a[i]),dp[i+1]); - } - cout< +using namespace std; +long long int dp[1000005]; +int a[1000005]; +int main(){ + ios_base::sync_with_stdio(0); + cin.tie(0); + int n; + cin>>n; + for(int i=1;i<=n;i++){ + cin>>a[i]; + dp[i]=10000000000000LL; + } + dp[1]=0; + for(int i=1;i<=n;i++){ + dp[i+2]=min(dp[i]+abs(a[i+2]-a[i]),dp[i+2]); + dp[i+1]=min(dp[i]+abs(a[i+1]-a[i]),dp[i+1]); + } + cout< -#include - -using namespace std; - -int main () { - string s, t; - while (1) { - getline(cin, s); - getline(cin, t); - if (!cin) break; - vector> dp(s.length()+1, vector(t.length()+1, 0)); - for (int i = 0; i < s.length(); i++) { - for (int j = 0; j < t.length(); j++) { - if (s[i] == t[j]) dp[i+1][j+1] = dp[i][j] + 1; - else dp[i+1][j+1] = max(dp[i+1][j], dp[i][j+1]); - } - } - cout << dp[s.length()][t.length()] << endl; - } - - return 0; -} - +#include +#include + +using namespace std; + +int main () { + string s, t; + while (1) { + getline(cin, s); + getline(cin, t); + if (!cin) break; + vector> dp(s.length()+1, vector(t.length()+1, 0)); + for (int i = 0; i < s.length(); i++) { + for (int j = 0; j < t.length(); j++) { + if (s[i] == t[j]) dp[i+1][j+1] = dp[i][j] + 1; + else dp[i+1][j+1] = max(dp[i+1][j], dp[i][j+1]); + } + } + cout << dp[s.length()][t.length()] << endl; + } + + return 0; +} + diff --git a/assets/ipl/solutions/19sp/lectures/2.18.19/LongestIncrSubseq.java b/assets/ipl/solutions/19sp/lectures/2.18.19/LongestIncrSubseq.java index 6654638..24c0534 100644 --- a/assets/ipl/solutions/19sp/lectures/2.18.19/LongestIncrSubseq.java +++ b/assets/ipl/solutions/19sp/lectures/2.18.19/LongestIncrSubseq.java @@ -1,72 +1,72 @@ -//package com.company; -// Always comment out package when submitting. - -import java.io.*; -import java.util.*; - -public class Main { - // Actual Code - public static class Task { - - - public void solve(Scanner sc) throws IOException { - int n = sc.nextInt(); - TreeSet tr = new TreeSet<>(); - for (int i = 0; i < n; i++) { - int a = sc.nextInt(); - if (tr.add(a)) { - Integer high = tr.higher(a); - if (high != null) tr.remove(high); - } - } - System.out.println(tr.size()); - - } - } - - // template, actual code is in class Task. - static long TIME_START, TIME_END; - public static void main(String[] args) throws IOException { - Scanner sc = new Scanner(System.in); -// Scanner sc = new Scanner(new FileInputStream("File.in")); -// PrintWriter pw = new PrintWriter(new BufferedOutputStream(System.out)); -// PrintWriter pw = new PrintWriter(new FileOutputStream("File.out")); - - Runtime runtime = Runtime.getRuntime(); - long usedMemoryBefore = runtime.totalMemory() - runtime.freeMemory(); - TIME_START = System.currentTimeMillis(); - Task t = new Task(); - t.solve(sc); - TIME_END = System.currentTimeMillis(); - long usedMemoryAfter = runtime.totalMemory() - runtime.freeMemory(); -// pw.close(); -// System.err.println("Memory increased:" + (usedMemoryAfter-usedMemoryBefore) / 1000000 ); -// System.err.println("Time used: " + (TIME_END - TIME_START) + "."); - } - - // Faster IO with BufferedReader wrapped with Scanner -// static class Scanner { -// StringTokenizer st; -// BufferedReader br; -// -// public Scanner(InputStream s){br = new BufferedReader(new InputStreamReader(s));} -// -// public Scanner(FileReader s) throws FileNotFoundException {br = new BufferedReader(s);} -// -// public String next() throws IOException { -// while (st == null || !st.hasMoreTokens()) -// st = new StringTokenizer(br.readLine()); -// return st.nextToken(); -// } -// -// public int nextInt() throws IOException {return Integer.parseInt(next());} -// -// public long nextLong() throws IOException {return Long.parseLong(next());} -// -// public String nextLine() throws IOException {return br.readLine();} -// -// public double nextDouble() throws IOException {return Double.parseDouble(next()); } -// -// public boolean ready() throws IOException {return br.ready();} -// } -} +//package com.company; +// Always comment out package when submitting. + +import java.io.*; +import java.util.*; + +public class Main { + // Actual Code + public static class Task { + + + public void solve(Scanner sc) throws IOException { + int n = sc.nextInt(); + TreeSet tr = new TreeSet<>(); + for (int i = 0; i < n; i++) { + int a = sc.nextInt(); + if (tr.add(a)) { + Integer high = tr.higher(a); + if (high != null) tr.remove(high); + } + } + System.out.println(tr.size()); + + } + } + + // template, actual code is in class Task. + static long TIME_START, TIME_END; + public static void main(String[] args) throws IOException { + Scanner sc = new Scanner(System.in); +// Scanner sc = new Scanner(new FileInputStream("File.in")); +// PrintWriter pw = new PrintWriter(new BufferedOutputStream(System.out)); +// PrintWriter pw = new PrintWriter(new FileOutputStream("File.out")); + + Runtime runtime = Runtime.getRuntime(); + long usedMemoryBefore = runtime.totalMemory() - runtime.freeMemory(); + TIME_START = System.currentTimeMillis(); + Task t = new Task(); + t.solve(sc); + TIME_END = System.currentTimeMillis(); + long usedMemoryAfter = runtime.totalMemory() - runtime.freeMemory(); +// pw.close(); +// System.err.println("Memory increased:" + (usedMemoryAfter-usedMemoryBefore) / 1000000 ); +// System.err.println("Time used: " + (TIME_END - TIME_START) + "."); + } + + // Faster IO with BufferedReader wrapped with Scanner +// static class Scanner { +// StringTokenizer st; +// BufferedReader br; +// +// public Scanner(InputStream s){br = new BufferedReader(new InputStreamReader(s));} +// +// public Scanner(FileReader s) throws FileNotFoundException {br = new BufferedReader(s);} +// +// public String next() throws IOException { +// while (st == null || !st.hasMoreTokens()) +// st = new StringTokenizer(br.readLine()); +// return st.nextToken(); +// } +// +// public int nextInt() throws IOException {return Integer.parseInt(next());} +// +// public long nextLong() throws IOException {return Long.parseLong(next());} +// +// public String nextLine() throws IOException {return br.readLine();} +// +// public double nextDouble() throws IOException {return Double.parseDouble(next()); } +// +// public boolean ready() throws IOException {return br.ready();} +// } +} diff --git a/assets/ipl/solutions/19sp/lectures/2.18.19/LongestIncrSubseq.py b/assets/ipl/solutions/19sp/lectures/2.18.19/LongestIncrSubseq.py index 09afd77..938f690 100644 --- a/assets/ipl/solutions/19sp/lectures/2.18.19/LongestIncrSubseq.py +++ b/assets/ipl/solutions/19sp/lectures/2.18.19/LongestIncrSubseq.py @@ -1,12 +1,12 @@ -n = int(input()) -a = list(map(int, input().split())) -dp = [0] * n -mf = 0 -for i in range(n): - mx = 0 - for j in range(i): - if a[i] > a[j]: - mx = max(mx, dp[j]) - dp[i] = mx + 1 - mf = max(mf, dp[i]) -print(mf) +n = int(input()) +a = list(map(int, input().split())) +dp = [0] * n +mf = 0 +for i in range(n): + mx = 0 + for j in range(i): + if a[i] > a[j]: + mx = max(mx, dp[j]) + dp[i] = mx + 1 + mf = max(mf, dp[i]) +print(mf) diff --git a/assets/ipl/solutions/19sp/lectures/2.18.19/Permutation.java b/assets/ipl/solutions/19sp/lectures/2.18.19/Permutation.java index 052d351..82daef1 100644 --- a/assets/ipl/solutions/19sp/lectures/2.18.19/Permutation.java +++ b/assets/ipl/solutions/19sp/lectures/2.18.19/Permutation.java @@ -1,111 +1,111 @@ -import java.util.*; -import java.io.*; - - -public class Main { - // Actual Code - public static class Task { - - public class Pair { - int a; int b; - - public Pair(int a, int b) { - this.a = a; - this.b = b; - } - } -public void solve(Scanner sc, PrintWriter pw) throws IOException { - int n = sc.nextInt(); - int[] arr = new int[n]; - for (int i = 0; i < n; i++) { - arr[i] = sc.nextInt(); - } - Pair[] pairs = new Pair[n]; - for (int i = 0; i < n; i++) { - pairs[i] = new Pair(i, arr[i]); - } - Arrays.sort(pairs, new Comparator() { - @Override - public int compare(Pair pair, Pair t1) { - return t1.b - pair.b; - } - }); - boolean[] lose = new boolean[n]; - for (int i = 0; i < n; i++) { - Pair p = pairs[i]; - int idx = p.a; - int val = p.b; - int mIdx = idx; - boolean meetLose = false; - while (mIdx >= 0) { - if (lose[mIdx]) { - meetLose = true; - } - mIdx -= val; - } - mIdx = idx; - while (mIdx < n) { - if (lose[mIdx]) { - meetLose = true; - } - mIdx += val; - } - if (!meetLose) { - lose[idx] = true; - } - } - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < n; i++) { - sb.append(lose[i] ? 'B' : 'A'); - } - pw.println(sb.toString()); - -} -} - - // template, actual code is in class Task. - static long TIME_START, TIME_END; - public static void main(String[] args) throws IOException { - Scanner sc = new Scanner(System.in); -// Scanner sc = new Scanner(new FileInputStream("File.in")); - PrintWriter pw = new PrintWriter(new BufferedOutputStream(System.out)); -// PrintWriter pw = new PrintWriter(new FileOutputStream("File.out")); - - Runtime runtime = Runtime.getRuntime(); - long usedMemoryBefore = runtime.totalMemory() - runtime.freeMemory(); - TIME_START = System.currentTimeMillis(); - Task t = new Task(); - t.solve(sc, pw); - TIME_END = System.currentTimeMillis(); - long usedMemoryAfter = runtime.totalMemory() - runtime.freeMemory(); - pw.close(); -// System.err.println("Memory increased:" + (usedMemoryAfter-usedMemoryBefore) / 1000000 ); -// System.err.println("Time used: " + (TIME_END - TIME_START) + "."); - } - - // Faster IO with BufferedReader wrapped with Scanner - static class Scanner { - StringTokenizer st; - BufferedReader br; - - public Scanner(InputStream s){br = new BufferedReader(new InputStreamReader(s));} - - public Scanner(FileReader s) throws FileNotFoundException {br = new BufferedReader(s);} - - public String next() throws IOException { - while (st == null || !st.hasMoreTokens()) - st = new StringTokenizer(br.readLine()); - return st.nextToken(); - } - - public int nextInt() throws IOException {return Integer.parseInt(next());} - - public long nextLong() throws IOException {return Long.parseLong(next());} - - public String nextLine() throws IOException {return br.readLine();} - - public double nextDouble() throws IOException {return Double.parseDouble(next()); } - - public boolean ready() throws IOException {return br.ready();} - } -} +import java.util.*; +import java.io.*; + + +public class Main { + // Actual Code + public static class Task { + + public class Pair { + int a; int b; + + public Pair(int a, int b) { + this.a = a; + this.b = b; + } + } +public void solve(Scanner sc, PrintWriter pw) throws IOException { + int n = sc.nextInt(); + int[] arr = new int[n]; + for (int i = 0; i < n; i++) { + arr[i] = sc.nextInt(); + } + Pair[] pairs = new Pair[n]; + for (int i = 0; i < n; i++) { + pairs[i] = new Pair(i, arr[i]); + } + Arrays.sort(pairs, new Comparator() { + @Override + public int compare(Pair pair, Pair t1) { + return t1.b - pair.b; + } + }); + boolean[] lose = new boolean[n]; + for (int i = 0; i < n; i++) { + Pair p = pairs[i]; + int idx = p.a; + int val = p.b; + int mIdx = idx; + boolean meetLose = false; + while (mIdx >= 0) { + if (lose[mIdx]) { + meetLose = true; + } + mIdx -= val; + } + mIdx = idx; + while (mIdx < n) { + if (lose[mIdx]) { + meetLose = true; + } + mIdx += val; + } + if (!meetLose) { + lose[idx] = true; + } + } + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < n; i++) { + sb.append(lose[i] ? 'B' : 'A'); + } + pw.println(sb.toString()); + +} +} + + // template, actual code is in class Task. + static long TIME_START, TIME_END; + public static void main(String[] args) throws IOException { + Scanner sc = new Scanner(System.in); +// Scanner sc = new Scanner(new FileInputStream("File.in")); + PrintWriter pw = new PrintWriter(new BufferedOutputStream(System.out)); +// PrintWriter pw = new PrintWriter(new FileOutputStream("File.out")); + + Runtime runtime = Runtime.getRuntime(); + long usedMemoryBefore = runtime.totalMemory() - runtime.freeMemory(); + TIME_START = System.currentTimeMillis(); + Task t = new Task(); + t.solve(sc, pw); + TIME_END = System.currentTimeMillis(); + long usedMemoryAfter = runtime.totalMemory() - runtime.freeMemory(); + pw.close(); +// System.err.println("Memory increased:" + (usedMemoryAfter-usedMemoryBefore) / 1000000 ); +// System.err.println("Time used: " + (TIME_END - TIME_START) + "."); + } + + // Faster IO with BufferedReader wrapped with Scanner + static class Scanner { + StringTokenizer st; + BufferedReader br; + + public Scanner(InputStream s){br = new BufferedReader(new InputStreamReader(s));} + + public Scanner(FileReader s) throws FileNotFoundException {br = new BufferedReader(s);} + + public String next() throws IOException { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(br.readLine()); + return st.nextToken(); + } + + public int nextInt() throws IOException {return Integer.parseInt(next());} + + public long nextLong() throws IOException {return Long.parseLong(next());} + + public String nextLine() throws IOException {return br.readLine();} + + public double nextDouble() throws IOException {return Double.parseDouble(next()); } + + public boolean ready() throws IOException {return br.ready();} + } +} diff --git a/assets/ipl/solutions/19sp/lectures/2.18.19/climbingStairs.cpp b/assets/ipl/solutions/19sp/lectures/2.18.19/climbingStairs.cpp index c855c1c..8b11330 100644 --- a/assets/ipl/solutions/19sp/lectures/2.18.19/climbingStairs.cpp +++ b/assets/ipl/solutions/19sp/lectures/2.18.19/climbingStairs.cpp @@ -1,27 +1,27 @@ -#include -#include - -using namespace std; - -int climbStairs(int n) { - if (n == 1) { - return 1; - } else if (n == 2) { - return 2; - } else { - vector stairs(n); - stairs[0] = 1; - stairs[1] = 2; - for (int i = 2; i < n; i++) { - stairs[i] = stairs[i - 1] + stairs[i - 2]; - } - return stairs[n - 1]; - } -} - -int main() { - int n; - cin >> n; - cout << climbStairs(n) << endl; - return 0; -} +#include +#include + +using namespace std; + +int climbStairs(int n) { + if (n == 1) { + return 1; + } else if (n == 2) { + return 2; + } else { + vector stairs(n); + stairs[0] = 1; + stairs[1] = 2; + for (int i = 2; i < n; i++) { + stairs[i] = stairs[i - 1] + stairs[i - 2]; + } + return stairs[n - 1]; + } +} + +int main() { + int n; + cin >> n; + cout << climbStairs(n) << endl; + return 0; +} diff --git a/assets/ipl/solutions/19sp/lectures/2.25.19/01knapsack.cpp b/assets/ipl/solutions/19sp/lectures/2.25.19/01knapsack.cpp index 133c958..95bea12 100644 --- a/assets/ipl/solutions/19sp/lectures/2.25.19/01knapsack.cpp +++ b/assets/ipl/solutions/19sp/lectures/2.25.19/01knapsack.cpp @@ -1,13 +1,13 @@ -#include -using namespace std; -int n,W,w[1001],v[1001]; -int dp[1001]; -int main(){ - cin>>n>>W; - for(int i=1;i<=n;i++) - cin>>w[i]>>v[i]; - for(int i=1;i<=n;i++) - for(int j=W;j>=w[i];j--) - dp[j]=max(dp[j],dp[j-w[i]]+v[i]); - cout< +using namespace std; +int n,W,w[1001],v[1001]; +int dp[1001]; +int main(){ + cin>>n>>W; + for(int i=1;i<=n;i++) + cin>>w[i]>>v[i]; + for(int i=1;i<=n;i++) + for(int j=W;j>=w[i];j--) + dp[j]=max(dp[j],dp[j-w[i]]+v[i]); + cout< -using namespace std; -pair > frog[100001];//w,l,h -int dp[100000001]; -int main(){ - ios_base::sync_with_stdio(0); - cin.tie(0); - int n,d; - cin>>n>>d; - for(int i=0;i>frog[i].second.first>>frog[i].first>>frog[i].second.second; - sort(frog,frog+n); - for(int i=n-1;i>=0;i--) - for(int j=0;j100000000) - break; - dp[j]=max(dp[j],dp[j+frog[i].first]+frog[i].second.second); - } - int ans=0; - for(int i=0;id) ans++; - cout< +using namespace std; +pair > frog[100001];//w,l,h +int dp[100000001]; +int main(){ + ios_base::sync_with_stdio(0); + cin.tie(0); + int n,d; + cin>>n>>d; + for(int i=0;i>frog[i].second.first>>frog[i].first>>frog[i].second.second; + sort(frog,frog+n); + for(int i=n-1;i>=0;i--) + for(int j=0;j100000000) + break; + dp[j]=max(dp[j],dp[j+frog[i].first]+frog[i].second.second); + } + int ans=0; + for(int i=0;id) ans++; + cout< -using namespace std; -int n,W; -int w[101],v[101]; -int dp[10001]; -int main(){ - ios_base::sync_with_stdio(0); - cin.tie(0); - cin>>n>>W; - for(int i=1;i<=n;i++) - cin>>w[i]>>v[i]; - for(int i=1;i<=10000;i++) - dp[i]=1e9+10; - for(int i=1;i<=n;i++) - for(int j=10000-v[i];j>=0;j--) - dp[j+v[i]]=min(dp[j+v[i]],dp[j]+w[i]); - for(int i=10000;i>=0;i--){ - if(dp[i]<=W){ - cout< +using namespace std; +int n,W; +int w[101],v[101]; +int dp[10001]; +int main(){ + ios_base::sync_with_stdio(0); + cin.tie(0); + cin>>n>>W; + for(int i=1;i<=n;i++) + cin>>w[i]>>v[i]; + for(int i=1;i<=10000;i++) + dp[i]=1e9+10; + for(int i=1;i<=n;i++) + for(int j=10000-v[i];j>=0;j--) + dp[j+v[i]]=min(dp[j+v[i]],dp[j]+w[i]); + for(int i=10000;i>=0;i--){ + if(dp[i]<=W){ + cout< -using namespace std; -int n,W; -int w[101],v[101],c[101],now; -deque > dq; -int dp[101][10001]; -int main(){ - ios_base::sync_with_stdio(0); - cin.tie(0); - cin>>n>>W; - for(int i=1;i<=n;i++) - cin>>w[i]>>v[i]>>c[i]; - for(int i=1;i<=n;i++){ - for(int r=0;rc[i]) - dq.pop_front(); - while(!dq.empty()&&(dp[i-1][j*w[i]+r]-j*v[i])>=dq.back().second) - dq.pop_back(); - dq.push_back({j,dp[i-1][j*w[i]+r]-j*v[i]}); - dp[i][j*w[i]+r]=dq.front().second+j*v[i]; - } - } - } - cout< +using namespace std; +int n,W; +int w[101],v[101],c[101],now; +deque > dq; +int dp[101][10001]; +int main(){ + ios_base::sync_with_stdio(0); + cin.tie(0); + cin>>n>>W; + for(int i=1;i<=n;i++) + cin>>w[i]>>v[i]>>c[i]; + for(int i=1;i<=n;i++){ + for(int r=0;rc[i]) + dq.pop_front(); + while(!dq.empty()&&(dp[i-1][j*w[i]+r]-j*v[i])>=dq.back().second) + dq.pop_back(); + dq.push_back({j,dp[i-1][j*w[i]+r]-j*v[i]}); + dp[i][j*w[i]+r]=dq.front().second+j*v[i]; + } + } + } + cout< -using namespace std; -int n,k,V; -bool dp[2][5000]; -bool cnt[5001]; -vector v[5000]; -int a[5001],total=0; -int main(){ - ios_base::sync_with_stdio(0); - cin.tie(0); - cin>>n>>k>>V; - for(int i=1;i<=n;i++){ - cin>>a[i]; - total+=a[i]; - } - dp[0][0]=true; - for(int i=1;i<=n;i++){ - for(int j=0;j=V&&dp[n&1][V%k]){ - cout<<"YES"<=1;i--) - if(cnt[i]) - l=i; - for(int i=1;i<=n;i++){ - if(cnt[i]){ - if(i==l) continue; - if(a[i]==0) continue; - a[l]+=a[i]; - cout<<(a[i]-1)/k+1<<' '<V) - cout<<(a[l]-V)/k<<' '< +using namespace std; +int n,k,V; +bool dp[2][5000]; +bool cnt[5001]; +vector v[5000]; +int a[5001],total=0; +int main(){ + ios_base::sync_with_stdio(0); + cin.tie(0); + cin>>n>>k>>V; + for(int i=1;i<=n;i++){ + cin>>a[i]; + total+=a[i]; + } + dp[0][0]=true; + for(int i=1;i<=n;i++){ + for(int j=0;j=V&&dp[n&1][V%k]){ + cout<<"YES"<=1;i--) + if(cnt[i]) + l=i; + for(int i=1;i<=n;i++){ + if(cnt[i]){ + if(i==l) continue; + if(a[i]==0) continue; + a[l]+=a[i]; + cout<<(a[i]-1)/k+1<<' '<V) + cout<<(a[l]-V)/k<<' '< -using namespace std; -int w[1001],v[1001],W,n; -int dp[1001]; -int main(){ - cin>>n>>W; - for(int i=1;i<=n;i++) - cin>>w[i]>>v[i]; - for(int i=1;i<=n;i++) - for(int j=w[i];j<=W;j++) - dp[j]=max(dp[j],dp[j-w[i]]+v[i]); - cout< +using namespace std; +int w[1001],v[1001],W,n; +int dp[1001]; +int main(){ + cin>>n>>W; + for(int i=1;i<=n;i++) + cin>>w[i]>>v[i]; + for(int i=1;i<=n;i++) + for(int j=w[i];j<=W;j++) + dp[j]=max(dp[j],dp[j-w[i]]+v[i]); + cout< -using namespace std; -bool isprime[1000001]; -void Sieve_of_E(bool isprime[],int n){ - for(int i=2;i<=n;i++) - isprime[i]=true; - for(long long int i=2;i<=n;i++) - if(isprime[i]) - for(long long int j=i*i;j<=n;j+=i) - isprime[j]=false; -} - -int main(){ - int n; - cin>>n; - Sieve_of_E(isprime,n); - int ans=0; - for(int i=2;i<=n;i++) - if(isprime[i]) - ans++; - cout< +using namespace std; +bool isprime[1000001]; +void Sieve_of_E(bool isprime[],int n){ + for(int i=2;i<=n;i++) + isprime[i]=true; + for(long long int i=2;i<=n;i++) + if(isprime[i]) + for(long long int j=i*i;j<=n;j+=i) + isprime[j]=false; +} + +int main(){ + int n; + cin>>n; + Sieve_of_E(isprime,n); + int ans=0; + for(int i=2;i<=n;i++) + if(isprime[i]) + ans++; + cout< -using namespace std; - -int cnt[1000001]; -map m; -long long int num[5]; -int main(){ - for(int i=0;i<5;i++) - cin>>num[i]; - for(int i=0;i<5;i++){ - for(int j=2;j<=1000000;j++) - while(num[i]%j==0){ - cnt[j]++; - num[i]/=j; - } - if(num[i]!=1) - m[num[i]]++; - } - long long int ans=1; - for(int i=2;i<=1000000;i++) - ans*=(cnt[i]+1); - for(auto i=m.begin();i!=m.end();i++) - ans*=(i->second+1); - cout< +using namespace std; + +int cnt[1000001]; +map m; +long long int num[5]; +int main(){ + for(int i=0;i<5;i++) + cin>>num[i]; + for(int i=0;i<5;i++){ + for(int j=2;j<=1000000;j++) + while(num[i]%j==0){ + cnt[j]++; + num[i]/=j; + } + if(num[i]!=1) + m[num[i]]++; + } + long long int ans=1; + for(int i=2;i<=1000000;i++) + ans*=(cnt[i]+1); + for(auto i=m.begin();i!=m.end();i++) + ans*=(i->second+1); + cout< -using namespace std; -int cnt[10001]; -int main(){ - int n,fac,x,y; - cin>>n; - for(int i=0;i>fac; - cnt[fac]++; - } - for(x=10000;;x--) - if(cnt[x]) - break; - for(int i=1;i<=x;i++) - if(x%i==0) - cnt[i]--; - for(y=x;;y--) - if(cnt[y]) - break; - cout< +using namespace std; +int cnt[10001]; +int main(){ + int n,fac,x,y; + cin>>n; + for(int i=0;i>fac; + cnt[fac]++; + } + for(x=10000;;x--) + if(cnt[x]) + break; + for(int i=1;i<=x;i++) + if(x%i==0) + cnt[i]--; + for(y=x;;y--) + if(cnt[y]) + break; + cout< -using namespace std; - -long long int p[20]; -int a[20],cnt=0; -long long int ans=0; -void dfs(long long int now,long long int nphidoverd,int pos){ - if(pos==cnt){ - ans+=nphidoverd; - return; - } - dfs(now,nphidoverd,pos+1); - nphidoverd=nphidoverd/p[pos]*(p[pos]-1); - for(int i=0;i>n; - x=n; - for(int i=2;i<=1000000;i++) - if(x%i==0){ - p[cnt]=i; - while(x%i==0){ - x/=i; - a[cnt]++; - } - cnt++; - } - if(x!=1){ - p[cnt]=x; - a[cnt]=1; - cnt++; - } - dfs(1,n,0); - cout< +using namespace std; + +long long int p[20]; +int a[20],cnt=0; +long long int ans=0; +void dfs(long long int now,long long int nphidoverd,int pos){ + if(pos==cnt){ + ans+=nphidoverd; + return; + } + dfs(now,nphidoverd,pos+1); + nphidoverd=nphidoverd/p[pos]*(p[pos]-1); + for(int i=0;i>n; + x=n; + for(int i=2;i<=1000000;i++) + if(x%i==0){ + p[cnt]=i; + while(x%i==0){ + x/=i; + a[cnt]++; + } + cnt++; + } + if(x!=1){ + p[cnt]=x; + a[cnt]=1; + cnt++; + } + dfs(1,n,0); + cout< -using namespace std; - -int main(){ - long long int n; - cin>>n; - for(int i=2;i<=sqrt(n);i++) - if(n%i==0){ - cout<<"Not Prime"< +using namespace std; + +int main(){ + long long int n; + cin>>n; + for(int i=2;i<=sqrt(n);i++) + if(n%i==0){ + cout<<"Not Prime"< -using namespace std; - -int main(){ - int n; - cin>>n; - int x=n; - for(int i=2;i<=round(sqrt(n));i++) - while(x%i==0){ - cout< +using namespace std; + +int main(){ + int n; + cin>>n; + int x=n; + for(int i=2;i<=round(sqrt(n));i++) + while(x%i==0){ + cout< -using namespace std; -const int mod = 1e8+7; -int z[1100000],S,P; -void Zvalue(int s[],int len){ - z[0]=len; - int l=0,r=0,x; - for(int i=1;i=r-i+1){ - r>S>>P; - for(int i=0;i>pos[i]; - sort(pos,pos+P); - dif[P]=-1; - for(int i=0;i +using namespace std; +const int mod = 1e8+7; +int z[1100000],S,P; +void Zvalue(int s[],int len){ + z[0]=len; + int l=0,r=0,x; + for(int i=1;i=r-i+1){ + r>S>>P; + for(int i=0;i>pos[i]; + sort(pos,pos+P); + dif[P]=-1; + for(int i=0;i -using namespace std; -const int mod = 1e6+7; -int c[501][501]; - -int main(){ - int t; - c[0][0]=1; - for(int i=1;i<=500;i++){ - c[i][0]=1; - for(int j=1;j<=i;j++) - c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod; - } - cin>>t; - for(int T=1;T<=t;T++){ - int n,m,k; - cin>>n>>m>>k; - long long int ans=0; - ans=c[n*m][k]-2*c[(n-1)*m][k]-2*c[n*(m-1)][k]+4*c[(n-1)*(m-1)][k]+c[(n-2)*m][k]+c[n*(m-2)][k]-2*c[(n-2)*(m-1)][k]-2*c[(n-1)*(m-2)][k]+c[(n-2)*(m-2)][k]; - ans=(ans%mod+mod)%mod; - cout<<"Case "< +using namespace std; +const int mod = 1e6+7; +int c[501][501]; + +int main(){ + int t; + c[0][0]=1; + for(int i=1;i<=500;i++){ + c[i][0]=1; + for(int j=1;j<=i;j++) + c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod; + } + cin>>t; + for(int T=1;T<=t;T++){ + int n,m,k; + cin>>n>>m>>k; + long long int ans=0; + ans=c[n*m][k]-2*c[(n-1)*m][k]-2*c[n*(m-1)][k]+4*c[(n-1)*(m-1)][k]+c[(n-2)*m][k]+c[n*(m-2)][k]-2*c[(n-2)*(m-1)][k]-2*c[(n-1)*(m-2)][k]+c[(n-2)*(m-2)][k]; + ans=(ans%mod+mod)%mod; + cout<<"Case "< -using namespace std; -pair p[1000000]; -int n; -int BIT[1000001]; -void add(int pos){ - for(;pos<=n;pos+=pos&-pos) - BIT[pos]++; -} -int sum(int pos){ - int ans=0; - for(;pos>0;pos-=pos&-pos) - ans+=BIT[pos]; - return ans; -} -int main(){ - ios_base::sync_with_stdio(0); - cin.tie(0); - cin>>n; - for(int i=0;i>p[i].first; - p[i].second=i+1; - } - sort(p,p+n); - int tmp=0; - for(int i=n-1;i>=0;i--){ - tmp+=sum(p[i].second); - add(p[i].second); - } - tmp+=n; - if(tmp&1) - cout<<"Um_nik"< +using namespace std; +pair p[1000000]; +int n; +int BIT[1000001]; +void add(int pos){ + for(;pos<=n;pos+=pos&-pos) + BIT[pos]++; +} +int sum(int pos){ + int ans=0; + for(;pos>0;pos-=pos&-pos) + ans+=BIT[pos]; + return ans; +} +int main(){ + ios_base::sync_with_stdio(0); + cin.tie(0); + cin>>n; + for(int i=0;i>p[i].first; + p[i].second=i+1; + } + sort(p,p+n); + int tmp=0; + for(int i=n-1;i>=0;i--){ + tmp+=sum(p[i].second); + add(p[i].second); + } + tmp+=n; + if(tmp&1) + cout<<"Um_nik"< -using namespace std; -long long int n,m,a[15]; -long long int ans; -void dfs(int pos,long long int now,int cnt){ - if(pos==m){ - if(cnt&1) - ans-=n/now; - else - ans+=n/now; - return; - } - dfs(pos+1,now,cnt); - now=now/__gcd(now,a[pos])*a[pos]; - if(now<=n) - dfs(pos+1,now,cnt+1); -} -int main(){ - while(cin>>n>>m){ - ans=0; - for(int i=0;i>a[i]; - dfs(0,1,0); - cout< +using namespace std; +long long int n,m,a[15]; +long long int ans; +void dfs(int pos,long long int now,int cnt){ + if(pos==m){ + if(cnt&1) + ans-=n/now; + else + ans+=n/now; + return; + } + dfs(pos+1,now,cnt); + now=now/__gcd(now,a[pos])*a[pos]; + if(now<=n) + dfs(pos+1,now,cnt+1); +} +int main(){ + while(cin>>n>>m){ + ans=0; + for(int i=0;i>a[i]; + dfs(0,1,0); + cout< -using namespace std; -string s,t; -const int MAXN=1e6+5; -int fail[MAXN];//the max length in 0~i that prefix==suffix -//indicate the place to go when mismatching -void FailureFunction(string pattern){ - fail[0]=0; - for(int i=1;i0&&pattern[fail[i]]!=pattern[i]) - fail[i]=fail[fail[i]-1]; - if(pattern[fail[i]]==pattern[i]) fail[i]++; - } -} -int cnt[2]; -int cnt2[2]; -string sans; -int main(){ - ios_base::sync_with_stdio(0); - cin.tie(0); - cin>>s>>t; - for(int i=0;i +using namespace std; +string s,t; +const int MAXN=1e6+5; +int fail[MAXN];//the max length in 0~i that prefix==suffix +//indicate the place to go when mismatching +void FailureFunction(string pattern){ + fail[0]=0; + for(int i=1;i0&&pattern[fail[i]]!=pattern[i]) + fail[i]=fail[fail[i]-1]; + if(pattern[fail[i]]==pattern[i]) fail[i]++; + } +} +int cnt[2]; +int cnt2[2]; +string sans; +int main(){ + ios_base::sync_with_stdio(0); + cin.tie(0); + cin>>s>>t; + for(int i=0;i -using namespace std; -const int MAXN=3e5; -int z[MAXN]; -string stmp,ss; -void Manacher(string s){//@#.#.#.# - int l=0,r=0;//M-box does not include r - z[0]=1; - for(int i=1;ii?min(z[2*l-i],r-i):1; - while(s[i+z[i]]==s[i-z[i]]) z[i]++; - if(i+z[i]>r){l=i;r=i+z[i];} - } -} -int main(){ - ios_base::sync_with_stdio(0); - cin.tie(0); - cin>>stmp; - ss+="@#"; - for(int i=0;i +using namespace std; +const int MAXN=3e5; +int z[MAXN]; +string stmp,ss; +void Manacher(string s){//@#.#.#.# + int l=0,r=0;//M-box does not include r + z[0]=1; + for(int i=1;ii?min(z[2*l-i],r-i):1; + while(s[i+z[i]]==s[i-z[i]]) z[i]++; + if(i+z[i]>r){l=i;r=i+z[i];} + } +} +int main(){ + ios_base::sync_with_stdio(0); + cin.tie(0); + cin>>stmp; + ss+="@#"; + for(int i=0;i -using namespace std; -const int MAXN=1e6+5; -int fail[MAXN]; - -void FailureFunction(string& pattern){ - fail[0]=0; - for(int i=1;i0&&pattern[fail[i]]!=pattern[i]) - fail[i]=fail[fail[i]-1]; - if(pattern[fail[i]]==pattern[i]) fail[i]++; - } -} -int cnt=0; -void KMP(string& text,string& pattern){ - FailureFunction(pattern); - for(int match=0,i=0;i0&&pattern[match]!=text[i]) - match=fail[match-1]; - if(pattern[match]==text[i]) match++; - if(match==pattern.size()){ - // cout<>s>>t; - KMP(s,t); - cout< +using namespace std; +const int MAXN=1e6+5; +int fail[MAXN]; + +void FailureFunction(string& pattern){ + fail[0]=0; + for(int i=1;i0&&pattern[fail[i]]!=pattern[i]) + fail[i]=fail[fail[i]-1]; + if(pattern[fail[i]]==pattern[i]) fail[i]++; + } +} +int cnt=0; +void KMP(string& text,string& pattern){ + FailureFunction(pattern); + for(int match=0,i=0;i0&&pattern[match]!=text[i]) + match=fail[match-1]; + if(pattern[match]==text[i]) match++; + if(match==pattern.size()){ + // cout<>s>>t; + KMP(s,t); + cout< -using namespace std; - -const int MAXN=1e6+5; -int fail[MAXN]; -void FailureFunction(string pattern){ - fail[0]=0; - for(int i=1;i0&&pattern[fail[i]]!=pattern[i]) - fail[i]=fail[fail[i]-1]; - if(pattern[fail[i]]==pattern[i]) fail[i]++; - } -} -string s; - -int main(){ - ios_base::sync_with_stdio(0); - cin.tie(0); - cin>>s; - if(s.size()==1) - return -1; - FailureFunction(s); - if(s.size()%(s.size()-fail[s.size()-1])||(s.size()/(s.size()-fail[s.size()-1]))==1) - cout<<"Acyclic"< +using namespace std; + +const int MAXN=1e6+5; +int fail[MAXN]; +void FailureFunction(string pattern){ + fail[0]=0; + for(int i=1;i0&&pattern[fail[i]]!=pattern[i]) + fail[i]=fail[fail[i]-1]; + if(pattern[fail[i]]==pattern[i]) fail[i]++; + } +} +string s; + +int main(){ + ios_base::sync_with_stdio(0); + cin.tie(0); + cin>>s; + if(s.size()==1) + return -1; + FailureFunction(s); + if(s.size()%(s.size()-fail[s.size()-1])||(s.size()/(s.size()-fail[s.size()-1]))==1) + cout<<"Acyclic"< -using namespace std; -const int MAXN=2e6+5; -int zl[MAXN],zr[MAXN]; -const int mod = 998244353; -void Zvalue(string s,int z[]){ - z[0]=s.size(); - int l=0,r=0,x; - for(int i=1;i=r-i+1){ - r>n>>l>>r; - Zvalue(l+'#'+n,zl); - Zvalue(r+'#'+n,zr); - dp[n.size()]=sum[n.size()]=1; - for(int i=n.size()-1;i>=0;i--){ - if(n[i]=='0'){ - if(l=="0") dp[i]=dp[i+1]; - else dp[i]=0; - sum[i]=(sum[i+1]+dp[i])%mod; - continue; - } - int L=l.size()+i; - if(n.size()-i +using namespace std; +const int MAXN=2e6+5; +int zl[MAXN],zr[MAXN]; +const int mod = 998244353; +void Zvalue(string s,int z[]){ + z[0]=s.size(); + int l=0,r=0,x; + for(int i=1;i=r-i+1){ + r>n>>l>>r; + Zvalue(l+'#'+n,zl); + Zvalue(r+'#'+n,zr); + dp[n.size()]=sum[n.size()]=1; + for(int i=n.size()-1;i>=0;i--){ + if(n[i]=='0'){ + if(l=="0") dp[i]=dp[i+1]; + else dp[i]=0; + sum[i]=(sum[i+1]+dp[i])%mod; + continue; + } + int L=l.size()+i; + if(n.size()-i -#include -#include - -using namespace std; - -int main() -{ - string s; - cin >> s; - cout << (s.rfind('Z') - s.find('A') + 1) << endl; - return 0; -} +#include +#include +#include + +using namespace std; + +int main() +{ + string s; + cin >> s; + cout << (s.rfind('Z') - s.find('A') + 1) << endl; + return 0; +} diff --git a/assets/ipl/solutions/season2/contest1/break.py b/assets/ipl/solutions/season2/contest1/break.py index 992d793..8cff9e0 100644 --- a/assets/ipl/solutions/season2/contest1/break.py +++ b/assets/ipl/solutions/season2/contest1/break.py @@ -1,7 +1,7 @@ -n = int(input()) - -x = 1 -while(x*2 <= n): - x *= 2 - -print(x) +n = int(input()) + +x = 1 +while(x*2 <= n): + x *= 2 + +print(x) diff --git a/assets/ipl/solutions/season2/contest1/connectivity.cpp b/assets/ipl/solutions/season2/contest1/connectivity.cpp index a8327e2..152e20f 100644 --- a/assets/ipl/solutions/season2/contest1/connectivity.cpp +++ b/assets/ipl/solutions/season2/contest1/connectivity.cpp @@ -1,63 +1,63 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -const int oo = 1e8, maxN = 2e5 + 10, modP = 1e9 + 7; - -int c[maxN][2], n, k, m, q[maxN], flag; -vector < int > adj[maxN]; -map < pair < int, int >, int > mmap; - -void bfs(int u, int t) { - int l = 1, r = 1; - q[1] = u; - c[u][t] = ++flag; - while (l <= r) { - int u = q[l++]; - c[u][t] = flag; - for (int i = 0; i < adj[u].size(); ++i) { - int v = adj[u][i]; - if (c[v][t]) continue; - c[v][t] = flag; - q[++r] = v; - } - } -} - -int main() { - cin >> n >> k >> m; - for (int i = 1; i <= k; ++i) { - int u, v; - scanf("%d %d", &u, &v); - adj[u].push_back(v); - adj[v].push_back(u); - } - - for (int i = 1; i <= n; ++i) - if (!c[i][0]) bfs(i, 0); - - flag = 0; - for (int i = 1; i <= n; ++i) adj[i].clear(); - for (int i = 1; i <= m; ++i) { - int u, v; - scanf("%d %d", &u, &v); - adj[u].push_back(v); - adj[v].push_back(u); - } - - for (int i = 1; i <= n; ++i) - if (!c[i][1]) bfs(i, 1); - - for (int i = 1; i <= n; ++i) mmap[make_pair(c[i][0], c[i][1])]++; - for (int i = 1; i <= n; ++i) printf("%d ", mmap[make_pair(c[i][0], c[i][1])]); -} +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +const int oo = 1e8, maxN = 2e5 + 10, modP = 1e9 + 7; + +int c[maxN][2], n, k, m, q[maxN], flag; +vector < int > adj[maxN]; +map < pair < int, int >, int > mmap; + +void bfs(int u, int t) { + int l = 1, r = 1; + q[1] = u; + c[u][t] = ++flag; + while (l <= r) { + int u = q[l++]; + c[u][t] = flag; + for (int i = 0; i < adj[u].size(); ++i) { + int v = adj[u][i]; + if (c[v][t]) continue; + c[v][t] = flag; + q[++r] = v; + } + } +} + +int main() { + cin >> n >> k >> m; + for (int i = 1; i <= k; ++i) { + int u, v; + scanf("%d %d", &u, &v); + adj[u].push_back(v); + adj[v].push_back(u); + } + + for (int i = 1; i <= n; ++i) + if (!c[i][0]) bfs(i, 0); + + flag = 0; + for (int i = 1; i <= n; ++i) adj[i].clear(); + for (int i = 1; i <= m; ++i) { + int u, v; + scanf("%d %d", &u, &v); + adj[u].push_back(v); + adj[v].push_back(u); + } + + for (int i = 1; i <= n; ++i) + if (!c[i][1]) bfs(i, 1); + + for (int i = 1; i <= n; ++i) mmap[make_pair(c[i][0], c[i][1])]++; + for (int i = 1; i <= n; ++i) printf("%d ", mmap[make_pair(c[i][0], c[i][1])]); +} diff --git a/assets/ipl/solutions/season2/contest1/gcd.cpp b/assets/ipl/solutions/season2/contest1/gcd.cpp index 4bdc70f..0ed0787 100644 --- a/assets/ipl/solutions/season2/contest1/gcd.cpp +++ b/assets/ipl/solutions/season2/contest1/gcd.cpp @@ -1,67 +1,67 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -const long long oo = 1000000000000000000ll; -const int maxN = 1e6 + 10; - -using namespace std; - -int n, a[maxN], A, B; -set < int > factor_set; -long long res, f[maxN][3]; - -int price(int x, int d) { - if (x % d == 0) return 0; - if (x % d == 1 || x % d == d - 1) return B; - return -1; -} - -void factorize(int x) { - for (int i = 2; i <= (int) sqrt(x); ++i) - if (x % i == 0) { - factor_set.insert(i); - while (x % i == 0) x /= i; - } - if (x != 1) factor_set.insert(x); -} - -int main() { - scanf("%d %d %d", &n, &A, &B); - for (int i = 1; i <= n; ++i) - scanf("%d", &a[i]); - - if (n == 1) { - cout << 0; - return 0; - } - - for (int i = -1; i <= 1; ++i) { - factorize(a[1] + i); - factorize(a[n] + i); - } - - res = oo; - for (auto d : factor_set) { - for (int i = 1; i <= n; ++i) { - f[i][0] = f[i][1] = f[i][2] = oo; - if (price(a[i], d) != -1) { - f[i][0] = f[i - 1][0] + price(a[i], d); - f[i][2] = min(f[i - 1][2], f[i - 1][1]) + price(a[i], d); - } - f[i][1] = min(f[i - 1][0], f[i - 1][1]) + A; - } - long long tmp = min(f[n][1], min(f[n][2], f[n][0])); - res = min(res, tmp); - } - - cout << res; -} +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const long long oo = 1000000000000000000ll; +const int maxN = 1e6 + 10; + +using namespace std; + +int n, a[maxN], A, B; +set < int > factor_set; +long long res, f[maxN][3]; + +int price(int x, int d) { + if (x % d == 0) return 0; + if (x % d == 1 || x % d == d - 1) return B; + return -1; +} + +void factorize(int x) { + for (int i = 2; i <= (int) sqrt(x); ++i) + if (x % i == 0) { + factor_set.insert(i); + while (x % i == 0) x /= i; + } + if (x != 1) factor_set.insert(x); +} + +int main() { + scanf("%d %d %d", &n, &A, &B); + for (int i = 1; i <= n; ++i) + scanf("%d", &a[i]); + + if (n == 1) { + cout << 0; + return 0; + } + + for (int i = -1; i <= 1; ++i) { + factorize(a[1] + i); + factorize(a[n] + i); + } + + res = oo; + for (auto d : factor_set) { + for (int i = 1; i <= n; ++i) { + f[i][0] = f[i][1] = f[i][2] = oo; + if (price(a[i], d) != -1) { + f[i][0] = f[i - 1][0] + price(a[i], d); + f[i][2] = min(f[i - 1][2], f[i - 1][1]) + price(a[i], d); + } + f[i][1] = min(f[i - 1][0], f[i - 1][1]) + A; + } + long long tmp = min(f[n][1], min(f[n][2], f[n][0])); + res = min(res, tmp); + } + + cout << res; +} diff --git a/assets/ipl/solutions/season2/contest1/kangaroo.py b/assets/ipl/solutions/season2/contest1/kangaroo.py index a5fe890..59b1820 100644 --- a/assets/ipl/solutions/season2/contest1/kangaroo.py +++ b/assets/ipl/solutions/season2/contest1/kangaroo.py @@ -1,5 +1,5 @@ -X = int(input()) -for i in range(1, 100000): - if i*(i+1)/2 >= X: - print(i) - break +X = int(input()) +for i in range(1, 100000): + if i*(i+1)/2 >= X: + print(i) + break diff --git a/assets/ipl/solutions/season2/contest1/rgb.py b/assets/ipl/solutions/season2/contest1/rgb.py index 0808e65..fb6c89f 100644 --- a/assets/ipl/solutions/season2/contest1/rgb.py +++ b/assets/ipl/solutions/season2/contest1/rgb.py @@ -1,8 +1,8 @@ -# step 1: read the three digits -a, b, c = input().split() - -# step 2: compute the 3-digit number -n = int(a)*100 + int(b)*10 + int(c) - -# step 3: check if the 3-digit number is divisible by 4 -print("YES" if n % 4 == 0 else "NO") +# step 1: read the three digits +a, b, c = input().split() + +# step 2: compute the 3-digit number +n = int(a)*100 + int(b)*10 + int(c) + +# step 3: check if the 3-digit number is divisible by 4 +print("YES" if n % 4 == 0 else "NO") diff --git a/assets/ipl/solutions/season2/contest2/election.cpp b/assets/ipl/solutions/season2/contest2/election.cpp index 06e8947..7a4ff2d 100644 --- a/assets/ipl/solutions/season2/contest2/election.cpp +++ b/assets/ipl/solutions/season2/contest2/election.cpp @@ -1,27 +1,27 @@ -#include -#include - -using namespace std; - -typedef unsigned long long ull; - -ull div_ceil(ull a, ull b) -{ - return (a + b - 1) / b; -} - -int main() -{ - int n; cin >> n; - ull x, y; - cin >> x >> y; - for (int i = 1; i < n; ++i) { - ull p, q; - cin >> p >> q; - ull n = max(div_ceil(x, p), div_ceil(y, q)); - x = n * p; - y = n * q; - } - cout << x + y << endl; - return 0; -} +#include +#include + +using namespace std; + +typedef unsigned long long ull; + +ull div_ceil(ull a, ull b) +{ + return (a + b - 1) / b; +} + +int main() +{ + int n; cin >> n; + ull x, y; + cin >> x >> y; + for (int i = 1; i < n; ++i) { + ull p, q; + cin >> p >> q; + ull n = max(div_ceil(x, p), div_ceil(y, q)); + x = n * p; + y = n * q; + } + cout << x + y << endl; + return 0; +} diff --git a/assets/ipl/solutions/season2/contest2/lego.cpp b/assets/ipl/solutions/season2/contest2/lego.cpp index 4a941cb..51b0048 100644 --- a/assets/ipl/solutions/season2/contest2/lego.cpp +++ b/assets/ipl/solutions/season2/contest2/lego.cpp @@ -1,81 +1,81 @@ -#include -#include -#include -#include -#include -#include - -using namespace std; - -#define MOD 1000000007 - -// All possible ways to build a single row of wall. -long long row[1005] = {0}; - -// All possible ways to build a wall, including ones that are not solid. -long long all_walls[1005][1005]; - -// Ways to build solid walls. -long long solid_walls[1005][1005]; - -void populate_rows() { - row[0] = 1; - for (int i = 1; i <= 1000; i++) - for (int j = 1; j <= 4; j++) - if (i - j >= 0) - row[i] = (row[i - j] + row[i]) % MOD; -} - -long long get_all_walls(int height, int width) { - if (all_walls[height][width] != -1) - return all_walls[height][width]; - - // base case - if (height == 0) - return all_walls[height][width] = 1; - - if (height % 2 == 0) { - long long result = get_all_walls(height / 2, width); - return all_walls[height][width] = result * result % MOD; - } else { - long long result = get_all_walls(height / 2, width); - return all_walls[height][width] = - (result * result % MOD) * row[width] % MOD; - } -} - -long long solve(int height, int width) { - if (solid_walls[height][width] != -1) // Have calculated before - return solid_walls[height][width]; - - long long invalid_walls = 0; - if (width <= 1) - invalid_walls = 0; // Base case. Only use 1*1*1 blocks. - - // Enumerate vertical cuts - for (int vert_cut = width - 1; vert_cut >= 1; vert_cut--) - invalid_walls = - (solve(height, vert_cut) * - get_all_walls(height, width - vert_cut) % MOD + - invalid_walls) % MOD; - - return solid_walls[height][width] = - (get_all_walls(height, width) - invalid_walls + MOD) % MOD; -} - -int main() { - int T, N, M; - scanf("%d", &T); - - populate_rows(); - - // Set all values to -1. - memset(solid_walls, -1, sizeof solid_walls); - memset(all_walls, -1, sizeof all_walls); - - for (int test_case = 0; test_case < T; test_case++) { - scanf("%d %d", &N, &M); - printf("%lld\n", solve(N, M)); - } - return 0; -} +#include +#include +#include +#include +#include +#include + +using namespace std; + +#define MOD 1000000007 + +// All possible ways to build a single row of wall. +long long row[1005] = {0}; + +// All possible ways to build a wall, including ones that are not solid. +long long all_walls[1005][1005]; + +// Ways to build solid walls. +long long solid_walls[1005][1005]; + +void populate_rows() { + row[0] = 1; + for (int i = 1; i <= 1000; i++) + for (int j = 1; j <= 4; j++) + if (i - j >= 0) + row[i] = (row[i - j] + row[i]) % MOD; +} + +long long get_all_walls(int height, int width) { + if (all_walls[height][width] != -1) + return all_walls[height][width]; + + // base case + if (height == 0) + return all_walls[height][width] = 1; + + if (height % 2 == 0) { + long long result = get_all_walls(height / 2, width); + return all_walls[height][width] = result * result % MOD; + } else { + long long result = get_all_walls(height / 2, width); + return all_walls[height][width] = + (result * result % MOD) * row[width] % MOD; + } +} + +long long solve(int height, int width) { + if (solid_walls[height][width] != -1) // Have calculated before + return solid_walls[height][width]; + + long long invalid_walls = 0; + if (width <= 1) + invalid_walls = 0; // Base case. Only use 1*1*1 blocks. + + // Enumerate vertical cuts + for (int vert_cut = width - 1; vert_cut >= 1; vert_cut--) + invalid_walls = + (solve(height, vert_cut) * + get_all_walls(height, width - vert_cut) % MOD + + invalid_walls) % MOD; + + return solid_walls[height][width] = + (get_all_walls(height, width) - invalid_walls + MOD) % MOD; +} + +int main() { + int T, N, M; + scanf("%d", &T); + + populate_rows(); + + // Set all values to -1. + memset(solid_walls, -1, sizeof solid_walls); + memset(all_walls, -1, sizeof all_walls); + + for (int test_case = 0; test_case < T; test_case++) { + scanf("%d %d", &N, &M); + printf("%lld\n", solve(N, M)); + } + return 0; +} diff --git a/assets/ipl/solutions/season2/contest2/marathon.cpp b/assets/ipl/solutions/season2/contest2/marathon.cpp index fa22d6c..f8ab16a 100644 --- a/assets/ipl/solutions/season2/contest2/marathon.cpp +++ b/assets/ipl/solutions/season2/contest2/marathon.cpp @@ -1,25 +1,25 @@ -#include -#include - -using namespace std; - -int main() { - double orig_a, orig_d; - scanf("%lf %lf", &orig_a, &orig_d); - - long long a = round(orig_a * 1e4), d = round(orig_d * 1e4), n; - scanf("%lld", &n); - - for (int i = 1; i <= n; i++) { - long long rem = d * i % (4 * a); - - if (rem < a) - printf("%f %f\n", rem / 1e4, 0.0); - else if (rem < 2 * a) - printf("%f %f\n", a / 1e4, (rem - a) / 1e4); - else if (rem < 3 * a) - printf("%f %f\n", (a - (rem - 2 * a)) / 1e4, a / 1e4); - else - printf("%f %f\n", 0.0, (a - (rem - 3 * a)) / 1e4); - } -} +#include +#include + +using namespace std; + +int main() { + double orig_a, orig_d; + scanf("%lf %lf", &orig_a, &orig_d); + + long long a = round(orig_a * 1e4), d = round(orig_d * 1e4), n; + scanf("%lld", &n); + + for (int i = 1; i <= n; i++) { + long long rem = d * i % (4 * a); + + if (rem < a) + printf("%f %f\n", rem / 1e4, 0.0); + else if (rem < 2 * a) + printf("%f %f\n", a / 1e4, (rem - a) / 1e4); + else if (rem < 3 * a) + printf("%f %f\n", (a - (rem - 2 * a)) / 1e4, a / 1e4); + else + printf("%f %f\n", 0.0, (a - (rem - 3 * a)) / 1e4); + } +} diff --git a/assets/ipl/solutions/season2/contest2/ppsum.cpp b/assets/ipl/solutions/season2/contest2/ppsum.cpp index c9cd146..457a144 100644 --- a/assets/ipl/solutions/season2/contest2/ppsum.cpp +++ b/assets/ipl/solutions/season2/contest2/ppsum.cpp @@ -1,20 +1,20 @@ -#include - -using namespace std; - -int sum (int D, int N) { - if (D == 1) return N*(N+1)/2; - return sum(1, sum(D-1, N)); -} - -int main () { - int T; - cin >> T; - while (T--) { - int D, N; - cin >> D >> N; - cout << sum(D, N) << endl; - } - return 0; -} - +#include + +using namespace std; + +int sum (int D, int N) { + if (D == 1) return N*(N+1)/2; + return sum(1, sum(D-1, N)); +} + +int main () { + int T; + cin >> T; + while (T--) { + int D, N; + cin >> D >> N; + cout << sum(D, N) << endl; + } + return 0; +} + diff --git a/assets/ipl/solutions/season2/contest2/remain.cpp b/assets/ipl/solutions/season2/contest2/remain.cpp index 2afd95b..ad5aada 100644 --- a/assets/ipl/solutions/season2/contest2/remain.cpp +++ b/assets/ipl/solutions/season2/contest2/remain.cpp @@ -1,15 +1,15 @@ -#include - -using namespace std; - -int main () { - int T; - cin >> T; - while (T--) { - int A, B; - cin >> A >> B; - cout << A%B << endl; - } - return 0; -} - +#include + +using namespace std; + +int main () { + int T; + cin >> T; + while (T--) { + int A, B; + cin >> A >> B; + cout << A%B << endl; + } + return 0; +} + diff --git a/assets/ipl/solutions/season2/contest2/restore.cpp b/assets/ipl/solutions/season2/contest2/restore.cpp index 65d9338..1801a41 100644 --- a/assets/ipl/solutions/season2/contest2/restore.cpp +++ b/assets/ipl/solutions/season2/contest2/restore.cpp @@ -1,61 +1,61 @@ -#include -#include -#include -#include -#include -#include - -const int maxN = 1e5 + 10; - -using namespace std; - -int n, deg[maxN], parent[maxN], k; -stack < int > s[maxN]; - -struct vertex { - vertex(int new_v, int new_d) { - v = new_v; - d = new_d; - } - - int v, d; -}; - -vector < vertex > vertices; - -bool cmp(vertex i, vertex j) { - return i.d < j.d; -} - -int main() { - cin >> n >> k; - for (int i = 1; i <= n; ++i) { - int d; scanf("%d", &d); - vertices.push_back(vertex(i, d)); - } - - sort(vertices.begin(), vertices.end(), cmp); - if (vertices[0].d) { - cout << -1; - return 0; - } - s[0].push(vertices[0].v); - for (int i = 1; i < n; ++i) { - if (vertices[i].d <= 0 || s[vertices[i].d - 1].empty()) { - cout << -1; - return 0; - } - int v = vertices[i].v; - int u = s[vertices[i].d - 1].top(); - ++deg[u]; - ++deg[v]; - parent[v] = u; - if (deg[u] == k) - s[vertices[i].d - 1].pop(); - s[vertices[i].d].push(v); - } - - cout << n - 1 << endl; - for (int i = 1; i <= n; ++i) - if (parent[i]) printf("%d %d\n", i, parent[i]); -} +#include +#include +#include +#include +#include +#include + +const int maxN = 1e5 + 10; + +using namespace std; + +int n, deg[maxN], parent[maxN], k; +stack < int > s[maxN]; + +struct vertex { + vertex(int new_v, int new_d) { + v = new_v; + d = new_d; + } + + int v, d; +}; + +vector < vertex > vertices; + +bool cmp(vertex i, vertex j) { + return i.d < j.d; +} + +int main() { + cin >> n >> k; + for (int i = 1; i <= n; ++i) { + int d; scanf("%d", &d); + vertices.push_back(vertex(i, d)); + } + + sort(vertices.begin(), vertices.end(), cmp); + if (vertices[0].d) { + cout << -1; + return 0; + } + s[0].push(vertices[0].v); + for (int i = 1; i < n; ++i) { + if (vertices[i].d <= 0 || s[vertices[i].d - 1].empty()) { + cout << -1; + return 0; + } + int v = vertices[i].v; + int u = s[vertices[i].d - 1].top(); + ++deg[u]; + ++deg[v]; + parent[v] = u; + if (deg[u] == k) + s[vertices[i].d - 1].pop(); + s[vertices[i].d].push(v); + } + + cout << n - 1 << endl; + for (int i = 1; i <= n; ++i) + if (parent[i]) printf("%d %d\n", i, parent[i]); +} diff --git a/assets/ipl/solutions/season2/contest2/subsgm.cpp b/assets/ipl/solutions/season2/contest2/subsgm.cpp index faca961..cef57e8 100644 --- a/assets/ipl/solutions/season2/contest2/subsgm.cpp +++ b/assets/ipl/solutions/season2/contest2/subsgm.cpp @@ -1,54 +1,54 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -const int maxN = 1e5 + 10; - -int tL[maxN * 4], tR[maxN * 4], tM[maxN * 4], a[maxN], n, q; - -void update(int k, int l, int r, int i, int v) { - if (i < l || r < i) return; - if (l == r) { - tL[k] = tR[k] = tM[k] = v; - return; - } - int mid = (l + r) >> 1; - update(k * 2, l, mid, i, v); - update(k * 2 + 1, mid + 1, r, i, v); - tL[k] = (tL[k * 2] == mid - l + 1) ? tL[k * 2] + tL[k * 2 + 1] : tL[k * 2]; - tR[k] = (tR[k * 2 + 1] == r - mid) ? tR[k * 2 + 1] + tR[k * 2] : tR[k * 2 + 1]; - tM[k] = max(tM[k * 2], tM[k * 2 + 1]); - tM[k] = max(tM[k], max(tL[k], tR[k])); - tM[k] = max(tM[k], tR[k * 2] + tL[k * 2 + 1]); -} - -int main() { - cin >> n >> q; - for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); - for (int i = 1; i < n; ++i) - update(1, 1, n - 1, i, (a[i + 1] - a[i]) == 1); - - cout << tM[1] + 1 << endl; - - for (int i = 1; i <= q; ++i) { - int x, y; - scanf("%d %d", &x, &y); - a[x] = y; - if (x != n) - update(1, 1, n - 1, x, (a[x + 1] - a[x]) == 1); - if (x != 1) - update(1, 1, n - 1, x - 1, (a[x] - a[x - 1]) == 1); - printf("%d\n", tM[1] + 1); - } -} +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +const int maxN = 1e5 + 10; + +int tL[maxN * 4], tR[maxN * 4], tM[maxN * 4], a[maxN], n, q; + +void update(int k, int l, int r, int i, int v) { + if (i < l || r < i) return; + if (l == r) { + tL[k] = tR[k] = tM[k] = v; + return; + } + int mid = (l + r) >> 1; + update(k * 2, l, mid, i, v); + update(k * 2 + 1, mid + 1, r, i, v); + tL[k] = (tL[k * 2] == mid - l + 1) ? tL[k * 2] + tL[k * 2 + 1] : tL[k * 2]; + tR[k] = (tR[k * 2 + 1] == r - mid) ? tR[k * 2 + 1] + tR[k * 2] : tR[k * 2 + 1]; + tM[k] = max(tM[k * 2], tM[k * 2 + 1]); + tM[k] = max(tM[k], max(tL[k], tR[k])); + tM[k] = max(tM[k], tR[k * 2] + tL[k * 2 + 1]); +} + +int main() { + cin >> n >> q; + for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); + for (int i = 1; i < n; ++i) + update(1, 1, n - 1, i, (a[i + 1] - a[i]) == 1); + + cout << tM[1] + 1 << endl; + + for (int i = 1; i <= q; ++i) { + int x, y; + scanf("%d %d", &x, &y); + a[x] = y; + if (x != n) + update(1, 1, n - 1, x, (a[x + 1] - a[x]) == 1); + if (x != 1) + update(1, 1, n - 1, x - 1, (a[x] - a[x - 1]) == 1); + printf("%d\n", tM[1] + 1); + } +} diff --git a/assets/ipl/solutions/season2/contest3/bintree.cpp b/assets/ipl/solutions/season2/contest3/bintree.cpp index 16b1f66..e5879b8 100644 --- a/assets/ipl/solutions/season2/contest3/bintree.cpp +++ b/assets/ipl/solutions/season2/contest3/bintree.cpp @@ -1,43 +1,43 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -vector < int > bu, bv; -int n, test; - -int main() { - cin >> test; - while (test--) { - int u, v; - bu.clear(); - bv.clear(); - scanf("%d %d %d", &n, &u, &v); - if (u < v) swap(u, v); - - while (u) bu.push_back(u % 2), u /= 2; - while (v) bv.push_back(v % 2), v /= 2; - reverse(bu.begin(), bu.end()); - reverse(bv.begin(), bv.end()); - - int j = 0; - for (int i = 0; i < bv.size(); ++i) { - if (bu[i] != bv[i]) break; - ++j; - } - int tmp = 0; - for (int i = j; i < bu.size(); ++i) - tmp = tmp * 2 + bu[i]; - printf("%d\n", (n - tmp) / (1 << (bu.size() - j))); - } -} +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +vector < int > bu, bv; +int n, test; + +int main() { + cin >> test; + while (test--) { + int u, v; + bu.clear(); + bv.clear(); + scanf("%d %d %d", &n, &u, &v); + if (u < v) swap(u, v); + + while (u) bu.push_back(u % 2), u /= 2; + while (v) bv.push_back(v % 2), v /= 2; + reverse(bu.begin(), bu.end()); + reverse(bv.begin(), bv.end()); + + int j = 0; + for (int i = 0; i < bv.size(); ++i) { + if (bu[i] != bv[i]) break; + ++j; + } + int tmp = 0; + for (int i = j; i < bu.size(); ++i) + tmp = tmp * 2 + bu[i]; + printf("%d\n", (n - tmp) / (1 << (bu.size() - j))); + } +} diff --git a/assets/ipl/solutions/season2/contest3/cinema.cpp b/assets/ipl/solutions/season2/contest3/cinema.cpp index 32a464d..fe9789e 100644 --- a/assets/ipl/solutions/season2/contest3/cinema.cpp +++ b/assets/ipl/solutions/season2/contest3/cinema.cpp @@ -1,36 +1,36 @@ -#include - -using namespace std; - -int main () { - int twenty_five = 0, fifty = 0; // keep track of 25 and 50 bills - int n; - cin >> n; - while (n--) { - int a; - cin >> a; - if (a == 25) { - twenty_five ++; - } else if (a == 50) { - if (twenty_five == 0) { - cout << "NO" << endl; - return 0; - } - twenty_five --; - fifty ++; - } else { // a == 100 - if (fifty && twenty_five) { // give 50+25 is always better than 25+25+25 - fifty --; - twenty_five --; - } else if (twenty_five >= 3) { - twenty_five -= 3; - } else { - cout << "NO" << endl; - return 0; - } - } - } - cout << "YES" << endl; - return 0; -} - +#include + +using namespace std; + +int main () { + int twenty_five = 0, fifty = 0; // keep track of 25 and 50 bills + int n; + cin >> n; + while (n--) { + int a; + cin >> a; + if (a == 25) { + twenty_five ++; + } else if (a == 50) { + if (twenty_five == 0) { + cout << "NO" << endl; + return 0; + } + twenty_five --; + fifty ++; + } else { // a == 100 + if (fifty && twenty_five) { // give 50+25 is always better than 25+25+25 + fifty --; + twenty_five --; + } else if (twenty_five >= 3) { + twenty_five -= 3; + } else { + cout << "NO" << endl; + return 0; + } + } + } + cout << "YES" << endl; + return 0; +} + diff --git a/assets/ipl/solutions/season2/contest3/deadends.cpp b/assets/ipl/solutions/season2/contest3/deadends.cpp index 756f707..c11634b 100644 --- a/assets/ipl/solutions/season2/contest3/deadends.cpp +++ b/assets/ipl/solutions/season2/contest3/deadends.cpp @@ -1,65 +1,65 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -const int maxN = 11; - -using namespace std; - -int f[1 << maxN][1 << maxN], n, m, c[maxN][maxN], k, res; - -int dp(int connected, int leaves) { - if (__builtin_popcount(connected) == 2) { - int u = 0, v = 0; - for (int i = 0; i < n; ++i) - if ((connected >> i) & 1) { - if (!u) u = i; - else v = i; - } - return (connected == leaves && c[u][v]); - } - if (__builtin_popcount(leaves) < 2) return 0; - if (f[connected][leaves] != -1) return f[connected][leaves]; - - int u = 0; - for (int i = 0; i < n; ++i) - if ((leaves >> i) & 1) { - u = i; - break; - } - - f[connected][leaves] = 0; - for (int v = 0; v < n; ++v) - if (c[u][v] && !((leaves >> v) & 1) && ((connected >> v) & 1)) - f[connected][leaves] += ( - dp(connected ^ (1 << u), leaves ^ (1 << u)) + - dp(connected ^ (1 << u), leaves ^ (1 << u) ^ (1 << v))); - - return f[connected][leaves]; -} - -int main() { - cin >> n >> m >> k; - for (int i = 0; i < m; ++i) { - int u, v; - cin >> u >> v; - --u; --v; - c[u][v] = c[v][u] = 1; - } - - memset(f, 255, sizeof(f)); - for (int i = 0; i < (1 << n); ++i) - if (__builtin_popcount(i) == k) - res += dp((1 << n) - 1, i); - - cout << res; -} +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const int maxN = 11; + +using namespace std; + +int f[1 << maxN][1 << maxN], n, m, c[maxN][maxN], k, res; + +int dp(int connected, int leaves) { + if (__builtin_popcount(connected) == 2) { + int u = 0, v = 0; + for (int i = 0; i < n; ++i) + if ((connected >> i) & 1) { + if (!u) u = i; + else v = i; + } + return (connected == leaves && c[u][v]); + } + if (__builtin_popcount(leaves) < 2) return 0; + if (f[connected][leaves] != -1) return f[connected][leaves]; + + int u = 0; + for (int i = 0; i < n; ++i) + if ((leaves >> i) & 1) { + u = i; + break; + } + + f[connected][leaves] = 0; + for (int v = 0; v < n; ++v) + if (c[u][v] && !((leaves >> v) & 1) && ((connected >> v) & 1)) + f[connected][leaves] += ( + dp(connected ^ (1 << u), leaves ^ (1 << u)) + + dp(connected ^ (1 << u), leaves ^ (1 << u) ^ (1 << v))); + + return f[connected][leaves]; +} + +int main() { + cin >> n >> m >> k; + for (int i = 0; i < m; ++i) { + int u, v; + cin >> u >> v; + --u; --v; + c[u][v] = c[v][u] = 1; + } + + memset(f, 255, sizeof(f)); + for (int i = 0; i < (1 << n); ++i) + if (__builtin_popcount(i) == k) + res += dp((1 << n) - 1, i); + + cout << res; +} diff --git a/assets/ipl/solutions/season2/contest3/digits1.cpp b/assets/ipl/solutions/season2/contest3/digits1.cpp index 3d4dfb6..9506990 100644 --- a/assets/ipl/solutions/season2/contest3/digits1.cpp +++ b/assets/ipl/solutions/season2/contest3/digits1.cpp @@ -1,17 +1,17 @@ -#include - -using namespace std; - -int main() -{ - int n; cin >> n; - for (int i = 0; i < n; ++i) { - int x, s = 0; cin >> x; - while (x) { - s += x % 10; - x /= 10; - } - cout << s << endl; - } - return 0; -} +#include + +using namespace std; + +int main() +{ + int n; cin >> n; + for (int i = 0; i < n; ++i) { + int x, s = 0; cin >> x; + while (x) { + s += x % 10; + x /= 10; + } + cout << s << endl; + } + return 0; +} diff --git a/assets/ipl/solutions/season2/contest3/digits2.cpp b/assets/ipl/solutions/season2/contest3/digits2.cpp index fa53d01..c411642 100644 --- a/assets/ipl/solutions/season2/contest3/digits2.cpp +++ b/assets/ipl/solutions/season2/contest3/digits2.cpp @@ -1,17 +1,17 @@ -#include -#include - -using namespace std; - -int main() -{ - int n; cin >> n; - for (int i = 0; i < n; ++i) { - string s; cin >> s; - int x = 0; - for (char c : s) - x += c - '0'; - cout << x << endl; - } - return 0; -} +#include +#include + +using namespace std; + +int main() +{ + int n; cin >> n; + for (int i = 0; i < n; ++i) { + string s; cin >> s; + int x = 0; + for (char c : s) + x += c - '0'; + cout << x << endl; + } + return 0; +} diff --git a/assets/ipl/solutions/season2/contest3/maze.cpp b/assets/ipl/solutions/season2/contest3/maze.cpp index ffce586..6c783bb 100644 --- a/assets/ipl/solutions/season2/contest3/maze.cpp +++ b/assets/ipl/solutions/season2/contest3/maze.cpp @@ -1,72 +1,72 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -const int maxN = 510; - -using namespace std; - -int m, n, k, visited[maxN][maxN], e; -queue < pair < int, int > > q; -int dx[] = {-1, 1, 0, 0}, - dy[] = {0, 0, -1, 1}; -string maze[maxN]; - -void bfs(int x, int y) { - q.push(make_pair(x, y)); - visited[x][y] = 1; - int num = 1; - - while (!q.empty() && num != e - k) { - x = q.front().first; - y = q.front().second; - q.pop(); - - for (int t = 0; t < 4; ++t) { - int xx = x + dx[t]; - int yy = y + dy[t]; - if (xx < 0 || yy < 0 || xx >= m || yy >= n) continue; - if (visited[xx][yy]) continue; - if (maze[xx][yy] == '#') continue; - - q.push(make_pair(xx, yy)); - visited[xx][yy] = 1; - ++num; - if (num == e - k) break; - } - } -} - -void print() { - for (int i = 0; i < m; ++i) { - for (int j = 0; j < n; ++j) - if (maze[i][j] == '.' && !visited[i][j]) maze[i][j] = 'X'; - cout << maze[i] << endl; - } -} - -int main() { - scanf("%d %d %d\n", &m, &n, &k); - for (int i = 0; i < m; ++i) { - cin >> maze[i]; - for (int j = 0; j < n; ++j) - if (maze[i][j] == '.') ++e; - } - - for (int i = 0; i < m; ++i) - for (int j = 0; j < n; ++j) - if (maze[i][j] == '.') { - bfs(i, j); - print(); - return 0; - } -} +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const int maxN = 510; + +using namespace std; + +int m, n, k, visited[maxN][maxN], e; +queue < pair < int, int > > q; +int dx[] = {-1, 1, 0, 0}, + dy[] = {0, 0, -1, 1}; +string maze[maxN]; + +void bfs(int x, int y) { + q.push(make_pair(x, y)); + visited[x][y] = 1; + int num = 1; + + while (!q.empty() && num != e - k) { + x = q.front().first; + y = q.front().second; + q.pop(); + + for (int t = 0; t < 4; ++t) { + int xx = x + dx[t]; + int yy = y + dy[t]; + if (xx < 0 || yy < 0 || xx >= m || yy >= n) continue; + if (visited[xx][yy]) continue; + if (maze[xx][yy] == '#') continue; + + q.push(make_pair(xx, yy)); + visited[xx][yy] = 1; + ++num; + if (num == e - k) break; + } + } +} + +void print() { + for (int i = 0; i < m; ++i) { + for (int j = 0; j < n; ++j) + if (maze[i][j] == '.' && !visited[i][j]) maze[i][j] = 'X'; + cout << maze[i] << endl; + } +} + +int main() { + scanf("%d %d %d\n", &m, &n, &k); + for (int i = 0; i < m; ++i) { + cin >> maze[i]; + for (int j = 0; j < n; ++j) + if (maze[i][j] == '.') ++e; + } + + for (int i = 0; i < m; ++i) + for (int j = 0; j < n; ++j) + if (maze[i][j] == '.') { + bfs(i, j); + print(); + return 0; + } +} diff --git a/assets/ipl/solutions/season2/contest3/shopping.cpp b/assets/ipl/solutions/season2/contest3/shopping.cpp index c5c1bea..01f27d4 100644 --- a/assets/ipl/solutions/season2/contest3/shopping.cpp +++ b/assets/ipl/solutions/season2/contest3/shopping.cpp @@ -1,16 +1,16 @@ -#include -#include - -using namespace std; - -int main() -{ - int d1, d2, d3; - cin >> d1 >> d2 >> d3; - int s1 = d1 + d2 + d3; - int s2 = 2*(d1 + d2); - int s3 = 2*(d1 + d3); - int s4 = 2*(d2 + d3); - cout << min(s1, min(s2, min(s3, s4))) << endl; - return 0; -} +#include +#include + +using namespace std; + +int main() +{ + int d1, d2, d3; + cin >> d1 >> d2 >> d3; + int s1 = d1 + d2 + d3; + int s2 = 2*(d1 + d2); + int s3 = 2*(d1 + d3); + int s4 = 2*(d2 + d3); + cout << min(s1, min(s2, min(s3, s4))) << endl; + return 0; +} diff --git a/assets/ipl/solutions/season2/contest3/sos_method1.cpp b/assets/ipl/solutions/season2/contest3/sos_method1.cpp index 263a971..3a896e2 100644 --- a/assets/ipl/solutions/season2/contest3/sos_method1.cpp +++ b/assets/ipl/solutions/season2/contest3/sos_method1.cpp @@ -1,23 +1,23 @@ -#include -#include - -using namespace std; - -int v[100]; - -int main() -{ - int n; cin >> n; - for (int i = 0; i < n; ++i) - cin >> v[i]; - sort(v, v + n); - int i = 1; - for (; i < n; ++i) - if (v[i] != v[0]) - break; - if (i < n) - cout << v[i] << endl; - else - cout << "NO" << endl; - return 0; -} +#include +#include + +using namespace std; + +int v[100]; + +int main() +{ + int n; cin >> n; + for (int i = 0; i < n; ++i) + cin >> v[i]; + sort(v, v + n); + int i = 1; + for (; i < n; ++i) + if (v[i] != v[0]) + break; + if (i < n) + cout << v[i] << endl; + else + cout << "NO" << endl; + return 0; +} diff --git a/assets/ipl/solutions/season2/contest3/sos_method2.cpp b/assets/ipl/solutions/season2/contest3/sos_method2.cpp index c7aced6..d1494f1 100644 --- a/assets/ipl/solutions/season2/contest3/sos_method2.cpp +++ b/assets/ipl/solutions/season2/contest3/sos_method2.cpp @@ -1,24 +1,24 @@ -#include - -using namespace std; - -int v[100]; - -int main() -{ - int n; cin >> n; - for (int i = 0; i < n; ++i) - cin >> v[i]; - int j = 0, k = -1; - for (int i = 1; i < n; ++i) - if (v[i] < v[j]) - j = i; - for (int i = 0; i < n; ++i) - if (v[i] != v[j] && (k == -1 || v[i] < v[k])) - k = i; - if (k == -1) - cout << "NO" << endl; - else - cout << v[k] << endl; - return 0; -} +#include + +using namespace std; + +int v[100]; + +int main() +{ + int n; cin >> n; + for (int i = 0; i < n; ++i) + cin >> v[i]; + int j = 0, k = -1; + for (int i = 1; i < n; ++i) + if (v[i] < v[j]) + j = i; + for (int i = 0; i < n; ++i) + if (v[i] != v[j] && (k == -1 || v[i] < v[k])) + k = i; + if (k == -1) + cout << "NO" << endl; + else + cout << v[k] << endl; + return 0; +} diff --git a/assets/ipl/solutions/season2/contest3/team.cpp b/assets/ipl/solutions/season2/contest3/team.cpp index c64fd05..9ed7089 100644 --- a/assets/ipl/solutions/season2/contest3/team.cpp +++ b/assets/ipl/solutions/season2/contest3/team.cpp @@ -1,36 +1,36 @@ -#include -#include - -using namespace std; - -int main () { - int n, m; // n 0's and m 1's - cin >> n >> m; - if (m < n-1 || m > 2*(n+1)) { - cout << -1 << endl; - return 0; - } - if (m < n) { - printf("0"); - n --; - } - while (n) { - if (m > n) { - printf("110"); - m -= 2; - n -= 1; - } else { - printf("10"); - m -= 1; - n -= 1; - } - } - while (m) { - printf("1"); - m --; - } - cout << endl; - - return 0; -} - +#include +#include + +using namespace std; + +int main () { + int n, m; // n 0's and m 1's + cin >> n >> m; + if (m < n-1 || m > 2*(n+1)) { + cout << -1 << endl; + return 0; + } + if (m < n) { + printf("0"); + n --; + } + while (n) { + if (m > n) { + printf("110"); + m -= 2; + n -= 1; + } else { + printf("10"); + m -= 1; + n -= 1; + } + } + while (m) { + printf("1"); + m --; + } + cout << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/season2/contest4/document.cpp b/assets/ipl/solutions/season2/contest4/document.cpp index 102dca5..948c991 100644 --- a/assets/ipl/solutions/season2/contest4/document.cpp +++ b/assets/ipl/solutions/season2/contest4/document.cpp @@ -1,36 +1,36 @@ -#include -#include -#include -#include -#include - -using namespace std; - -int main() { - int n; - cin >> n; - - vector common; - - for (int i = 0; i < n; i++) { - string S; - cin >> S; - - vector letter(26); - for (int j = 0; j < S.size(); j++) - letter[S[j] - 'a']++; - - if (i == 0) - common = letter; - else - for (int j = 0; j < 26; j++) - common[j] = min(common[j], letter[j]); - } - - string out; - for (int i = 0; i < 26; i++) - for (int j = 0; j < common[i]; j++) - out += (char)(i + 'a'); - cout << out << "\n"; - return 0; -} +#include +#include +#include +#include +#include + +using namespace std; + +int main() { + int n; + cin >> n; + + vector common; + + for (int i = 0; i < n; i++) { + string S; + cin >> S; + + vector letter(26); + for (int j = 0; j < S.size(); j++) + letter[S[j] - 'a']++; + + if (i == 0) + common = letter; + else + for (int j = 0; j < 26; j++) + common[j] = min(common[j], letter[j]); + } + + string out; + for (int i = 0; i < 26; i++) + for (int j = 0; j < common[i]; j++) + out += (char)(i + 'a'); + cout << out << "\n"; + return 0; +} diff --git a/assets/ipl/solutions/season2/contest4/missile.cpp b/assets/ipl/solutions/season2/contest4/missile.cpp index 18bf514..040e04d 100644 --- a/assets/ipl/solutions/season2/contest4/missile.cpp +++ b/assets/ipl/solutions/season2/contest4/missile.cpp @@ -1,101 +1,101 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -int n, m, s, l; - -vector>> adj_list; -vector, int>> edge_list; -vector sp; - -// Compute shortest path from s to all other cities. -void dijkstra() { - // Builtin priority queue is max heap. Use greater to convert to min heap. - priority_queue, - vector>, - greater> - > pq; - - // Avoid overflow - sp.assign(n, INT_MAX >> 1); - - sp[s] = 0; - pq.push({0, s}); - - while (!pq.empty()) { - auto front = pq.top(); - pq.pop(); - - int u = front.second, dist = front.first; - if (dist > sp[u]) - continue; - - for (auto edge : adj_list[u]) { - int v = edge.first, len = edge.second; - if (sp[u] + len < sp[v]) { - sp[v] = sp[u] + len; - pq.push({sp[u] + len, v}); - } - } - } -} - -int main() { - scanf("%d %d %d", &n, &m, &s); - // Adjust to use 0-based indexing. - s--; - - adj_list.assign(n, vector>()); - edge_list.assign(m, pair, int>()); - - for (int i = 0; i < m; i++) { - int v, u, w; - scanf("%d %d %d", &v, &u, &w); - v--, u--; - adj_list[v].push_back({u, w}); - adj_list[u].push_back({v, w}); - edge_list[i] = {{v, u}, w}; - } - - scanf("%d", &l); - - dijkstra(); - - int answer = 0; - - // Find cities which contain silos. - for (int i = 0; i < n; i++) - if (sp[i] == l) - answer++; - - // Find roads which contain silos. - for (int i = 0; i < m; i++) { - int u = edge_list[i].first.first, - v = edge_list[i].first.second, - w = edge_list[i].second; - - if (sp[u] < l && sp[u] + w > l) { - int silo = l - sp[u]; - // Make sure this is still the shortest path - if (sp[v] + (w - silo) >= sp[u] + silo) - answer++; - } - - if (sp[v] < l && sp[v] + w > l) { - int silo = l - sp[v]; - // Note there is no equal here to avoid double counting. - if (sp[u] + (w - silo) > sp[v] + silo) - answer++; - } - } - printf("%d\n", answer); - return 0; -} - +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +int n, m, s, l; + +vector>> adj_list; +vector, int>> edge_list; +vector sp; + +// Compute shortest path from s to all other cities. +void dijkstra() { + // Builtin priority queue is max heap. Use greater to convert to min heap. + priority_queue, + vector>, + greater> + > pq; + + // Avoid overflow + sp.assign(n, INT_MAX >> 1); + + sp[s] = 0; + pq.push({0, s}); + + while (!pq.empty()) { + auto front = pq.top(); + pq.pop(); + + int u = front.second, dist = front.first; + if (dist > sp[u]) + continue; + + for (auto edge : adj_list[u]) { + int v = edge.first, len = edge.second; + if (sp[u] + len < sp[v]) { + sp[v] = sp[u] + len; + pq.push({sp[u] + len, v}); + } + } + } +} + +int main() { + scanf("%d %d %d", &n, &m, &s); + // Adjust to use 0-based indexing. + s--; + + adj_list.assign(n, vector>()); + edge_list.assign(m, pair, int>()); + + for (int i = 0; i < m; i++) { + int v, u, w; + scanf("%d %d %d", &v, &u, &w); + v--, u--; + adj_list[v].push_back({u, w}); + adj_list[u].push_back({v, w}); + edge_list[i] = {{v, u}, w}; + } + + scanf("%d", &l); + + dijkstra(); + + int answer = 0; + + // Find cities which contain silos. + for (int i = 0; i < n; i++) + if (sp[i] == l) + answer++; + + // Find roads which contain silos. + for (int i = 0; i < m; i++) { + int u = edge_list[i].first.first, + v = edge_list[i].first.second, + w = edge_list[i].second; + + if (sp[u] < l && sp[u] + w > l) { + int silo = l - sp[u]; + // Make sure this is still the shortest path + if (sp[v] + (w - silo) >= sp[u] + silo) + answer++; + } + + if (sp[v] < l && sp[v] + w > l) { + int silo = l - sp[v]; + // Note there is no equal here to avoid double counting. + if (sp[u] + (w - silo) > sp[v] + silo) + answer++; + } + } + printf("%d\n", answer); + return 0; +} + diff --git a/assets/ipl/solutions/season2/contest4/mostdist.cpp b/assets/ipl/solutions/season2/contest4/mostdist.cpp index 77528a4..4e5ce1b 100644 --- a/assets/ipl/solutions/season2/contest4/mostdist.cpp +++ b/assets/ipl/solutions/season2/contest4/mostdist.cpp @@ -1,60 +1,60 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -const int maxN = 1e6 + 10; - -using namespace std; - -int sx[] = {-1, -1, 1, 1}, - sy[] = {1, -1, 1, -1}; -int q, removed[maxN], res; - -struct cmp { - bool operator () (pair < int, int > a, pair < int, int > b) { - return a.second < b.second; - } -}; - -priority_queue < pair < int, int >, vector < pair < int, int > >, cmp > heap[4]; - -int main() { - scanf("%d\n", &q); - res = 0; - int num = 0; - while (q--) { - char c; scanf("%c ", &c); - if (c == '+') { - int x, y; - scanf("%d %d\n", &x, &y); - x ^= res; y ^= res; ++num; - for (int t = 0; t < 4; ++t) - heap[t].push(make_pair(num, x * sx[t] + y * sy[t])); - } - if (c == '-') { - int n; - scanf("%d\n", &n); - removed[n ^ res] = 1; - } - if (c == '?') { - int x, y; - scanf("%d %d\n", &x, &y); - x ^= res; y ^= res; res = 0; - for (int t = 0; t < 4; ++t) { - while (removed[heap[t].top().first]) - heap[t].pop(); - res = max(res, heap[t].top().second - sx[t] * x - sy[t] * y); - } - cout << res << endl; - } - } -} +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const int maxN = 1e6 + 10; + +using namespace std; + +int sx[] = {-1, -1, 1, 1}, + sy[] = {1, -1, 1, -1}; +int q, removed[maxN], res; + +struct cmp { + bool operator () (pair < int, int > a, pair < int, int > b) { + return a.second < b.second; + } +}; + +priority_queue < pair < int, int >, vector < pair < int, int > >, cmp > heap[4]; + +int main() { + scanf("%d\n", &q); + res = 0; + int num = 0; + while (q--) { + char c; scanf("%c ", &c); + if (c == '+') { + int x, y; + scanf("%d %d\n", &x, &y); + x ^= res; y ^= res; ++num; + for (int t = 0; t < 4; ++t) + heap[t].push(make_pair(num, x * sx[t] + y * sy[t])); + } + if (c == '-') { + int n; + scanf("%d\n", &n); + removed[n ^ res] = 1; + } + if (c == '?') { + int x, y; + scanf("%d %d\n", &x, &y); + x ^= res; y ^= res; res = 0; + for (int t = 0; t < 4; ++t) { + while (removed[heap[t].top().first]) + heap[t].pop(); + res = max(res, heap[t].top().second - sx[t] * x - sy[t] * y); + } + cout << res << endl; + } + } +} diff --git a/assets/ipl/solutions/season2/contest4/petya.cpp b/assets/ipl/solutions/season2/contest4/petya.cpp index 6682257..f4cbd50 100644 --- a/assets/ipl/solutions/season2/contest4/petya.cpp +++ b/assets/ipl/solutions/season2/contest4/petya.cpp @@ -1,21 +1,21 @@ -#include - - -using namespace std; - -int comp(string s, string t) { - for (auto &c : s) c = toupper(c); - for (auto &c : t) c = toupper(c); - if (s < t) return -1; - if (s > t) return 1; - return 0; -} - -int main () { - string s, t; - cin >> s >> t; - cout << comp(s, t) << endl; - - return 0; -} - +#include + + +using namespace std; + +int comp(string s, string t) { + for (auto &c : s) c = toupper(c); + for (auto &c : t) c = toupper(c); + if (s < t) return -1; + if (s > t) return 1; + return 0; +} + +int main () { + string s, t; + cin >> s >> t; + cout << comp(s, t) << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/season2/contest4/physicist.cpp b/assets/ipl/solutions/season2/contest4/physicist.cpp index 5c036b2..c4bb605 100644 --- a/assets/ipl/solutions/season2/contest4/physicist.cpp +++ b/assets/ipl/solutions/season2/contest4/physicist.cpp @@ -1,20 +1,20 @@ -#include - -using namespace std; - -int main () { - int n; - cin >> n; - int sumx = 0, sumy = 0, sumz = 0; - while (n--) { - int x, y, z; - cin >> x >> y >> z; - sumx += x; - sumy += y; - sumz += z; - } - if (sumx || sumy || sumz) cout << "NO" << endl; - else cout << "YES" << endl; - return 0; -} - +#include + +using namespace std; + +int main () { + int n; + cin >> n; + int sumx = 0, sumy = 0, sumz = 0; + while (n--) { + int x, y, z; + cin >> x >> y >> z; + sumx += x; + sumy += y; + sumz += z; + } + if (sumx || sumy || sumz) cout << "NO" << endl; + else cout << "YES" << endl; + return 0; +} + diff --git a/assets/ipl/solutions/season2/contest4/words.cpp b/assets/ipl/solutions/season2/contest4/words.cpp index 7465271..1046d52 100644 --- a/assets/ipl/solutions/season2/contest4/words.cpp +++ b/assets/ipl/solutions/season2/contest4/words.cpp @@ -1,16 +1,16 @@ -#include - -using namespace std; - -int main () { - int n; - cin >> n; - while (n--) { - string s; - cin >> s; - if (s.length() <= 10) cout << s << endl; - else cout << s[0] << s.length()-2 << s[s.length()-1] << endl; - } - return 0; -} - +#include + +using namespace std; + +int main () { + int n; + cin >> n; + while (n--) { + string s; + cin >> s; + if (s.length() <= 10) cout << s << endl; + else cout << s[0] << s.length()-2 << s[s.length()-1] << endl; + } + return 0; +} + diff --git a/assets/ipl/solutions/season2/contest4/x.cpp b/assets/ipl/solutions/season2/contest4/x.cpp index d8737ef..96ea8a8 100644 --- a/assets/ipl/solutions/season2/contest4/x.cpp +++ b/assets/ipl/solutions/season2/contest4/x.cpp @@ -1,30 +1,30 @@ -#include - -using namespace std; - -int main() { - int n; - char paper[305][305]; - - scanf("%d", &n); - for (int row = 0; row < n; row++) - for (int col = 0; col < n; col++) - scanf(" %c", &paper[row][col]); - - char diag_symbol = paper[0][0], off_diag_symbol = paper[0][1]; - - bool exist = diag_symbol != off_diag_symbol; - - for (int row = 0; row < n && exist; row++) - for (int col = 0; col < n && exist; col++) - if (col == row || col == n - 1 - row) { - if (paper[row][col] != diag_symbol) - exist = false; - } - else { - if (paper[row][col] != off_diag_symbol) - exist = false; - } - printf("%s\n", exist ? "YES" : "NO"); - return 0; -} +#include + +using namespace std; + +int main() { + int n; + char paper[305][305]; + + scanf("%d", &n); + for (int row = 0; row < n; row++) + for (int col = 0; col < n; col++) + scanf(" %c", &paper[row][col]); + + char diag_symbol = paper[0][0], off_diag_symbol = paper[0][1]; + + bool exist = diag_symbol != off_diag_symbol; + + for (int row = 0; row < n && exist; row++) + for (int col = 0; col < n && exist; col++) + if (col == row || col == n - 1 - row) { + if (paper[row][col] != diag_symbol) + exist = false; + } + else { + if (paper[row][col] != off_diag_symbol) + exist = false; + } + printf("%s\n", exist ? "YES" : "NO"); + return 0; +} diff --git a/assets/ipl/solutions/season2/contest5/chips.cpp b/assets/ipl/solutions/season2/contest5/chips.cpp index fa1189c..36c50c6 100644 --- a/assets/ipl/solutions/season2/contest5/chips.cpp +++ b/assets/ipl/solutions/season2/contest5/chips.cpp @@ -1,19 +1,19 @@ -#include - -using namespace std; - -int main() -{ - int n, s; - cin >> n >> s; - - for (int i = 1; ; i = (i == n) ? 1 : i + 1) - if (i <= s) - s -= i; - else { - cout << s << endl; - return 0; - } - - return 0; -} +#include + +using namespace std; + +int main() +{ + int n, s; + cin >> n >> s; + + for (int i = 1; ; i = (i == n) ? 1 : i + 1) + if (i <= s) + s -= i; + else { + cout << s << endl; + return 0; + } + + return 0; +} diff --git a/assets/ipl/solutions/season2/contest5/cookies.cpp b/assets/ipl/solutions/season2/contest5/cookies.cpp index 0a94ca2..485144c 100644 --- a/assets/ipl/solutions/season2/contest5/cookies.cpp +++ b/assets/ipl/solutions/season2/contest5/cookies.cpp @@ -1,21 +1,21 @@ -#include - -using namespace std; - -int main() -{ - int odd = 0, even = 0, sum = 0, n; - cin >> n; - - for (int i = 0; i < n; ++i) { - int x; cin >> x; - sum += x; - if (x % 2 == 1) - ++odd; - else - ++even; - } - - cout << ((sum % 2 == 1) ? odd : even) << endl; - return 0; -} +#include + +using namespace std; + +int main() +{ + int odd = 0, even = 0, sum = 0, n; + cin >> n; + + for (int i = 0; i < n; ++i) { + int x; cin >> x; + sum += x; + if (x % 2 == 1) + ++odd; + else + ++even; + } + + cout << ((sum % 2 == 1) ? odd : even) << endl; + return 0; +} diff --git a/assets/ipl/solutions/season2/contest5/guessing.cpp b/assets/ipl/solutions/season2/contest5/guessing.cpp index e467432..d92070a 100644 --- a/assets/ipl/solutions/season2/contest5/guessing.cpp +++ b/assets/ipl/solutions/season2/contest5/guessing.cpp @@ -1,76 +1,76 @@ -#include -#include -#include -#include - -using namespace std; - -#define MAX 1000000000 - -int main() { - int t, k, l; - scanf("%d", &t); - - char op; - char res[10]; - - while (t--) { - scanf("%d", &k); - vector> endpoints; - - for (int i = 0; i < k; i++) { - scanf(" %c%d%s", &op, &l, res); - - if (op == '<') { - if (res[0] == 'Y') { - endpoints.push_back({1, 1}); - endpoints.push_back({l, -1}); - } - else { - endpoints.push_back({l, 1}); - endpoints.push_back({MAX + 1, -1}); - } - } - else if (op == '>') { - if (res[0] == 'Y') { - endpoints.push_back({l + 1, 1}); - endpoints.push_back({MAX + 1, -1}); - } - else { - endpoints.push_back({1, 1}); - endpoints.push_back({l + 1, -1}); - } - } - else { - if (res[0] == 'Y') { - endpoints.push_back({l, 1}); - endpoints.push_back({l + 1, -1}); - } - else { - endpoints.push_back({1, 1}); - endpoints.push_back({l, -1}); - endpoints.push_back({l + 1, 1}); - endpoints.push_back({MAX + 1, -1}); - } - } - } - - sort(endpoints.begin(), endpoints.end()); - - int i = 0, interval = 0, ans = 0; - while (i < endpoints.size()) { - int j = i; - while ( - j < endpoints.size() && - endpoints[j].first == endpoints[i].first - ) { - interval += endpoints[j].second; - j++; - } - - i = j; - ans = max(ans, interval); - } - printf("%d\n", k - ans); - } -} +#include +#include +#include +#include + +using namespace std; + +#define MAX 1000000000 + +int main() { + int t, k, l; + scanf("%d", &t); + + char op; + char res[10]; + + while (t--) { + scanf("%d", &k); + vector> endpoints; + + for (int i = 0; i < k; i++) { + scanf(" %c%d%s", &op, &l, res); + + if (op == '<') { + if (res[0] == 'Y') { + endpoints.push_back({1, 1}); + endpoints.push_back({l, -1}); + } + else { + endpoints.push_back({l, 1}); + endpoints.push_back({MAX + 1, -1}); + } + } + else if (op == '>') { + if (res[0] == 'Y') { + endpoints.push_back({l + 1, 1}); + endpoints.push_back({MAX + 1, -1}); + } + else { + endpoints.push_back({1, 1}); + endpoints.push_back({l + 1, -1}); + } + } + else { + if (res[0] == 'Y') { + endpoints.push_back({l, 1}); + endpoints.push_back({l + 1, -1}); + } + else { + endpoints.push_back({1, 1}); + endpoints.push_back({l, -1}); + endpoints.push_back({l + 1, 1}); + endpoints.push_back({MAX + 1, -1}); + } + } + } + + sort(endpoints.begin(), endpoints.end()); + + int i = 0, interval = 0, ans = 0; + while (i < endpoints.size()) { + int j = i; + while ( + j < endpoints.size() && + endpoints[j].first == endpoints[i].first + ) { + interval += endpoints[j].second; + j++; + } + + i = j; + ans = max(ans, interval); + } + printf("%d\n", k - ans); + } +} diff --git a/assets/ipl/solutions/season2/contest5/polygon.cpp b/assets/ipl/solutions/season2/contest5/polygon.cpp index 0f2b48b..066255b 100644 --- a/assets/ipl/solutions/season2/contest5/polygon.cpp +++ b/assets/ipl/solutions/season2/contest5/polygon.cpp @@ -1,77 +1,77 @@ -#include -#include -#include -#include - -using namespace std; - -const double eps = 1e-9; - -struct point { - double x, y; - point(double x = 0, double y = 0): x(x), y(y) {} - double norm() { - return sqrt(x * x + y * y); - } -}; - -point operator-(const point &lhs, const point &rhs) { - return point(lhs.x - rhs.x, lhs.y - rhs.y); -} - -int dcmp(double x) { - if (fabs(x) < eps) - return 0; - return x < 0 ? -1 : 1; -} - -double cross(const point &lhs, const point &rhs) { - return lhs.x * rhs.y - lhs.y * rhs.x; -} - -bool operator<(const point &lhs, const point &rhs) { - return dcmp(lhs.x - rhs.x) == -1 || - (dcmp(lhs.x - rhs.x) == 0 && dcmp(lhs.y - rhs.y) == -1); -} - -int N; -vector points; -vector hull; - -bool clockwise(int i) { - int cross_prod = cross(hull.back() - hull[hull.size() - 2], - points[i] - hull[hull.size() - 2]); - return dcmp(cross_prod) <= 0; -} - -int main() { - scanf("%d", &N); - points.assign(N, point()); - - for (int i = 0; i < N; i++) - scanf("%lf %lf", &points[i].x, &points[i].y); - - sort(points.begin(), points.end()); - - // Construct lower hull - for (int i = 0; i < N; i++) { - while (hull.size() > 1 && clockwise(i)) - hull.pop_back(); - hull.push_back(points[i]); - } - - // Construct upper hull - int k = hull.size(); - for (int i = N - 2; i >= 0; i--) { - while (hull.size() > k && clockwise(i)) - hull.pop_back(); - hull.push_back(points[i]); - } - - double len = 0; - // Note we have intentionally included the first point twice. - for (int i = 1; i < hull.size(); i++) - len += (hull[i] - hull[i - 1]).norm(); - printf("%0.1f\n", len); - return 0; -} +#include +#include +#include +#include + +using namespace std; + +const double eps = 1e-9; + +struct point { + double x, y; + point(double x = 0, double y = 0): x(x), y(y) {} + double norm() { + return sqrt(x * x + y * y); + } +}; + +point operator-(const point &lhs, const point &rhs) { + return point(lhs.x - rhs.x, lhs.y - rhs.y); +} + +int dcmp(double x) { + if (fabs(x) < eps) + return 0; + return x < 0 ? -1 : 1; +} + +double cross(const point &lhs, const point &rhs) { + return lhs.x * rhs.y - lhs.y * rhs.x; +} + +bool operator<(const point &lhs, const point &rhs) { + return dcmp(lhs.x - rhs.x) == -1 || + (dcmp(lhs.x - rhs.x) == 0 && dcmp(lhs.y - rhs.y) == -1); +} + +int N; +vector points; +vector hull; + +bool clockwise(int i) { + int cross_prod = cross(hull.back() - hull[hull.size() - 2], + points[i] - hull[hull.size() - 2]); + return dcmp(cross_prod) <= 0; +} + +int main() { + scanf("%d", &N); + points.assign(N, point()); + + for (int i = 0; i < N; i++) + scanf("%lf %lf", &points[i].x, &points[i].y); + + sort(points.begin(), points.end()); + + // Construct lower hull + for (int i = 0; i < N; i++) { + while (hull.size() > 1 && clockwise(i)) + hull.pop_back(); + hull.push_back(points[i]); + } + + // Construct upper hull + int k = hull.size(); + for (int i = N - 2; i >= 0; i--) { + while (hull.size() > k && clockwise(i)) + hull.pop_back(); + hull.push_back(points[i]); + } + + double len = 0; + // Note we have intentionally included the first point twice. + for (int i = 1; i < hull.size(); i++) + len += (hull[i] - hull[i - 1]).norm(); + printf("%0.1f\n", len); + return 0; +} diff --git a/assets/ipl/solutions/season2/contest5/puzzles.cpp b/assets/ipl/solutions/season2/contest5/puzzles.cpp index 524e7d1..c55e562 100644 --- a/assets/ipl/solutions/season2/contest5/puzzles.cpp +++ b/assets/ipl/solutions/season2/contest5/puzzles.cpp @@ -1,20 +1,20 @@ -#include -#include - -using namespace std; - -int f[1000]; - -int main() { - int n, m; cin >> n >> m; - for (int i = 0; i < m; ++i) - cin >> f[i]; - sort(f, f + m); - - int x = 9999; - for (int i = 0; i + n <= m; ++i) - x = min(x, f[i + n - 1] - f[i]); - - cout << x << endl; - return 0; -} +#include +#include + +using namespace std; + +int f[1000]; + +int main() { + int n, m; cin >> n >> m; + for (int i = 0; i < m; ++i) + cin >> f[i]; + sort(f, f + m); + + int x = 9999; + for (int i = 0; i + n <= m; ++i) + x = min(x, f[i + n - 1] - f[i]); + + cout << x << endl; + return 0; +} diff --git a/assets/ipl/solutions/season2/contest5/robot.cpp b/assets/ipl/solutions/season2/contest5/robot.cpp index 53503fd..afedd6d 100644 --- a/assets/ipl/solutions/season2/contest5/robot.cpp +++ b/assets/ipl/solutions/season2/contest5/robot.cpp @@ -1,47 +1,47 @@ -#include - -#define MOD 1000000007 -#define MAX 5010 - -int N, K; -long long fact[MAX]; -long long inv_fact[MAX]; - -inline long long mul(long long a, long long b) { - return a * b % MOD; -} - -long long pow(long long n, long long p) { - if (p == 0) - return 1; - long long res = pow(n, p >> 1); - res = mul(res, res); - if (p & 1) - res = mul(res, n); - return res; -} - -long long binom(long long n, long long k) { - return mul(mul(fact[n], inv_fact[k]), inv_fact[n - k]); -} - -void build() { - fact[0] = inv_fact[0] = 1; - for (int i = 1; i < MAX; i++) { - fact[i] = mul(fact[i - 1], i); - inv_fact[i] = pow(fact[i], MOD - 2); - } -} - -int main() { - build(); - while (scanf("%d %d", &N, &K) == 2 && N && K) { - long long res = 0; - K++; - int down = (K >> 1) - 1, right = K - (K >> 1) - 1; - res = mul(binom(N - 2, down), binom(N - 2, right)); - res = mul(res, 2); - printf("%lld\n", res); - } - return 0; -} +#include + +#define MOD 1000000007 +#define MAX 5010 + +int N, K; +long long fact[MAX]; +long long inv_fact[MAX]; + +inline long long mul(long long a, long long b) { + return a * b % MOD; +} + +long long pow(long long n, long long p) { + if (p == 0) + return 1; + long long res = pow(n, p >> 1); + res = mul(res, res); + if (p & 1) + res = mul(res, n); + return res; +} + +long long binom(long long n, long long k) { + return mul(mul(fact[n], inv_fact[k]), inv_fact[n - k]); +} + +void build() { + fact[0] = inv_fact[0] = 1; + for (int i = 1; i < MAX; i++) { + fact[i] = mul(fact[i - 1], i); + inv_fact[i] = pow(fact[i], MOD - 2); + } +} + +int main() { + build(); + while (scanf("%d %d", &N, &K) == 2 && N && K) { + long long res = 0; + K++; + int down = (K >> 1) - 1, right = K - (K >> 1) - 1; + res = mul(binom(N - 2, down), binom(N - 2, right)); + res = mul(res, 2); + printf("%lld\n", res); + } + return 0; +} diff --git a/assets/ipl/solutions/season2/contest5/strings.cpp b/assets/ipl/solutions/season2/contest5/strings.cpp index d705b53..90e9e29 100644 --- a/assets/ipl/solutions/season2/contest5/strings.cpp +++ b/assets/ipl/solutions/season2/contest5/strings.cpp @@ -1,38 +1,38 @@ -#include -#include - -using namespace std; - -string s[50]; - -string rotate(const string & s, int n) { - return s.substr(n) + s.substr(0, n); -} - -static const int inf = 1000000; - -int main() { - int n; cin >> n; - for (int i = 0; i < n; ++i) - cin >> s[i]; - - int m = s[0].size(), ans = inf; - for (int i = 0; i < m; ++i) { - int t = 0; - for (int j = 1; j < n; ++j) { - int r = inf; - for (int k = 0; k < m; ++k) - if (rotate(s[0], i) == rotate(s[j], k)) { - r = k; - break; - } - t += r; - } - ans = min(ans, i + t); - } - if (ans < inf) - cout << ans << endl; - else - cout << -1 << endl; - return 0; -} +#include +#include + +using namespace std; + +string s[50]; + +string rotate(const string & s, int n) { + return s.substr(n) + s.substr(0, n); +} + +static const int inf = 1000000; + +int main() { + int n; cin >> n; + for (int i = 0; i < n; ++i) + cin >> s[i]; + + int m = s[0].size(), ans = inf; + for (int i = 0; i < m; ++i) { + int t = 0; + for (int j = 1; j < n; ++j) { + int r = inf; + for (int k = 0; k < m; ++k) + if (rotate(s[0], i) == rotate(s[j], k)) { + r = k; + break; + } + t += r; + } + ans = min(ans, i + t); + } + if (ans < inf) + cout << ans << endl; + else + cout << -1 << endl; + return 0; +} diff --git a/assets/ipl/solutions/season2/contest5/strings.py b/assets/ipl/solutions/season2/contest5/strings.py index 04ca3ff..38296dd 100644 --- a/assets/ipl/solutions/season2/contest5/strings.py +++ b/assets/ipl/solutions/season2/contest5/strings.py @@ -1,12 +1,12 @@ -n = int(input()) -s = [input() for i in range(n)] -m = len(s[0]) - -inf = 1000000000 - -r = min([i + sum([min([k if s[0][i:] + s[0][:i] == s[j][k:] + s[j][:k] else inf - for k in range(m)]) - for j in range(1, n)]) - for i in range(m)]) - -print(r if r < inf else -1) +n = int(input()) +s = [input() for i in range(n)] +m = len(s[0]) + +inf = 1000000000 + +r = min([i + sum([min([k if s[0][i:] + s[0][:i] == s[j][k:] + s[j][:k] else inf + for k in range(m)]) + for j in range(1, n)]) + for i in range(m)]) + +print(r if r < inf else -1) diff --git a/assets/ipl/solutions/season2/contest5/zeros.cpp b/assets/ipl/solutions/season2/contest5/zeros.cpp index 61bd558..32ff255 100644 --- a/assets/ipl/solutions/season2/contest5/zeros.cpp +++ b/assets/ipl/solutions/season2/contest5/zeros.cpp @@ -1,31 +1,31 @@ -#include -#include -#include - -using namespace std; - -long remove_zeros(long x) { - long y = 0, p = 1; - while (x != 0) { - long r = x % 10; - if (r != 0) { - y += r * p; - p *= 10; - } - x /= 10; - } - return y; -} - -int main() -{ - long a, b; - cin >> a >> b; - - if (remove_zeros(a + b) == remove_zeros(a) + remove_zeros(b)) - cout << "YES" << endl; - else - cout << "NO" << endl; - - return 0; -} +#include +#include +#include + +using namespace std; + +long remove_zeros(long x) { + long y = 0, p = 1; + while (x != 0) { + long r = x % 10; + if (r != 0) { + y += r * p; + p *= 10; + } + x /= 10; + } + return y; +} + +int main() +{ + long a, b; + cin >> a >> b; + + if (remove_zeros(a + b) == remove_zeros(a) + remove_zeros(b)) + cout << "YES" << endl; + else + cout << "NO" << endl; + + return 0; +} diff --git a/assets/ipl/solutions/season2/contest8/gift.cpp b/assets/ipl/solutions/season2/contest8/gift.cpp index 6a26e71..fbfee47 100644 --- a/assets/ipl/solutions/season2/contest8/gift.cpp +++ b/assets/ipl/solutions/season2/contest8/gift.cpp @@ -1,65 +1,65 @@ -#include -#include -#include -#include -#include -#include - -using namespace std; - -const int maxN = 1e5 + 10; -const double PI = acos(-1); - -int n, res, m, deg[maxN], num_comp, cnt_comp[maxN], comp[maxN], num[maxN], low[maxN], k, avail[maxN], num_node; -vector < int > adj[maxN]; -stack < int > s; - -void visit(int u) { - low[u] = num[u] = ++num_node; - s.push(u); - for (int i = 0; i < adj[i].size(); ++i) { - int v = adj[u][i]; - if (avail[v]) continue; - if (num[v]) - low[u] = min(low[u], num[v]); - else { - visit(v); - low[u] = min(low[u], low[v]); - } - } - if (num[u] == low[u]) { - ++num_comp; - int v = 0; - while (v != u) { - v = s.top(); s.pop(); - avail[v] = 1; - comp[v] = num_comp; - ++cnt_comp[num_comp]; - } - } -} - -int main() { - cin >> n >> m >> k; - for (int i = 1; i <= m; ++i) { - int u, v; - cin >> u >> v; - adj[u].push_back(v); - } - for (int i = 1; i <= n; ++i) - if (!num[i]) visit(i); - for (int i = 1; i <= n; ++i) - for (int j = 0; j < adj[i].size(); ++j) { - int u = comp[i]; - int v = comp[adj[i][j]]; - if (u == v) continue; - ++deg[u]; - } - - res = -1; - for (int i = 1; i <= num_comp; ++i) - if (deg[i] == 0) - if (res == -1 || cnt_comp[i] * k < res) - res = cnt_comp[i] * k; - cout << res << endl; -} +#include +#include +#include +#include +#include +#include + +using namespace std; + +const int maxN = 1e5 + 10; +const double PI = acos(-1); + +int n, res, m, deg[maxN], num_comp, cnt_comp[maxN], comp[maxN], num[maxN], low[maxN], k, avail[maxN], num_node; +vector < int > adj[maxN]; +stack < int > s; + +void visit(int u) { + low[u] = num[u] = ++num_node; + s.push(u); + for (int i = 0; i < adj[i].size(); ++i) { + int v = adj[u][i]; + if (avail[v]) continue; + if (num[v]) + low[u] = min(low[u], num[v]); + else { + visit(v); + low[u] = min(low[u], low[v]); + } + } + if (num[u] == low[u]) { + ++num_comp; + int v = 0; + while (v != u) { + v = s.top(); s.pop(); + avail[v] = 1; + comp[v] = num_comp; + ++cnt_comp[num_comp]; + } + } +} + +int main() { + cin >> n >> m >> k; + for (int i = 1; i <= m; ++i) { + int u, v; + cin >> u >> v; + adj[u].push_back(v); + } + for (int i = 1; i <= n; ++i) + if (!num[i]) visit(i); + for (int i = 1; i <= n; ++i) + for (int j = 0; j < adj[i].size(); ++j) { + int u = comp[i]; + int v = comp[adj[i][j]]; + if (u == v) continue; + ++deg[u]; + } + + res = -1; + for (int i = 1; i <= num_comp; ++i) + if (deg[i] == 0) + if (res == -1 || cnt_comp[i] * k < res) + res = cnt_comp[i] * k; + cout << res << endl; +} diff --git a/assets/ipl/solutions/season2/contest8/light.cpp b/assets/ipl/solutions/season2/contest8/light.cpp index 4d03915..6cb74f0 100644 --- a/assets/ipl/solutions/season2/contest8/light.cpp +++ b/assets/ipl/solutions/season2/contest8/light.cpp @@ -1,70 +1,70 @@ -#include -#include -#include -#include -#include - -using namespace std; - -const int maxN = 1e5 + 10; -const double PI = acos(-1); - -struct Line { - Line() = default; - - Line(double aa, double bb) - : a(aa), b(bb) {} - - double a, b; -}; - -double l, r, x[maxN], y[maxN], z[maxN], res; -vector < pair < double, int > > c; -Line line[maxN][2]; -int n; - -bool solve(double m) { - c.clear(); - for (int i = 1; i <= n; ++i) - for (int j = 0; j < 2; ++j) { - if (m > y[i]) continue; - double x_coord = (m - line[i][j].b) / line[i][j].a; - c.push_back({x_coord, j}); - } - sort(c.begin(), c.end()); - - if (c.empty() || c[0].first > l) return false; - - int cnt = 0; - for (int i = 0; i < c.size(); ++i) { - if (c[i].first > l && c[i].first < r && cnt == 0) - return false; - if (c[i].second == 0) ++cnt; - else --cnt; - if (c[i].first >= r) return true; - } - return false; -} - -int main() { - cin >> n; - cin >> l >> r; - for (int i = 1; i <= n; ++i) { - cin >> x[i] >> y[i] >> z[i]; - z[i] = (z[i] * PI) / 180; - } - - for (int i = 1; i <= n; ++i) { - line[i][0] = Line(tan((PI / 2) - z[i]), y[i] - tan((PI / 2) - z[i]) * x[i]); - line[i][1] = Line(tan((PI / 2) + z[i]), y[i] - tan((PI / 2) + z[i]) * x[i]); - } - - double L = 0.0, R = 1000.0; - for (int i = 0; i < 100; ++i) { - double M = (L + R) / 2.0; - if (solve(M)) res = M, L = M; - else R = M; - } - - printf("%.9lf", res); -} +#include +#include +#include +#include +#include + +using namespace std; + +const int maxN = 1e5 + 10; +const double PI = acos(-1); + +struct Line { + Line() = default; + + Line(double aa, double bb) + : a(aa), b(bb) {} + + double a, b; +}; + +double l, r, x[maxN], y[maxN], z[maxN], res; +vector < pair < double, int > > c; +Line line[maxN][2]; +int n; + +bool solve(double m) { + c.clear(); + for (int i = 1; i <= n; ++i) + for (int j = 0; j < 2; ++j) { + if (m > y[i]) continue; + double x_coord = (m - line[i][j].b) / line[i][j].a; + c.push_back({x_coord, j}); + } + sort(c.begin(), c.end()); + + if (c.empty() || c[0].first > l) return false; + + int cnt = 0; + for (int i = 0; i < c.size(); ++i) { + if (c[i].first > l && c[i].first < r && cnt == 0) + return false; + if (c[i].second == 0) ++cnt; + else --cnt; + if (c[i].first >= r) return true; + } + return false; +} + +int main() { + cin >> n; + cin >> l >> r; + for (int i = 1; i <= n; ++i) { + cin >> x[i] >> y[i] >> z[i]; + z[i] = (z[i] * PI) / 180; + } + + for (int i = 1; i <= n; ++i) { + line[i][0] = Line(tan((PI / 2) - z[i]), y[i] - tan((PI / 2) - z[i]) * x[i]); + line[i][1] = Line(tan((PI / 2) + z[i]), y[i] - tan((PI / 2) + z[i]) * x[i]); + } + + double L = 0.0, R = 1000.0; + for (int i = 0; i < 100; ++i) { + double M = (L + R) / 2.0; + if (solve(M)) res = M, L = M; + else R = M; + } + + printf("%.9lf", res); +} diff --git a/assets/ipl/solutions/season3/contest1/cf459c.cpp b/assets/ipl/solutions/season3/contest1/cf459c.cpp index ad30952..71ca1d8 100644 --- a/assets/ipl/solutions/season3/contest1/cf459c.cpp +++ b/assets/ipl/solutions/season3/contest1/cf459c.cpp @@ -1,26 +1,26 @@ -#include -#include - -using namespace std; - -int main () { - int n, k, d; - cin >> n >> k >> d; - if (log(n) / log(k) > d + 1e-08) { - cout << -1 << endl; - } else { - long long base = 1; - for (int i = 0; i < d; i ++) { - int out = 0; - for (int j = 0; j < n; j ++) { - if (j % base == 0) out = out % k + 1; - cout << out << ' '; - } - base = min((long long)0x7fffffff, base * k); - cout << endl; - } - } - - return 0; -} - +#include +#include + +using namespace std; + +int main () { + int n, k, d; + cin >> n >> k >> d; + if (log(n) / log(k) > d + 1e-08) { + cout << -1 << endl; + } else { + long long base = 1; + for (int i = 0; i < d; i ++) { + int out = 0; + for (int j = 0; j < n; j ++) { + if (j % base == 0) out = out % k + 1; + cout << out << ' '; + } + base = min((long long)0x7fffffff, base * k); + cout << endl; + } + } + + return 0; +} + diff --git a/assets/ipl/solutions/season3/contest1/cf551a.cpp b/assets/ipl/solutions/season3/contest1/cf551a.cpp index 5de528d..722bebc 100644 --- a/assets/ipl/solutions/season3/contest1/cf551a.cpp +++ b/assets/ipl/solutions/season3/contest1/cf551a.cpp @@ -1,29 +1,29 @@ -#include -#include -#include -#include - -using namespace std; - -int main () { - int n; - cin >> n; - vector > a(n); - for (int i = 0; i < n; i ++) { - cin >> a[i].first; - a[i].second = i; - } - sort(a.begin(), a.end(), greater >()); - vector rank(n); - for (int i = 0; i < n; i ++) { - if (i > 0 && a[i-1].first == a[i].first) rank[a[i].second] = rank[a[i-1].second]; - else rank[a[i].second] = i + 1; - } - for (int i = 0; i < n; i ++) { - cout << rank[i] << ' '; - } - cout << endl; - - return 0; -} - +#include +#include +#include +#include + +using namespace std; + +int main () { + int n; + cin >> n; + vector > a(n); + for (int i = 0; i < n; i ++) { + cin >> a[i].first; + a[i].second = i; + } + sort(a.begin(), a.end(), greater >()); + vector rank(n); + for (int i = 0; i < n; i ++) { + if (i > 0 && a[i-1].first == a[i].first) rank[a[i].second] = rank[a[i-1].second]; + else rank[a[i].second] = i + 1; + } + for (int i = 0; i < n; i ++) { + cout << rank[i] << ' '; + } + cout << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/season3/contest1/cf844a.cpp b/assets/ipl/solutions/season3/contest1/cf844a.cpp index c4d525f..8abe1ad 100644 --- a/assets/ipl/solutions/season3/contest1/cf844a.cpp +++ b/assets/ipl/solutions/season3/contest1/cf844a.cpp @@ -1,20 +1,20 @@ -#include -#include - -using namespace std; - -int main () { - string s; - int k; - cin >> s >> k; - bool exist[26]; - for (int i = 0; i < 26; i ++) exist[i] = false; - for (char c : s) exist[c - 'a'] = true; - int cnt = 0; - for (int i = 0; i < 26; i ++) cnt += exist[i]; - if (cnt >= k) cout << 0 << endl; - else if (k <= s.length()) cout << k - cnt << endl; - else cout << "impossible" << endl; - return 0; -} - +#include +#include + +using namespace std; + +int main () { + string s; + int k; + cin >> s >> k; + bool exist[26]; + for (int i = 0; i < 26; i ++) exist[i] = false; + for (char c : s) exist[c - 'a'] = true; + int cnt = 0; + for (int i = 0; i < 26; i ++) cnt += exist[i]; + if (cnt >= k) cout << 0 << endl; + else if (k <= s.length()) cout << k - cnt << endl; + else cout << "impossible" << endl; + return 0; +} + diff --git a/assets/ipl/solutions/season3/contest1/cf845d.cpp b/assets/ipl/solutions/season3/contest1/cf845d.cpp index 72ef951..0a7f2d6 100644 --- a/assets/ipl/solutions/season3/contest1/cf845d.cpp +++ b/assets/ipl/solutions/season3/contest1/cf845d.cpp @@ -1,51 +1,51 @@ -#include -#include - -using namespace std; - -int main () { - int n; - cin >> n; - int speed; - int ignore = 0; - stack speed_limits; - int overtake_limits = 0; - while (n--) { - int t; - cin >> t; - switch (t) { - case 1: - cin >> speed; - while (!speed_limits.empty() && speed > speed_limits.top()) { - speed_limits.pop(); - ignore ++; - } - break; - case 2: - ignore += overtake_limits; - overtake_limits = 0; - break; - case 3: - int speed_limit; - cin >> speed_limit; - speed_limits.push(speed_limit); - while (!speed_limits.empty() && speed > speed_limits.top()) { - speed_limits.pop(); - ignore ++; - } - break; - case 4: - overtake_limits = 0; - break; - case 5: - while (!speed_limits.empty()) speed_limits.pop(); - break; - case 6: - overtake_limits ++; - break; - } - } - cout << ignore << endl; - return 0; -} - +#include +#include + +using namespace std; + +int main () { + int n; + cin >> n; + int speed; + int ignore = 0; + stack speed_limits; + int overtake_limits = 0; + while (n--) { + int t; + cin >> t; + switch (t) { + case 1: + cin >> speed; + while (!speed_limits.empty() && speed > speed_limits.top()) { + speed_limits.pop(); + ignore ++; + } + break; + case 2: + ignore += overtake_limits; + overtake_limits = 0; + break; + case 3: + int speed_limit; + cin >> speed_limit; + speed_limits.push(speed_limit); + while (!speed_limits.empty() && speed > speed_limits.top()) { + speed_limits.pop(); + ignore ++; + } + break; + case 4: + overtake_limits = 0; + break; + case 5: + while (!speed_limits.empty()) speed_limits.pop(); + break; + case 6: + overtake_limits ++; + break; + } + } + cout << ignore << endl; + return 0; +} + diff --git a/assets/ipl/solutions/season3/contest1/uva11172.cpp b/assets/ipl/solutions/season3/contest1/uva11172.cpp index 4183f7c..79939d6 100644 --- a/assets/ipl/solutions/season3/contest1/uva11172.cpp +++ b/assets/ipl/solutions/season3/contest1/uva11172.cpp @@ -1,21 +1,21 @@ -#include - -using namespace std; - -int main () { - int t; - cin >> t; - while (t--) { - int a, b; - cin >> a >> b; - if (a < b) { - cout << "<" << endl; - } else if (a == b) { - cout << "=" << endl; - } else { - cout << ">" << endl; - } - } - return 0; -} - +#include + +using namespace std; + +int main () { + int t; + cin >> t; + while (t--) { + int a, b; + cin >> a >> b; + if (a < b) { + cout << "<" << endl; + } else if (a == b) { + cout << "=" << endl; + } else { + cout << ">" << endl; + } + } + return 0; +} + diff --git a/assets/ipl/solutions/season3/contest1/uva11498.cpp b/assets/ipl/solutions/season3/contest1/uva11498.cpp index ed0b1ff..d93b5be 100644 --- a/assets/ipl/solutions/season3/contest1/uva11498.cpp +++ b/assets/ipl/solutions/season3/contest1/uva11498.cpp @@ -1,24 +1,24 @@ -#include - -using namespace std; - -int main () { - int K; - while (1) { - cin >> K; - if (K == 0) break; - int x0, y0; - cin >> x0 >> y0; - while (K--) { - int x, y; - cin >> x >> y; - if (x == x0 || y == y0) cout << "divisa" << endl; - else if (x < x0 && y < y0) cout << "SO" << endl; - else if (x < x0 && y > y0) cout << "NO" << endl; - else if (x > x0 && y < y0) cout << "SE" << endl; - else if (x > x0 && y > y0) cout << "NE" << endl; - } - } - return 0; -} - +#include + +using namespace std; + +int main () { + int K; + while (1) { + cin >> K; + if (K == 0) break; + int x0, y0; + cin >> x0 >> y0; + while (K--) { + int x, y; + cin >> x >> y; + if (x == x0 || y == y0) cout << "divisa" << endl; + else if (x < x0 && y < y0) cout << "SO" << endl; + else if (x < x0 && y > y0) cout << "NO" << endl; + else if (x > x0 && y < y0) cout << "SE" << endl; + else if (x > x0 && y > y0) cout << "NE" << endl; + } + } + return 0; +} + diff --git a/assets/ipl/solutions/season3/contest2/cf116c.cpp b/assets/ipl/solutions/season3/contest2/cf116c.cpp index f86abf8..f84aaec 100644 --- a/assets/ipl/solutions/season3/contest2/cf116c.cpp +++ b/assets/ipl/solutions/season3/contest2/cf116c.cpp @@ -1,26 +1,26 @@ -#include - -using namespace std; - -int p[2001]; -int dep[2001]; - -int calc_dep(int i) { - if (i == -1) return 0; - if (dep[i]) return dep[i]; - return dep[i] = calc_dep(p[i]) + 1; -} - -int main () { - int n; - cin >> n; - for (int i = 1; i <= n; i ++) cin >> p[i]; - for (int i = 1; i <= n; i ++) { - calc_dep(i); - } - int ans = 0; - for (int i = 1; i <= n; i ++) ans = max(ans, dep[i]); - cout << ans << endl; - return 0; -} - +#include + +using namespace std; + +int p[2001]; +int dep[2001]; + +int calc_dep(int i) { + if (i == -1) return 0; + if (dep[i]) return dep[i]; + return dep[i] = calc_dep(p[i]) + 1; +} + +int main () { + int n; + cin >> n; + for (int i = 1; i <= n; i ++) cin >> p[i]; + for (int i = 1; i <= n; i ++) { + calc_dep(i); + } + int ans = 0; + for (int i = 1; i <= n; i ++) ans = max(ans, dep[i]); + cout << ans << endl; + return 0; +} + diff --git a/assets/ipl/solutions/season3/contest2/cf384a.cpp b/assets/ipl/solutions/season3/contest2/cf384a.cpp index 424435e..9d46114 100644 --- a/assets/ipl/solutions/season3/contest2/cf384a.cpp +++ b/assets/ipl/solutions/season3/contest2/cf384a.cpp @@ -1,18 +1,18 @@ -#include - -using namespace std; - -int main () { - int n; - cin >> n; - cout << (n * n + 1) / 2 << endl; - for (int i = 0; i < n; i ++) { - for (int j = 0; j < n; j ++) { - if ((i & 1) == (j & 1)) cout << 'C'; - else cout << '.'; - } - cout << endl; - } - return 0; -} - +#include + +using namespace std; + +int main () { + int n; + cin >> n; + cout << (n * n + 1) / 2 << endl; + for (int i = 0; i < n; i ++) { + for (int j = 0; j < n; j ++) { + if ((i & 1) == (j & 1)) cout << 'C'; + else cout << '.'; + } + cout << endl; + } + return 0; +} + diff --git a/assets/ipl/solutions/season3/contest2/cf460c.cpp b/assets/ipl/solutions/season3/contest2/cf460c.cpp index 1b67e08..37f0133 100644 --- a/assets/ipl/solutions/season3/contest2/cf460c.cpp +++ b/assets/ipl/solutions/season3/contest2/cf460c.cpp @@ -1,34 +1,34 @@ -#include -#include - -using namespace std; - -int main () { - int n, m, w; - cin >> n >> m >> w; - vector a(n); - int minn = 0x7fffffff; - for (int i = 0; i < n; i ++) { - cin >> a[i]; - minn = min(minn, a[i]); - } - int lo = minn, hi = minn + m + 1; - while (hi - lo > 1) { - int mi = lo + (hi - lo) / 2; - long long days = 0; - int cover = 0; - vector st(n); - for (int i = 0; i < n; i ++) { - if (i >= w) cover -= st[i-w]; - st[i] = max(0, mi - a[i] - cover); - days += st[i]; - cover += st[i]; - } - if (days <= m) lo = mi; - else hi = mi; - } - cout << lo << endl; - - return 0; -} - +#include +#include + +using namespace std; + +int main () { + int n, m, w; + cin >> n >> m >> w; + vector a(n); + int minn = 0x7fffffff; + for (int i = 0; i < n; i ++) { + cin >> a[i]; + minn = min(minn, a[i]); + } + int lo = minn, hi = minn + m + 1; + while (hi - lo > 1) { + int mi = lo + (hi - lo) / 2; + long long days = 0; + int cover = 0; + vector st(n); + for (int i = 0; i < n; i ++) { + if (i >= w) cover -= st[i-w]; + st[i] = max(0, mi - a[i] - cover); + days += st[i]; + cover += st[i]; + } + if (days <= m) lo = mi; + else hi = mi; + } + cout << lo << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/season3/contest2/cf598a.cpp b/assets/ipl/solutions/season3/contest2/cf598a.cpp index e9461e3..47d733b 100644 --- a/assets/ipl/solutions/season3/contest2/cf598a.cpp +++ b/assets/ipl/solutions/season3/contest2/cf598a.cpp @@ -1,19 +1,19 @@ -#include - -using namespace std; - -int main() { - int t; - cin >> t; - while (t--) { - int n; - cin >> n; - long long ans = (long long) n * (n+1) / 2; - int max_pow_2 = 1; - while (max_pow_2 * 2 <= n) max_pow_2 *= 2; - ans -= (max_pow_2 * 2 - 1) * 2; - cout << ans << endl; - } - return 0; -} - +#include + +using namespace std; + +int main() { + int t; + cin >> t; + while (t--) { + int n; + cin >> n; + long long ans = (long long) n * (n+1) / 2; + int max_pow_2 = 1; + while (max_pow_2 * 2 <= n) max_pow_2 *= 2; + ans -= (max_pow_2 * 2 - 1) * 2; + cout << ans << endl; + } + return 0; +} + diff --git a/assets/ipl/solutions/season3/contest2/uva10038.cpp b/assets/ipl/solutions/season3/contest2/uva10038.cpp index dbbbe8f..2273b2a 100644 --- a/assets/ipl/solutions/season3/contest2/uva10038.cpp +++ b/assets/ipl/solutions/season3/contest2/uva10038.cpp @@ -1,25 +1,25 @@ -#include - -using namespace std; - -bool a[10000]; - -int main () { - int n; - while (cin >> n) { - int prev = 0; - for (int i = 0; i < n; i ++) a[i] = 0; - for (int i = 0; i < n; i ++) { - int x; - cin >> x; - if (i) a[abs(x - prev)] = true; - prev = x; - } - bool flag = true; - for (int i = 1; i < n; i ++) flag &= a[i]; - if (flag) cout << "Jolly" << endl; - else cout << "Not jolly" << endl; - } - return 0; -} - +#include + +using namespace std; + +bool a[10000]; + +int main () { + int n; + while (cin >> n) { + int prev = 0; + for (int i = 0; i < n; i ++) a[i] = 0; + for (int i = 0; i < n; i ++) { + int x; + cin >> x; + if (i) a[abs(x - prev)] = true; + prev = x; + } + bool flag = true; + for (int i = 1; i < n; i ++) flag &= a[i]; + if (flag) cout << "Jolly" << endl; + else cout << "Not jolly" << endl; + } + return 0; +} + diff --git a/assets/ipl/solutions/season3/contest3/cf463b.cpp b/assets/ipl/solutions/season3/contest3/cf463b.cpp index bc46911..64ca8a4 100644 --- a/assets/ipl/solutions/season3/contest3/cf463b.cpp +++ b/assets/ipl/solutions/season3/contest3/cf463b.cpp @@ -1,13 +1,13 @@ -#include - -using namespace std; - -int main () { - int n; - cin >> n; - int ans = 0; - while (n--) { int h; cin >> h; ans = max(ans, h); } - cout << ans << endl; - return 0; -} - +#include + +using namespace std; + +int main () { + int n; + cin >> n; + int ans = 0; + while (n--) { int h; cin >> h; ans = max(ans, h); } + cout << ans << endl; + return 0; +} + diff --git a/assets/ipl/solutions/season3/contest3/cf939a.cpp b/assets/ipl/solutions/season3/contest3/cf939a.cpp index 85ceec0..ba23b84 100644 --- a/assets/ipl/solutions/season3/contest3/cf939a.cpp +++ b/assets/ipl/solutions/season3/contest3/cf939a.cpp @@ -1,15 +1,15 @@ -#include -#include - -using namespace std; - -int main () { - int n; - cin >> n; - vector a(n+1); - for (int i = 1; i <= n; i ++) cin >> a[i]; - for (int i = 1; i <= n; i ++) if (a[a[a[i]]] == i) { cout << "YES" << endl; return 0; } - cout << "NO" << endl; - return 0; -} - +#include +#include + +using namespace std; + +int main () { + int n; + cin >> n; + vector a(n+1); + for (int i = 1; i <= n; i ++) cin >> a[i]; + for (int i = 1; i <= n; i ++) if (a[a[a[i]]] == i) { cout << "YES" << endl; return 0; } + cout << "NO" << endl; + return 0; +} + diff --git a/assets/ipl/solutions/season3/contest3/cf939c.cpp b/assets/ipl/solutions/season3/contest3/cf939c.cpp index e05bd7b..1ce5570 100644 --- a/assets/ipl/solutions/season3/contest3/cf939c.cpp +++ b/assets/ipl/solutions/season3/contest3/cf939c.cpp @@ -1,27 +1,27 @@ -#include -#include - -using namespace std; - -int main () { - int n; - cin >> n; - vector a(n); - for (int i = 0; i < n; i++) cin >> a[i]; - int s, f; - cin >> s >> f; - int ans = 0; - int real_ans = n; - int sum = 0, best = 0; - for (int i = 0; i < f-s; i++) sum += a[i]; - for (int pos = 0; pos < n; pos++) { - sum -= a[pos]; sum += a[(pos + (f-s)) % n]; - if (sum > best) { best = sum; ans = pos + 1; real_ans = (s - ans + n - 1) % n + 1; } - else if (sum == best) { int new_real_ans = (s - (pos + 1) + n - 1) % n + 1; if (new_real_ans < real_ans) { real_ans = new_real_ans; ans = pos + 1; }} - } - // in time zone ans+1 the start time is s - cout << real_ans << endl; - - return 0; -} - +#include +#include + +using namespace std; + +int main () { + int n; + cin >> n; + vector a(n); + for (int i = 0; i < n; i++) cin >> a[i]; + int s, f; + cin >> s >> f; + int ans = 0; + int real_ans = n; + int sum = 0, best = 0; + for (int i = 0; i < f-s; i++) sum += a[i]; + for (int pos = 0; pos < n; pos++) { + sum -= a[pos]; sum += a[(pos + (f-s)) % n]; + if (sum > best) { best = sum; ans = pos + 1; real_ans = (s - ans + n - 1) % n + 1; } + else if (sum == best) { int new_real_ans = (s - (pos + 1) + n - 1) % n + 1; if (new_real_ans < real_ans) { real_ans = new_real_ans; ans = pos + 1; }} + } + // in time zone ans+1 the start time is s + cout << real_ans << endl; + + return 0; +} + diff --git a/assets/ipl/solutions/season3/contest3/cf939d.cpp b/assets/ipl/solutions/season3/contest3/cf939d.cpp index faa256a..258c115 100644 --- a/assets/ipl/solutions/season3/contest3/cf939d.cpp +++ b/assets/ipl/solutions/season3/contest3/cf939d.cpp @@ -1,40 +1,40 @@ -#include -#include -#include - -using namespace std; - -int main () { - int n; cin >> n; - string s, t; - cin >> s >> t; - bool a[26][26]; - for (int i = 0; i < 26; i++) for (int j = 0; j < 26; j++) a[i][j] = 0; - for (int i = 0; i < s.length(); i++) { - a[s[i] - 'a'][t[i] - 'a'] = a[t[i] - 'a'][s[i] - 'a'] = 1; - } - bool vis[26]; - for (int i = 0; i < 26; i++) vis[i] = 0; - vector > ans; - for (int i = 0; i < 26; i++) { - if (!vis[i]) { - vector rea; - queue q; q.push(i); vis[i] = 1; - while (!q.empty()) { - int u = q.front(); q.pop(); - for (int v = 0; v < 26; v++) if (a[u][v] && !vis[v]) { - vis[v] = 1; - q.push(v); - rea.push_back(v); - } - } - for (int v : rea) ans.push_back({i, v}); - } - } - cout << ans.size() << endl; - for (auto p : ans) { - cout << char('a' + p.first) << ' ' << char('a' + p.second) << endl; - } - return 0; -} - +#include +#include +#include + +using namespace std; + +int main () { + int n; cin >> n; + string s, t; + cin >> s >> t; + bool a[26][26]; + for (int i = 0; i < 26; i++) for (int j = 0; j < 26; j++) a[i][j] = 0; + for (int i = 0; i < s.length(); i++) { + a[s[i] - 'a'][t[i] - 'a'] = a[t[i] - 'a'][s[i] - 'a'] = 1; + } + bool vis[26]; + for (int i = 0; i < 26; i++) vis[i] = 0; + vector > ans; + for (int i = 0; i < 26; i++) { + if (!vis[i]) { + vector rea; + queue q; q.push(i); vis[i] = 1; + while (!q.empty()) { + int u = q.front(); q.pop(); + for (int v = 0; v < 26; v++) if (a[u][v] && !vis[v]) { + vis[v] = 1; + q.push(v); + rea.push_back(v); + } + } + for (int v : rea) ans.push_back({i, v}); + } + } + cout << ans.size() << endl; + for (auto p : ans) { + cout << char('a' + p.first) << ' ' << char('a' + p.second) << endl; + } + return 0; +} + diff --git a/assets/ipl/solutions/season3/contest3/cf939e.cpp b/assets/ipl/solutions/season3/contest3/cf939e.cpp index 5538c37..9473f9f 100644 --- a/assets/ipl/solutions/season3/contest3/cf939e.cpp +++ b/assets/ipl/solutions/season3/contest3/cf939e.cpp @@ -1,32 +1,32 @@ -#include -#include -#include -#include -#define LL long long - -using namespace std; - -int main () { - int q; - cin >> q; - vector a; - int cnt = 0; LL sum = 0; - while (q--) { - int t; scanf("%d", &t); - if (t == 1) { - int x; scanf("%d", &x); - while (cnt < a.size()) { - if ((sum + x) > (LL)a[cnt] * (cnt + 1)) { - sum += a[cnt++]; - } else break; - } - a.push_back(x); - } else { - printf("%.8lf\n", a[a.size()-1] - (double) (sum + a[a.size()-1]) / (cnt + 1)); - } - } - - - return 0; -} - +#include +#include +#include +#include +#define LL long long + +using namespace std; + +int main () { + int q; + cin >> q; + vector a; + int cnt = 0; LL sum = 0; + while (q--) { + int t; scanf("%d", &t); + if (t == 1) { + int x; scanf("%d", &x); + while (cnt < a.size()) { + if ((sum + x) > (LL)a[cnt] * (cnt + 1)) { + sum += a[cnt++]; + } else break; + } + a.push_back(x); + } else { + printf("%.8lf\n", a[a.size()-1] - (double) (sum + a[a.size()-1]) / (cnt + 1)); + } + } + + + return 0; +} + diff --git a/assets/ipl/solutions/season3/practice/ab.cpp b/assets/ipl/solutions/season3/practice/ab.cpp index c7bf9ce..c9d5f2c 100644 --- a/assets/ipl/solutions/season3/practice/ab.cpp +++ b/assets/ipl/solutions/season3/practice/ab.cpp @@ -1,12 +1,12 @@ -#include - -using namespace std; - -int main () { - int a, b; - while (cin >> a >> b) { - cout << a + b << endl; - } - return 0; -} - +#include + +using namespace std; + +int main () { + int a, b; + while (cin >> a >> b) { + cout << a + b << endl; + } + return 0; +} + diff --git a/assets/ipl/solutions/season3/practice/btree.cpp b/assets/ipl/solutions/season3/practice/btree.cpp index b97ba16..48e1969 100644 --- a/assets/ipl/solutions/season3/practice/btree.cpp +++ b/assets/ipl/solutions/season3/practice/btree.cpp @@ -1,35 +1,35 @@ -#include -#include -#include - -using namespace std; - -int main() { - long long Q, u, v, n; - scanf("%lld", &Q); - while (Q--) { - scanf("%lld %lld %lld", &n, &u, &v); - if (u > v) - swap(u, v); - - while (u != v) { - if (v > u) { - if (v % 2 == 1) { - if (n % 2 == 0) - n -= 1; - } - else { - if (n % 2 == 1) - n -= 1; - } - v >>= 1; - n >>= 1; - } - else { - u >>= 1; - } - } - printf("%lld\n", n); - } - return 0; -} +#include +#include +#include + +using namespace std; + +int main() { + long long Q, u, v, n; + scanf("%lld", &Q); + while (Q--) { + scanf("%lld %lld %lld", &n, &u, &v); + if (u > v) + swap(u, v); + + while (u != v) { + if (v > u) { + if (v % 2 == 1) { + if (n % 2 == 0) + n -= 1; + } + else { + if (n % 2 == 1) + n -= 1; + } + v >>= 1; + n >>= 1; + } + else { + u >>= 1; + } + } + printf("%lld\n", n); + } + return 0; +} diff --git a/assets/ipl/solutions/season3/practice/puzzle.cpp b/assets/ipl/solutions/season3/practice/puzzle.cpp index c3a9efb..dfc7db4 100644 --- a/assets/ipl/solutions/season3/practice/puzzle.cpp +++ b/assets/ipl/solutions/season3/practice/puzzle.cpp @@ -1,20 +1,20 @@ -#include -#include -#include - -using namespace std; - -const int maxN = 1e3 + 10; - -int a[maxN], m, n, res; - -int main() { - scanf("%d %d", &n, &m); - for (int i = 0; i < m; ++i) - scanf("%d", &a[i]); - sort(a, a + m); - res = 1e9; - for (int i = n - 1; i < m; ++i) - res = min(res, a[i] - a[i - n + 1]); - cout << res << endl; -} +#include +#include +#include + +using namespace std; + +const int maxN = 1e3 + 10; + +int a[maxN], m, n, res; + +int main() { + scanf("%d %d", &n, &m); + for (int i = 0; i < m; ++i) + scanf("%d", &a[i]); + sort(a, a + m); + res = 1e9; + for (int i = n - 1; i < m; ++i) + res = min(res, a[i] - a[i - n + 1]); + cout << res << endl; +} diff --git a/assets/ipl/solutions/season3/practice/speed.cpp b/assets/ipl/solutions/season3/practice/speed.cpp index 2f3eaab..5fc4dd1 100644 --- a/assets/ipl/solutions/season3/practice/speed.cpp +++ b/assets/ipl/solutions/season3/practice/speed.cpp @@ -1,22 +1,22 @@ -#include - -using namespace std; - -int main () { - int n; - while (1) { - cin >> n; - if (n == -1) break; - int ans = 0; - int prev_time = 0; - for (int i = 0; i < n; i ++) { - int v, t; - cin >> v >> t; - ans += v * (t - prev_time); - prev_time = t; - } - cout << ans << " miles" << endl; - } - return 0; -} - +#include + +using namespace std; + +int main () { + int n; + while (1) { + cin >> n; + if (n == -1) break; + int ans = 0; + int prev_time = 0; + for (int i = 0; i < n; i ++) { + int v, t; + cin >> v >> t; + ans += v * (t - prev_time); + prev_time = t; + } + cout << ans << " miles" << endl; + } + return 0; +} + diff --git a/assets/ipl/solutions/season3/practice/team.cpp b/assets/ipl/solutions/season3/practice/team.cpp index 2e973a7..4465ac0 100644 --- a/assets/ipl/solutions/season3/practice/team.cpp +++ b/assets/ipl/solutions/season3/practice/team.cpp @@ -1,40 +1,40 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -const int maxN = 5e6 + 10; - -using namespace std; - -int n, m, f[maxN]; - -int main() { - cin >> n >> m; - if ((n + 1) * 2 < m || m < n - 1) { - cout << -1; - return 0; - } - for (int i = 1; i <= n + 2 * (n + 1); ++i) - f[i] = -1; - for (int i = 3; i <= 3 * n + 2; i += 3) { - f[i] = 0; - if (m) - f[i + 1] = 1, --m; - } - for (int i = 1; i <= 3 * n + 2; ++i) { - if (!m) break; - if (f[i] == -1) f[i] = 1, --m; - } - for (int i = 1; i <= 3 * n + 2; ++i) - if (f[i] >= 0) - printf("%d", f[i]); -} +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const int maxN = 5e6 + 10; + +using namespace std; + +int n, m, f[maxN]; + +int main() { + cin >> n >> m; + if ((n + 1) * 2 < m || m < n - 1) { + cout << -1; + return 0; + } + for (int i = 1; i <= n + 2 * (n + 1); ++i) + f[i] = -1; + for (int i = 3; i <= 3 * n + 2; i += 3) { + f[i] = 0; + if (m) + f[i + 1] = 1, --m; + } + for (int i = 1; i <= 3 * n + 2; ++i) { + if (!m) break; + if (f[i] == -1) f[i] = 1, --m; + } + for (int i = 1; i <= 3 * n + 2; ++i) + if (f[i] >= 0) + printf("%d", f[i]); +} diff --git a/contact.html b/contact.html index be03ee5..d7e2459 100644 --- a/contact.html +++ b/contact.html @@ -1,47 +1,47 @@ ---- -layout: default -title: Contact ---- - - - -
-

Admin Team

- Chair: Dolly Ding
- Captain: Gary Liu
- Technical Officers: Zihan Wang, Lan Dao, Dylan Irlbeck, Yen-Hsiang Chang
- Corporate Officers: Scott Kim, Eric Wang
- Administrative Officer: Vivek Gupta
-
-

Coaches

- Coach: Mattox Beckman
- Co-coach: Zhengkai Wu
-
-

Former Admin Members

- Jingbo Shang, Coach
- Akashdeep Deb, Chair
- Matthew Worley, Chair
- Victor Gao, Captain
- Yuting Zhang, Vice Captain
- Uttam Thakore, Coach
-
+--- +layout: default +title: Contact +--- + + + +
+

Admin Team

+ Chair: Dolly Ding
+ Captain: Gary Liu
+ Technical Officers: Zihan Wang, Lan Dao, Dylan Irlbeck, Yen-Hsiang Chang
+ Corporate Officers: Scott Kim, Eric Wang
+ Administrative Officer: Vivek Gupta
+
+

Coaches

+ Coach: Mattox Beckman
+ Co-coach: Zhengkai Wu
+
+

Former Admin Members

+ Jingbo Shang, Coach
+ Akashdeep Deb, Chair
+ Matthew Worley, Chair
+ Victor Gao, Captain
+ Yuting Zhang, Vice Captain
+ Uttam Thakore, Coach
+
diff --git a/content.html b/content.html index 16f462a..4638d17 100644 --- a/content.html +++ b/content.html @@ -1,94 +1,94 @@ - - - -2018 Fall Contest 11 Editorial
-A(Java) -B(C++) -C(Java) -D(Java) -E(C++) -F(Java) -

-2018 Fall Contest 10 Editorial
-A(C++) -B(C++) -C(C++) -D(C++) -E(Java) -F(C++) -

-2018 Fall Contest 09 Editorial
-A(C++) -B(C++) -C(Java) -D(Java) -E(Java) -F(Java) -

-2018 Fall Triage Slides
-
-2018 Fall Contest 07 Editorial
-A(Java) -B(Java) -C(Java) -D(Java) -E(Java) -E(C++) -F(C++) -

-2018 Fall Contest 06 Editorial
-A(Java) -B(C++) -C(Python) -D(C++) -E(C++) -E(Java) -F(C++) -

-2018 Fall Contest 05 Editorial
-A(C++) -B(C++) -C(C++) -D(C++) -E(Java) -

-2018 Fall Contest 04 Editorial
-A(C++) -B(C++) -C(Java) -D(C++) -E(C++) -F(C++) -F(Java) -G(Java) -

-2018 Fall Contest 03 Editorial
-A(Java) -B(Java) -C(Java) -D(Java) -D(C++) -E(Java) -F(Java) -G(Java) -

-2018 Fall Contest 02 Editorial
-A(C++) -B(C++) -C(C++) -D(C++) -E(C++) -F(C++) -G(C++) -

-2018 Fall Contest 01 Editorial
-A(C++) -B(C++) -C(C++) -D(C++) -E(Java) -F(C++) -G(C++) -G(Java) -

-2018 Fall Intro Slides
+ + + +2018 Fall Contest 11 Editorial
+A(Java) +B(C++) +C(Java) +D(Java) +E(C++) +F(Java) +

+2018 Fall Contest 10 Editorial
+A(C++) +B(C++) +C(C++) +D(C++) +E(Java) +F(C++) +

+2018 Fall Contest 09 Editorial
+A(C++) +B(C++) +C(Java) +D(Java) +E(Java) +F(Java) +

+2018 Fall Triage Slides
+
+2018 Fall Contest 07 Editorial
+A(Java) +B(Java) +C(Java) +D(Java) +E(Java) +E(C++) +F(C++) +

+2018 Fall Contest 06 Editorial
+A(Java) +B(C++) +C(Python) +D(C++) +E(C++) +E(Java) +F(C++) +

+2018 Fall Contest 05 Editorial
+A(C++) +B(C++) +C(C++) +D(C++) +E(Java) +

+2018 Fall Contest 04 Editorial
+A(C++) +B(C++) +C(Java) +D(C++) +E(C++) +F(C++) +F(Java) +G(Java) +

+2018 Fall Contest 03 Editorial
+A(Java) +B(Java) +C(Java) +D(Java) +D(C++) +E(Java) +F(Java) +G(Java) +

+2018 Fall Contest 02 Editorial
+A(C++) +B(C++) +C(C++) +D(C++) +E(C++) +F(C++) +G(C++) +

+2018 Fall Contest 01 Editorial
+A(C++) +B(C++) +C(C++) +D(C++) +E(Java) +F(C++) +G(C++) +G(Java) +

+2018 Fall Intro Slides
diff --git a/css/fullcalendar.css b/css/fullcalendar.css index a31ce83..f4647c6 100755 --- a/css/fullcalendar.css +++ b/css/fullcalendar.css @@ -1,601 +1,601 @@ -/*! - * FullCalendar v2.0.2 Stylesheet - * Docs & License: http://arshaw.com/fullcalendar/ - * (c) 2013 Adam Shaw - */ - - -.fc { - direction: ltr; - text-align: left; - } - -.fc table { - border-collapse: collapse; - border-spacing: 0; - } - -html .fc, -.fc table { - font-size: 1em; - } - -.fc td, -.fc th { - padding: 0; - vertical-align: top; - } - - - -/* Header -------------------------------------------------------------------------*/ - -.fc-header td { - white-space: nowrap; - } - -.fc-header-left { - width: 25%; - text-align: left; - } - -.fc-header-center { - text-align: center; - } - -.fc-header-right { - width: 25%; - text-align: right; - } - -.fc-header-title { - display: inline-block; - vertical-align: top; - } - -.fc-header-title h2 { - margin-top: 0; - white-space: nowrap; - } - -.fc .fc-header-space { - padding-left: 10px; - } - -.fc-header .fc-button { - margin-bottom: 1em; - vertical-align: top; - } - -/* buttons edges butting together */ - -.fc-header .fc-button { - margin-right: -1px; - } - -.fc-header .fc-corner-right, /* non-theme */ -.fc-header .ui-corner-right { /* theme */ - margin-right: 0; /* back to normal */ - } - -/* button layering (for border precedence) */ - -.fc-header .fc-state-hover, -.fc-header .ui-state-hover { - z-index: 2; - } - -.fc-header .fc-state-down { - z-index: 3; - } - -.fc-header .fc-state-active, -.fc-header .ui-state-active { - z-index: 4; - } - - - -/* Content -------------------------------------------------------------------------*/ - -.fc-content { - position: relative; - z-index: 1; /* scopes all other z-index's to be inside this container */ - clear: both; - zoom: 1; /* for IE7, gives accurate coordinates for [un]freezeContentHeight */ - } - -.fc-view { - position: relative; - width: 100%; - overflow: hidden; - } - - - -/* Cell Styles -------------------------------------------------------------------------*/ - -.fc-widget-header, /* , usually */ -.fc-widget-content { /* , usually */ - border: 1px solid #ddd; - } - -.fc-state-highlight { /* today cell */ /* TODO: add .fc-today to */ - background: #fcf8e3; - } - -.fc-cell-overlay { /* semi-transparent rectangle while dragging */ - background: #bce8f1; - opacity: .3; - filter: alpha(opacity=30); /* for IE */ - } - - - -/* Buttons -------------------------------------------------------------------------*/ - -.fc-button { - position: relative; - display: inline-block; - padding: 0 .6em; - overflow: hidden; - height: 1.9em; - line-height: 1.9em; - white-space: nowrap; - cursor: pointer; - } - -.fc-state-default { /* non-theme */ - border: 1px solid; - } - -.fc-state-default.fc-corner-left { /* non-theme */ - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; - } - -.fc-state-default.fc-corner-right { /* non-theme */ - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; - } - -/* - Our default prev/next buttons use HTML entities like ‹ › « » - and we'll try to make them look good cross-browser. -*/ - -.fc-button .fc-icon { - margin: 0 .1em; - font-size: 2em; - font-family: "Courier New", Courier, monospace; - vertical-align: baseline; /* for IE7 */ - } - -.fc-icon-left-single-arrow:after { - content: "\02039"; - font-weight: bold; - } - -.fc-icon-right-single-arrow:after { - content: "\0203A"; - font-weight: bold; - } - -.fc-icon-left-double-arrow:after { - content: "\000AB"; - } - -.fc-icon-right-double-arrow:after { - content: "\000BB"; - } - -/* icon (for jquery ui) */ - -.fc-button .ui-icon { - position: relative; - top: 50%; - float: left; - margin-top: -8px; /* we know jqui icons are always 16px tall */ - } - -/* - button states - borrowed from twitter bootstrap (http://twitter.github.com/bootstrap/) -*/ - -.fc-state-default { - background-color: #f5f5f5; - background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); - background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); - background-repeat: repeat-x; - border-color: #e6e6e6 #e6e6e6 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - color: #333; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - } - -.fc-state-hover, -.fc-state-down, -.fc-state-active, -.fc-state-disabled { - color: #333333; - background-color: #e6e6e6; - } - -.fc-state-hover { - color: #333333; - text-decoration: none; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; - } - -.fc-state-down, -.fc-state-active { - background-color: #cccccc; - background-image: none; - outline: 0; - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - } - -.fc-state-disabled { - cursor: default; - background-image: none; - opacity: 0.65; - filter: alpha(opacity=65); - box-shadow: none; - } - - - -/* Global Event Styles -------------------------------------------------------------------------*/ - -.fc-event-container > * { - z-index: 8; - } - -.fc-event-container > .ui-draggable-dragging, -.fc-event-container > .ui-resizable-resizing { - z-index: 9; - } - -.fc-event { - border: 1px solid #3a87ad; /* default BORDER color */ - background-color: #3a87ad; /* default BACKGROUND color */ - color: #fff; /* default TEXT color */ - font-size: .85em; - cursor: default; - } - -a.fc-event { - text-decoration: none; - } - -a.fc-event, -.fc-event-draggable { - cursor: pointer; - } - -.fc-rtl .fc-event { - text-align: right; - } - -.fc-event-inner { - width: 100%; - height: 100%; - overflow: hidden; - } - -.fc-event-time, -.fc-event-title { - padding: 0 1px; - } - -.fc .ui-resizable-handle { - display: block; - position: absolute; - z-index: 99999; - overflow: hidden; /* hacky spaces (IE6/7) */ - font-size: 300%; /* */ - line-height: 50%; /* */ - } - - - -/* Horizontal Events -------------------------------------------------------------------------*/ - -.fc-event-hori { - border-width: 1px 0; - margin-bottom: 1px; - } - -.fc-ltr .fc-event-hori.fc-event-start, -.fc-rtl .fc-event-hori.fc-event-end { - border-left-width: 1px; - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; - } - -.fc-ltr .fc-event-hori.fc-event-end, -.fc-rtl .fc-event-hori.fc-event-start { - border-right-width: 1px; - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; - } - -/* resizable */ - -.fc-event-hori .ui-resizable-e { - top: 0 !important; /* importants override pre jquery ui 1.7 styles */ - right: -3px !important; - width: 7px !important; - height: 100% !important; - cursor: e-resize; - } - -.fc-event-hori .ui-resizable-w { - top: 0 !important; - left: -3px !important; - width: 7px !important; - height: 100% !important; - cursor: w-resize; - } - -.fc-event-hori .ui-resizable-handle { - _padding-bottom: 14px; /* IE6 had 0 height */ - } - - - -/* Reusable Separate-border Table -------------------------------------------------------------*/ - -table.fc-border-separate { - border-collapse: separate; - } - -.fc-border-separate th, -.fc-border-separate td { - border-width: 1px 0 0 1px; - } - -.fc-border-separate th.fc-last, -.fc-border-separate td.fc-last { - border-right-width: 1px; - } - -.fc-border-separate tr.fc-last th, -.fc-border-separate tr.fc-last td { - border-bottom-width: 1px; - } - -.fc-border-separate tbody tr.fc-first td, -.fc-border-separate tbody tr.fc-first th { - border-top-width: 0; - } - - - -/* Month View, Basic Week View, Basic Day View -------------------------------------------------------------------------*/ - -.fc-grid th { - text-align: center; - } - -.fc .fc-week-number { - width: 22px; - text-align: center; - } - -.fc .fc-week-number div { - padding: 0 2px; - } - -.fc-grid .fc-day-number { - float: right; - padding: 0 2px; - } - -.fc-grid .fc-other-month .fc-day-number { - opacity: 0.3; - filter: alpha(opacity=30); /* for IE */ - /* opacity with small font can sometimes look too faded - might want to set the 'color' property instead - making day-numbers bold also fixes the problem */ - } - -.fc-grid .fc-day-content { - clear: both; - padding: 2px 2px 1px; /* distance between events and day edges */ - } - -/* event styles */ - -.fc-grid .fc-event-time { - font-weight: bold; - } - -/* right-to-left */ - -.fc-rtl .fc-grid .fc-day-number { - float: left; - } - -.fc-rtl .fc-grid .fc-event-time { - float: right; - } - - - -/* Agenda Week View, Agenda Day View -------------------------------------------------------------------------*/ - -.fc-agenda table { - border-collapse: separate; - } - -.fc-agenda-days th { - text-align: center; - } - -.fc-agenda .fc-agenda-axis { - width: 50px; - padding: 0 4px; - vertical-align: middle; - text-align: right; - font-weight: normal; - } - -.fc-agenda-slots .fc-agenda-axis { - white-space: nowrap; - } - -.fc-agenda .fc-week-number { - font-weight: bold; - } - -.fc-agenda .fc-day-content { - padding: 2px 2px 1px; - } - -/* make axis border take precedence */ - -.fc-agenda-days .fc-agenda-axis { - border-right-width: 1px; - } - -.fc-agenda-days .fc-col0 { - border-left-width: 0; - } - -/* all-day area */ - -.fc-agenda-allday th { - border-width: 0 1px; - } - -.fc-agenda-allday .fc-day-content { - min-height: 34px; /* TODO: doesnt work well in quirksmode */ - _height: 34px; - } - -/* divider (between all-day and slots) */ - -.fc-agenda-divider-inner { - height: 2px; - overflow: hidden; - } - -.fc-widget-header .fc-agenda-divider-inner { - background: #eee; - } - -/* slot rows */ - -.fc-agenda-slots th { - border-width: 1px 1px 0; - } - -.fc-agenda-slots td { - border-width: 1px 0 0; - background: none; - } - -.fc-agenda-slots td div { - height: 20px; - } - -.fc-agenda-slots tr.fc-slot0 th, -.fc-agenda-slots tr.fc-slot0 td { - border-top-width: 0; - } - -.fc-agenda-slots tr.fc-minor th, -.fc-agenda-slots tr.fc-minor td { - border-top-style: dotted; - } - -.fc-agenda-slots tr.fc-minor th.ui-widget-header { - *border-top-style: solid; /* doesn't work with background in IE6/7 */ - } - - - -/* Vertical Events -------------------------------------------------------------------------*/ - -.fc-event-vert { - border-width: 0 1px; - } - -.fc-event-vert.fc-event-start { - border-top-width: 1px; - border-top-left-radius: 3px; - border-top-right-radius: 3px; - } - -.fc-event-vert.fc-event-end { - border-bottom-width: 1px; - border-bottom-left-radius: 3px; - border-bottom-right-radius: 3px; - } - -.fc-event-vert .fc-event-time { - white-space: nowrap; - font-size: 10px; - } - -.fc-event-vert .fc-event-inner { - position: relative; - z-index: 2; - } - -.fc-event-vert .fc-event-bg { /* makes the event lighter w/ a semi-transparent overlay */ - position: absolute; - z-index: 1; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #fff; - opacity: .25; - filter: alpha(opacity=25); - } - -.fc .ui-draggable-dragging .fc-event-bg, /* TODO: something nicer like .fc-opacity */ -.fc-select-helper .fc-event-bg { - display: none\9; /* for IE6/7/8. nested opacity filters while dragging don't work */ - } - -/* resizable */ - -.fc-event-vert .ui-resizable-s { - bottom: 0 !important; /* importants override pre jquery ui 1.7 styles */ - width: 100% !important; - height: 8px !important; - overflow: hidden !important; - line-height: 8px !important; - font-size: 11px !important; - font-family: monospace; - text-align: center; - cursor: s-resize; - } - -.fc-agenda .ui-resizable-resizing { /* TODO: better selector */ - _overflow: hidden; - } - - +/*! + * FullCalendar v2.0.2 Stylesheet + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */ + + +.fc { + direction: ltr; + text-align: left; + } + +.fc table { + border-collapse: collapse; + border-spacing: 0; + } + +html .fc, +.fc table { + font-size: 1em; + } + +.fc td, +.fc th { + padding: 0; + vertical-align: top; + } + + + +/* Header +------------------------------------------------------------------------*/ + +.fc-header td { + white-space: nowrap; + } + +.fc-header-left { + width: 25%; + text-align: left; + } + +.fc-header-center { + text-align: center; + } + +.fc-header-right { + width: 25%; + text-align: right; + } + +.fc-header-title { + display: inline-block; + vertical-align: top; + } + +.fc-header-title h2 { + margin-top: 0; + white-space: nowrap; + } + +.fc .fc-header-space { + padding-left: 10px; + } + +.fc-header .fc-button { + margin-bottom: 1em; + vertical-align: top; + } + +/* buttons edges butting together */ + +.fc-header .fc-button { + margin-right: -1px; + } + +.fc-header .fc-corner-right, /* non-theme */ +.fc-header .ui-corner-right { /* theme */ + margin-right: 0; /* back to normal */ + } + +/* button layering (for border precedence) */ + +.fc-header .fc-state-hover, +.fc-header .ui-state-hover { + z-index: 2; + } + +.fc-header .fc-state-down { + z-index: 3; + } + +.fc-header .fc-state-active, +.fc-header .ui-state-active { + z-index: 4; + } + + + +/* Content +------------------------------------------------------------------------*/ + +.fc-content { + position: relative; + z-index: 1; /* scopes all other z-index's to be inside this container */ + clear: both; + zoom: 1; /* for IE7, gives accurate coordinates for [un]freezeContentHeight */ + } + +.fc-view { + position: relative; + width: 100%; + overflow: hidden; + } + + + +/* Cell Styles +------------------------------------------------------------------------*/ + +.fc-widget-header, /* , usually */ +.fc-widget-content { /* , usually */ + border: 1px solid #ddd; + } + +.fc-state-highlight { /* today cell */ /* TODO: add .fc-today to */ + background: #fcf8e3; + } + +.fc-cell-overlay { /* semi-transparent rectangle while dragging */ + background: #bce8f1; + opacity: .3; + filter: alpha(opacity=30); /* for IE */ + } + + + +/* Buttons +------------------------------------------------------------------------*/ + +.fc-button { + position: relative; + display: inline-block; + padding: 0 .6em; + overflow: hidden; + height: 1.9em; + line-height: 1.9em; + white-space: nowrap; + cursor: pointer; + } + +.fc-state-default { /* non-theme */ + border: 1px solid; + } + +.fc-state-default.fc-corner-left { /* non-theme */ + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + } + +.fc-state-default.fc-corner-right { /* non-theme */ + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + } + +/* + Our default prev/next buttons use HTML entities like ‹ › « » + and we'll try to make them look good cross-browser. +*/ + +.fc-button .fc-icon { + margin: 0 .1em; + font-size: 2em; + font-family: "Courier New", Courier, monospace; + vertical-align: baseline; /* for IE7 */ + } + +.fc-icon-left-single-arrow:after { + content: "\02039"; + font-weight: bold; + } + +.fc-icon-right-single-arrow:after { + content: "\0203A"; + font-weight: bold; + } + +.fc-icon-left-double-arrow:after { + content: "\000AB"; + } + +.fc-icon-right-double-arrow:after { + content: "\000BB"; + } + +/* icon (for jquery ui) */ + +.fc-button .ui-icon { + position: relative; + top: 50%; + float: left; + margin-top: -8px; /* we know jqui icons are always 16px tall */ + } + +/* + button states + borrowed from twitter bootstrap (http://twitter.github.com/bootstrap/) +*/ + +.fc-state-default { + background-color: #f5f5f5; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + color: #333; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + } + +.fc-state-hover, +.fc-state-down, +.fc-state-active, +.fc-state-disabled { + color: #333333; + background-color: #e6e6e6; + } + +.fc-state-hover { + color: #333333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; + } + +.fc-state-down, +.fc-state-active { + background-color: #cccccc; + background-image: none; + outline: 0; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + } + +.fc-state-disabled { + cursor: default; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + box-shadow: none; + } + + + +/* Global Event Styles +------------------------------------------------------------------------*/ + +.fc-event-container > * { + z-index: 8; + } + +.fc-event-container > .ui-draggable-dragging, +.fc-event-container > .ui-resizable-resizing { + z-index: 9; + } + +.fc-event { + border: 1px solid #3a87ad; /* default BORDER color */ + background-color: #3a87ad; /* default BACKGROUND color */ + color: #fff; /* default TEXT color */ + font-size: .85em; + cursor: default; + } + +a.fc-event { + text-decoration: none; + } + +a.fc-event, +.fc-event-draggable { + cursor: pointer; + } + +.fc-rtl .fc-event { + text-align: right; + } + +.fc-event-inner { + width: 100%; + height: 100%; + overflow: hidden; + } + +.fc-event-time, +.fc-event-title { + padding: 0 1px; + } + +.fc .ui-resizable-handle { + display: block; + position: absolute; + z-index: 99999; + overflow: hidden; /* hacky spaces (IE6/7) */ + font-size: 300%; /* */ + line-height: 50%; /* */ + } + + + +/* Horizontal Events +------------------------------------------------------------------------*/ + +.fc-event-hori { + border-width: 1px 0; + margin-bottom: 1px; + } + +.fc-ltr .fc-event-hori.fc-event-start, +.fc-rtl .fc-event-hori.fc-event-end { + border-left-width: 1px; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + } + +.fc-ltr .fc-event-hori.fc-event-end, +.fc-rtl .fc-event-hori.fc-event-start { + border-right-width: 1px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + } + +/* resizable */ + +.fc-event-hori .ui-resizable-e { + top: 0 !important; /* importants override pre jquery ui 1.7 styles */ + right: -3px !important; + width: 7px !important; + height: 100% !important; + cursor: e-resize; + } + +.fc-event-hori .ui-resizable-w { + top: 0 !important; + left: -3px !important; + width: 7px !important; + height: 100% !important; + cursor: w-resize; + } + +.fc-event-hori .ui-resizable-handle { + _padding-bottom: 14px; /* IE6 had 0 height */ + } + + + +/* Reusable Separate-border Table +------------------------------------------------------------*/ + +table.fc-border-separate { + border-collapse: separate; + } + +.fc-border-separate th, +.fc-border-separate td { + border-width: 1px 0 0 1px; + } + +.fc-border-separate th.fc-last, +.fc-border-separate td.fc-last { + border-right-width: 1px; + } + +.fc-border-separate tr.fc-last th, +.fc-border-separate tr.fc-last td { + border-bottom-width: 1px; + } + +.fc-border-separate tbody tr.fc-first td, +.fc-border-separate tbody tr.fc-first th { + border-top-width: 0; + } + + + +/* Month View, Basic Week View, Basic Day View +------------------------------------------------------------------------*/ + +.fc-grid th { + text-align: center; + } + +.fc .fc-week-number { + width: 22px; + text-align: center; + } + +.fc .fc-week-number div { + padding: 0 2px; + } + +.fc-grid .fc-day-number { + float: right; + padding: 0 2px; + } + +.fc-grid .fc-other-month .fc-day-number { + opacity: 0.3; + filter: alpha(opacity=30); /* for IE */ + /* opacity with small font can sometimes look too faded + might want to set the 'color' property instead + making day-numbers bold also fixes the problem */ + } + +.fc-grid .fc-day-content { + clear: both; + padding: 2px 2px 1px; /* distance between events and day edges */ + } + +/* event styles */ + +.fc-grid .fc-event-time { + font-weight: bold; + } + +/* right-to-left */ + +.fc-rtl .fc-grid .fc-day-number { + float: left; + } + +.fc-rtl .fc-grid .fc-event-time { + float: right; + } + + + +/* Agenda Week View, Agenda Day View +------------------------------------------------------------------------*/ + +.fc-agenda table { + border-collapse: separate; + } + +.fc-agenda-days th { + text-align: center; + } + +.fc-agenda .fc-agenda-axis { + width: 50px; + padding: 0 4px; + vertical-align: middle; + text-align: right; + font-weight: normal; + } + +.fc-agenda-slots .fc-agenda-axis { + white-space: nowrap; + } + +.fc-agenda .fc-week-number { + font-weight: bold; + } + +.fc-agenda .fc-day-content { + padding: 2px 2px 1px; + } + +/* make axis border take precedence */ + +.fc-agenda-days .fc-agenda-axis { + border-right-width: 1px; + } + +.fc-agenda-days .fc-col0 { + border-left-width: 0; + } + +/* all-day area */ + +.fc-agenda-allday th { + border-width: 0 1px; + } + +.fc-agenda-allday .fc-day-content { + min-height: 34px; /* TODO: doesnt work well in quirksmode */ + _height: 34px; + } + +/* divider (between all-day and slots) */ + +.fc-agenda-divider-inner { + height: 2px; + overflow: hidden; + } + +.fc-widget-header .fc-agenda-divider-inner { + background: #eee; + } + +/* slot rows */ + +.fc-agenda-slots th { + border-width: 1px 1px 0; + } + +.fc-agenda-slots td { + border-width: 1px 0 0; + background: none; + } + +.fc-agenda-slots td div { + height: 20px; + } + +.fc-agenda-slots tr.fc-slot0 th, +.fc-agenda-slots tr.fc-slot0 td { + border-top-width: 0; + } + +.fc-agenda-slots tr.fc-minor th, +.fc-agenda-slots tr.fc-minor td { + border-top-style: dotted; + } + +.fc-agenda-slots tr.fc-minor th.ui-widget-header { + *border-top-style: solid; /* doesn't work with background in IE6/7 */ + } + + + +/* Vertical Events +------------------------------------------------------------------------*/ + +.fc-event-vert { + border-width: 0 1px; + } + +.fc-event-vert.fc-event-start { + border-top-width: 1px; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + } + +.fc-event-vert.fc-event-end { + border-bottom-width: 1px; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + } + +.fc-event-vert .fc-event-time { + white-space: nowrap; + font-size: 10px; + } + +.fc-event-vert .fc-event-inner { + position: relative; + z-index: 2; + } + +.fc-event-vert .fc-event-bg { /* makes the event lighter w/ a semi-transparent overlay */ + position: absolute; + z-index: 1; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: #fff; + opacity: .25; + filter: alpha(opacity=25); + } + +.fc .ui-draggable-dragging .fc-event-bg, /* TODO: something nicer like .fc-opacity */ +.fc-select-helper .fc-event-bg { + display: none\9; /* for IE6/7/8. nested opacity filters while dragging don't work */ + } + +/* resizable */ + +.fc-event-vert .ui-resizable-s { + bottom: 0 !important; /* importants override pre jquery ui 1.7 styles */ + width: 100% !important; + height: 8px !important; + overflow: hidden !important; + line-height: 8px !important; + font-size: 11px !important; + font-family: monospace; + text-align: center; + cursor: s-resize; + } + +.fc-agenda .ui-resizable-resizing { /* TODO: better selector */ + _overflow: hidden; + } + + diff --git a/css/main.css b/css/main.css index a72bc1b..8390535 100755 --- a/css/main.css +++ b/css/main.css @@ -1,530 +1,530 @@ -/* - * Global - */ - -* { - margin: 0; - padding: 0; -} - -body { - font: small Helvetica, Arial, sans-serif; - font-size: 13.34px; - margin-bottom: 4em; - text-align: center; - background: #fff; -} - -h1, h2, h3, h4, h5, h6 { - font-size: 100%; -} - -a { - color: inherit; - text-decoration: none; -} - -div a { - color: #3366BB; -} - -div a:hover { - text-decoration: underline; -} - -p { - margin: 0 0 0; -} - -hr { - height: 1px; - border: 0; - background: #aaa; -} - -.site { - font-size: 115%; - line-height: 1.5em; - margin-right: 9%; - margin-left: 9%; - text-align: justify; -} - -@media only screen and (min-width: 320px) and (max-width: 480px) { - .site { - margin-right: 0; - margin-left: 0; - } -} - -@media only screen and (min-width: 1224px) { - .site { - margin-right: 18%; - margin-left: 18%; - } -} - -.fa.fa-code, -.fa.fa-comment, -.fa.fa-external-link { - color: #7c75fa; -} - -.title a:hover { - color: #ff5d4a; -} - -a.title, -h2.title { - font: 400 18pt 'Crimson', Georgia, serif; - margin-bottom: .75em; - text-decoration: none; -} - -.title { - font: 400 32pt 'Crimson', Georgia, serif; -} - -.title a { - color: #c72d41; -} - -/* - * Navigation Bar - */ - -.brand { - font-size: 24pt; - text-decoration: none; -} - -.brand.right { - float: none; - width: auto; - margin-left: 100%; -} - -.brand.logo > a { - color: #7c75fa; -} - -.brand.logo { - float: left; - margin-left: -74px; -} - -.brand.active a { - color: #5856d6 !important; -} - -.navbar { - border-bottom: solid 10px #7c75fa; - background: #5856d6; -} - -.navbar > .navlist-bg > .navlist > .navitem > .navlink > *, -.navbar > .navlist-bg > .navlist > .navitem > h1.brand > a { - font-family: 'Source Code Pro'; - font-weight: normal; - color: #fff; -} - -.navlist { - display: inline; - list-style-type: none; -} - -.navlist-bg { - height: 5em; - margin-right: 15%; - margin-left: 15%; - background: #7c75fa; -} - -.navlist > .navitem { - font-size: 12pt; - display: table; - float: left; - height: 4em; -} - -.navlist > .navitem > .navlink, -.navlist > .navitem > .brand { - display: table-cell; - text-align: center; - vertical-align: middle; -} - -.navlist > .navitem:last-child { - float: right; - margin-right: 1.5em; -} - -.navlist > .navitem:first-child, -.navlist > .navitem:nth-child(2) { - float: left; - margin-left: 1em; -} - -.navlist > .navitem.active > .navlink > a { - color: #5856d6 !important; -} - -/* - * Item Lists - */ - -.items { - margin-top: 3em; -} - -.item > a > div.link { - display: inline; - color: #a6aebb; -} - -.item { - font-family: 'Mercury SSm A', 'Mercury SSm B', Georgia, 'Times New Roman', serif; - margin-top: 1.5em; - margin-right: 1.5em; - margin-left: 1.5em; - padding-right: 1.5em; - padding-bottom: 1.5em; - border-bottom: solid 1px #b8b8b8; - text-align: left; -} - -.item > a > div { - margin-top: .75em; - margin-left: .8em; - color: #666e7b; -} - -.item > a > h2.title { - display: inline; - margin-left: .5em; - color: #1a1a1a; -} - -.item > a > div.fa { - display: block !important; - margin-top: -1.25em; - margin-left: 97%; -} - -/* - * Posts - */ - -/* Common */ -.post { - margin-top: 2.5em; - margin-bottom: 4em; -} - -.post pre code { - border: none; -} - -.post:not(.meta), -.info { - font-family: 'Mercury SSm A', 'Mercury SSm B', Georgia, 'Times New Roman', serif; - line-height: 24px; - color: #463f40; -} - -.post ul, -.post ol { - margin-left: 3em; -} - -.post-header { - margin-right: -1em; - margin-bottom: 1em; - margin-left: -1em; - padding-bottom: 3em; - border-bottom: solid 1px #eee; -} - -.post-header > .meta { - display: inline; - float: right; - margin-right: 1em; - padding-top: .6em; - color: #aaa; -} - -.post-header > a > .fa { - float: left; - margin-top: -.25em; -} - -.post-header > h1.title { - display: inline; - float: right; - margin-top: -.25em; - text-align: right; -} - -article a { - text-decoration: underline; - color: #5856d6 !important; -} - -article pre { - margin-bottom: 1em; -} - -article h2 { - margin-bottom: .25em; - padding-top: .25em; - padding-bottom: .25em; - border-bottom: solid 1px #fafafa; -} - -article h1 { - font-size: 26px; - margin-top: 1em; - margin-bottom: .5em; - padding-bottom: .25em; - border-bottom: solid 1px #f8f8f8; -} - -/* Syntax Highlighting */ - -.post pre { - padding: 0 .4em; - border: 1px solid #ddd; - background: #eef; -} - -.post code { - border: 1px solid #ddd; - background: #eef; -} - -.post pre.terminal code { - background: #333; -} - -.post pre.terminal { - color: #fff; - border: 1px solid #000; - background: #333; -} - -pre .lineno { - padding-right: 5px; - border-right: solid 1px #aaa; -} - -/* Contact Page */ - -.left { - float: left; - width: 49%; - text-align: center; - border-right: dashed 1px #666e7b; -} - -.both { - margin-top: 5em; -} - -a.contact { - color: #000; -} - -.center { - display: inline-block; - width: 49%; - text-align: center; - border-right: dashed 1px #666e7b; -} - -.right { - float: right; - width: 50%; - text-align: center; -} - -.clear { - clear: both; -} - -/* - * Front page - */ - -.alert { - font-family: 'Source Code Pro'; - font-size: 16px; - padding-top: 1em; - padding-right: 1.5em; - padding-left: 1.5em; - border-radius: 3px; -} - -.alert > .head { - display: inline-block; - width: 100%; -} - -.alert > .head > p { - display: inline-block; - float: left; - width: 92%; - margin-right: 2em; -} - -.alert > .body { - margin-top: 1em; - margin-bottom: 1em; -} - -.alert > .body > h2 { - margin-bottom: .25em; -} - -.alert > .body > .list-group { - list-style-type: none; -} - -.alert > .body > .list-group > .list-group-item:nth-child(1) { - padding-bottom: 1em; -} - -.alert > .body > .list-group > .list-group-item:not(:nth-child(1)) { - padding-top: 1em; - padding-bottom: 1em; - border-top: solid 1px black; -} - -/* Message */ - -.message { - color: black; - border: solid 1px black; - background-color: #fff; -} - -/* Announcements */ - -.announcement { - margin-bottom: 1em; - color: #31708f; - border: solid 1px #bce8f1; - background-color: #d9edf7; -} - -.announcement > .head { - border-bottom: solid 1px #bce8f1; -} - -.announcement > .head > .fa { - color: #31708f; -} - -.announcement > .body > .list-group > .list-group-item { - color: #31708f !important; -} - -.announcement > .body > .list-group > .list-group-item:not(:nth-child(1)) { - border-top: solid 1px #bce8f1; -} - -/* Practices */ - -.practice { - margin-bottom: 3em; - color: #3c763d; - border: solid 1px #d6e9c6; - background-color: #dff0d8; -} - -.practice > .head { - border-bottom: solid 1px #d6e9c6; -} - -.practice > .head > .fa { - color: #3c763d; -} - -/* Solutions */ - -.solution { - margin-bottom: 3em; - color: #3c763d; - border: solid 1px #d6e9c6; - background-color: #dff0d8; -} - -.solution > .head { - border-bottom: solid 1px #d6e9c6; -} - -.solution > .head > .fa { - color: #3c763d; -} - -/* Hero Image */ - -.warbanner { - width: auto; - height: 300px; - margin-bottom: 2em; - border-bottom: solid 10px #7c75fa; - background-image: url('../assets/images/banner.jpg'); - background-repeat: no-repeat; - background-size: cover; -} - -/* For Dropbox contest */ -a.contest { - color: #004AB8; - text-decoration: none; -} - - /* Style the tab */ -div.tab { - overflow: hidden; - border: 1px solid #ccc; - background-color: #f1f1f1; -} - -/* Style the buttons inside the tab */ -div.tab button { - background-color: inherit; - float: left; - border: none; - outline: none; - cursor: pointer; - padding: 14px 16px; - transition: 0.3s; -} - -/* Change background color of buttons on hover */ -div.tab button:hover { - background-color: #ddd; -} - -/* Create an active/current tablink class */ -div.tab button.active { - background-color: #ccc; -} - -/* Style the tab content */ -.open_tabcontent { - display: none; - padding: 6px 12px; - border: 1px solid #ccc; - border-top: none; -} - -.freshman_tabcontent { - display: none; - padding: 6px 12px; - border: 1px solid #ccc; - border-top: none; -} - +/* + * Global + */ + +* { + margin: 0; + padding: 0; +} + +body { + font: small Helvetica, Arial, sans-serif; + font-size: 13.34px; + margin-bottom: 4em; + text-align: center; + background: #fff; +} + +h1, h2, h3, h4, h5, h6 { + font-size: 100%; +} + +a { + color: inherit; + text-decoration: none; +} + +div a { + color: #3366BB; +} + +div a:hover { + text-decoration: underline; +} + +p { + margin: 0 0 0; +} + +hr { + height: 1px; + border: 0; + background: #aaa; +} + +.site { + font-size: 115%; + line-height: 1.5em; + margin-right: 9%; + margin-left: 9%; + text-align: justify; +} + +@media only screen and (min-width: 320px) and (max-width: 480px) { + .site { + margin-right: 0; + margin-left: 0; + } +} + +@media only screen and (min-width: 1224px) { + .site { + margin-right: 18%; + margin-left: 18%; + } +} + +.fa.fa-code, +.fa.fa-comment, +.fa.fa-external-link { + color: #7c75fa; +} + +.title a:hover { + color: #ff5d4a; +} + +a.title, +h2.title { + font: 400 18pt 'Crimson', Georgia, serif; + margin-bottom: .75em; + text-decoration: none; +} + +.title { + font: 400 32pt 'Crimson', Georgia, serif; +} + +.title a { + color: #c72d41; +} + +/* + * Navigation Bar + */ + +.brand { + font-size: 24pt; + text-decoration: none; +} + +.brand.right { + float: none; + width: auto; + margin-left: 100%; +} + +.brand.logo > a { + color: #7c75fa; +} + +.brand.logo { + float: left; + margin-left: -74px; +} + +.brand.active a { + color: #5856d6 !important; +} + +.navbar { + border-bottom: solid 10px #7c75fa; + background: #5856d6; +} + +.navbar > .navlist-bg > .navlist > .navitem > .navlink > *, +.navbar > .navlist-bg > .navlist > .navitem > h1.brand > a { + font-family: 'Source Code Pro'; + font-weight: normal; + color: #fff; +} + +.navlist { + display: inline; + list-style-type: none; +} + +.navlist-bg { + height: 5em; + margin-right: 15%; + margin-left: 15%; + background: #7c75fa; +} + +.navlist > .navitem { + font-size: 12pt; + display: table; + float: left; + height: 4em; +} + +.navlist > .navitem > .navlink, +.navlist > .navitem > .brand { + display: table-cell; + text-align: center; + vertical-align: middle; +} + +.navlist > .navitem:last-child { + float: right; + margin-right: 1.5em; +} + +.navlist > .navitem:first-child, +.navlist > .navitem:nth-child(2) { + float: left; + margin-left: 1em; +} + +.navlist > .navitem.active > .navlink > a { + color: #5856d6 !important; +} + +/* + * Item Lists + */ + +.items { + margin-top: 3em; +} + +.item > a > div.link { + display: inline; + color: #a6aebb; +} + +.item { + font-family: 'Mercury SSm A', 'Mercury SSm B', Georgia, 'Times New Roman', serif; + margin-top: 1.5em; + margin-right: 1.5em; + margin-left: 1.5em; + padding-right: 1.5em; + padding-bottom: 1.5em; + border-bottom: solid 1px #b8b8b8; + text-align: left; +} + +.item > a > div { + margin-top: .75em; + margin-left: .8em; + color: #666e7b; +} + +.item > a > h2.title { + display: inline; + margin-left: .5em; + color: #1a1a1a; +} + +.item > a > div.fa { + display: block !important; + margin-top: -1.25em; + margin-left: 97%; +} + +/* + * Posts + */ + +/* Common */ +.post { + margin-top: 2.5em; + margin-bottom: 4em; +} + +.post pre code { + border: none; +} + +.post:not(.meta), +.info { + font-family: 'Mercury SSm A', 'Mercury SSm B', Georgia, 'Times New Roman', serif; + line-height: 24px; + color: #463f40; +} + +.post ul, +.post ol { + margin-left: 3em; +} + +.post-header { + margin-right: -1em; + margin-bottom: 1em; + margin-left: -1em; + padding-bottom: 3em; + border-bottom: solid 1px #eee; +} + +.post-header > .meta { + display: inline; + float: right; + margin-right: 1em; + padding-top: .6em; + color: #aaa; +} + +.post-header > a > .fa { + float: left; + margin-top: -.25em; +} + +.post-header > h1.title { + display: inline; + float: right; + margin-top: -.25em; + text-align: right; +} + +article a { + text-decoration: underline; + color: #5856d6 !important; +} + +article pre { + margin-bottom: 1em; +} + +article h2 { + margin-bottom: .25em; + padding-top: .25em; + padding-bottom: .25em; + border-bottom: solid 1px #fafafa; +} + +article h1 { + font-size: 26px; + margin-top: 1em; + margin-bottom: .5em; + padding-bottom: .25em; + border-bottom: solid 1px #f8f8f8; +} + +/* Syntax Highlighting */ + +.post pre { + padding: 0 .4em; + border: 1px solid #ddd; + background: #eef; +} + +.post code { + border: 1px solid #ddd; + background: #eef; +} + +.post pre.terminal code { + background: #333; +} + +.post pre.terminal { + color: #fff; + border: 1px solid #000; + background: #333; +} + +pre .lineno { + padding-right: 5px; + border-right: solid 1px #aaa; +} + +/* Contact Page */ + +.left { + float: left; + width: 49%; + text-align: center; + border-right: dashed 1px #666e7b; +} + +.both { + margin-top: 5em; +} + +a.contact { + color: #000; +} + +.center { + display: inline-block; + width: 49%; + text-align: center; + border-right: dashed 1px #666e7b; +} + +.right { + float: right; + width: 50%; + text-align: center; +} + +.clear { + clear: both; +} + +/* + * Front page + */ + +.alert { + font-family: 'Source Code Pro'; + font-size: 16px; + padding-top: 1em; + padding-right: 1.5em; + padding-left: 1.5em; + border-radius: 3px; +} + +.alert > .head { + display: inline-block; + width: 100%; +} + +.alert > .head > p { + display: inline-block; + float: left; + width: 92%; + margin-right: 2em; +} + +.alert > .body { + margin-top: 1em; + margin-bottom: 1em; +} + +.alert > .body > h2 { + margin-bottom: .25em; +} + +.alert > .body > .list-group { + list-style-type: none; +} + +.alert > .body > .list-group > .list-group-item:nth-child(1) { + padding-bottom: 1em; +} + +.alert > .body > .list-group > .list-group-item:not(:nth-child(1)) { + padding-top: 1em; + padding-bottom: 1em; + border-top: solid 1px black; +} + +/* Message */ + +.message { + color: black; + border: solid 1px black; + background-color: #fff; +} + +/* Announcements */ + +.announcement { + margin-bottom: 1em; + color: #31708f; + border: solid 1px #bce8f1; + background-color: #d9edf7; +} + +.announcement > .head { + border-bottom: solid 1px #bce8f1; +} + +.announcement > .head > .fa { + color: #31708f; +} + +.announcement > .body > .list-group > .list-group-item { + color: #31708f !important; +} + +.announcement > .body > .list-group > .list-group-item:not(:nth-child(1)) { + border-top: solid 1px #bce8f1; +} + +/* Practices */ + +.practice { + margin-bottom: 3em; + color: #3c763d; + border: solid 1px #d6e9c6; + background-color: #dff0d8; +} + +.practice > .head { + border-bottom: solid 1px #d6e9c6; +} + +.practice > .head > .fa { + color: #3c763d; +} + +/* Solutions */ + +.solution { + margin-bottom: 3em; + color: #3c763d; + border: solid 1px #d6e9c6; + background-color: #dff0d8; +} + +.solution > .head { + border-bottom: solid 1px #d6e9c6; +} + +.solution > .head > .fa { + color: #3c763d; +} + +/* Hero Image */ + +.warbanner { + width: auto; + height: 300px; + margin-bottom: 2em; + border-bottom: solid 10px #7c75fa; + background-image: url('../assets/images/banner.jpg'); + background-repeat: no-repeat; + background-size: cover; +} + +/* For Dropbox contest */ +a.contest { + color: #004AB8; + text-decoration: none; +} + + /* Style the tab */ +div.tab { + overflow: hidden; + border: 1px solid #ccc; + background-color: #f1f1f1; +} + +/* Style the buttons inside the tab */ +div.tab button { + background-color: inherit; + float: left; + border: none; + outline: none; + cursor: pointer; + padding: 14px 16px; + transition: 0.3s; +} + +/* Change background color of buttons on hover */ +div.tab button:hover { + background-color: #ddd; +} + +/* Create an active/current tablink class */ +div.tab button.active { + background-color: #ccc; +} + +/* Style the tab content */ +.open_tabcontent { + display: none; + padding: 6px 12px; + border: 1px solid #ccc; + border-top: none; +} + +.freshman_tabcontent { + display: none; + padding: 6px 12px; + border: 1px solid #ccc; + border-top: none; +} + diff --git a/css/syntax.css b/css/syntax.css index 2774b76..bde5838 100644 --- a/css/syntax.css +++ b/css/syntax.css @@ -1,60 +1,60 @@ -.highlight { background: #ffffff; } -.highlight .c { color: #999988; font-style: italic } /* Comment */ -.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ -.highlight .k { font-weight: bold } /* Keyword */ -.highlight .o { font-weight: bold } /* Operator */ -.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */ -.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ -.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */ -.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ -.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ -.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */ -.highlight .ge { font-style: italic } /* Generic.Emph */ -.highlight .gr { color: #aa0000 } /* Generic.Error */ -.highlight .gh { color: #999999 } /* Generic.Heading */ -.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ -.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */ -.highlight .go { color: #888888 } /* Generic.Output */ -.highlight .gp { color: #555555 } /* Generic.Prompt */ -.highlight .gs { font-weight: bold } /* Generic.Strong */ -.highlight .gu { color: #aaaaaa } /* Generic.Subheading */ -.highlight .gt { color: #aa0000 } /* Generic.Traceback */ -.highlight .kc { font-weight: bold } /* Keyword.Constant */ -.highlight .kd { font-weight: bold } /* Keyword.Declaration */ -.highlight .kp { font-weight: bold } /* Keyword.Pseudo */ -.highlight .kr { font-weight: bold } /* Keyword.Reserved */ -.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */ -.highlight .m { color: #009999 } /* Literal.Number */ -.highlight .s { color: #d14 } /* Literal.String */ -.highlight .na { color: #008080 } /* Name.Attribute */ -.highlight .nb { color: #0086B3 } /* Name.Builtin */ -.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */ -.highlight .no { color: #008080 } /* Name.Constant */ -.highlight .ni { color: #800080 } /* Name.Entity */ -.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */ -.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */ -.highlight .nn { color: #555555 } /* Name.Namespace */ -.highlight .nt { color: #000080 } /* Name.Tag */ -.highlight .nv { color: #008080 } /* Name.Variable */ -.highlight .ow { font-weight: bold } /* Operator.Word */ -.highlight .w { color: #bbbbbb } /* Text.Whitespace */ -.highlight .mf { color: #009999 } /* Literal.Number.Float */ -.highlight .mh { color: #009999 } /* Literal.Number.Hex */ -.highlight .mi { color: #009999 } /* Literal.Number.Integer */ -.highlight .mo { color: #009999 } /* Literal.Number.Oct */ -.highlight .sb { color: #d14 } /* Literal.String.Backtick */ -.highlight .sc { color: #d14 } /* Literal.String.Char */ -.highlight .sd { color: #d14 } /* Literal.String.Doc */ -.highlight .s2 { color: #d14 } /* Literal.String.Double */ -.highlight .se { color: #d14 } /* Literal.String.Escape */ -.highlight .sh { color: #d14 } /* Literal.String.Heredoc */ -.highlight .si { color: #d14 } /* Literal.String.Interpol */ -.highlight .sx { color: #d14 } /* Literal.String.Other */ -.highlight .sr { color: #009926 } /* Literal.String.Regex */ -.highlight .s1 { color: #d14 } /* Literal.String.Single */ -.highlight .ss { color: #990073 } /* Literal.String.Symbol */ -.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ -.highlight .vc { color: #008080 } /* Name.Variable.Class */ -.highlight .vg { color: #008080 } /* Name.Variable.Global */ -.highlight .vi { color: #008080 } /* Name.Variable.Instance */ -.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */ +.highlight { background: #ffffff; } +.highlight .c { color: #999988; font-style: italic } /* Comment */ +.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +.highlight .k { font-weight: bold } /* Keyword */ +.highlight .o { font-weight: bold } /* Operator */ +.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ +.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ +.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #aa0000 } /* Generic.Error */ +.highlight .gh { color: #999999 } /* Generic.Heading */ +.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ +.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #555555 } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #aaaaaa } /* Generic.Subheading */ +.highlight .gt { color: #aa0000 } /* Generic.Traceback */ +.highlight .kc { font-weight: bold } /* Keyword.Constant */ +.highlight .kd { font-weight: bold } /* Keyword.Declaration */ +.highlight .kp { font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */ +.highlight .m { color: #009999 } /* Literal.Number */ +.highlight .s { color: #d14 } /* Literal.String */ +.highlight .na { color: #008080 } /* Name.Attribute */ +.highlight .nb { color: #0086B3 } /* Name.Builtin */ +.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */ +.highlight .no { color: #008080 } /* Name.Constant */ +.highlight .ni { color: #800080 } /* Name.Entity */ +.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */ +.highlight .nn { color: #555555 } /* Name.Namespace */ +.highlight .nt { color: #000080 } /* Name.Tag */ +.highlight .nv { color: #008080 } /* Name.Variable */ +.highlight .ow { font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mf { color: #009999 } /* Literal.Number.Float */ +.highlight .mh { color: #009999 } /* Literal.Number.Hex */ +.highlight .mi { color: #009999 } /* Literal.Number.Integer */ +.highlight .mo { color: #009999 } /* Literal.Number.Oct */ +.highlight .sb { color: #d14 } /* Literal.String.Backtick */ +.highlight .sc { color: #d14 } /* Literal.String.Char */ +.highlight .sd { color: #d14 } /* Literal.String.Doc */ +.highlight .s2 { color: #d14 } /* Literal.String.Double */ +.highlight .se { color: #d14 } /* Literal.String.Escape */ +.highlight .sh { color: #d14 } /* Literal.String.Heredoc */ +.highlight .si { color: #d14 } /* Literal.String.Interpol */ +.highlight .sx { color: #d14 } /* Literal.String.Other */ +.highlight .sr { color: #009926 } /* Literal.String.Regex */ +.highlight .s1 { color: #d14 } /* Literal.String.Single */ +.highlight .ss { color: #990073 } /* Literal.String.Symbol */ +.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #008080 } /* Name.Variable.Class */ +.highlight .vg { color: #008080 } /* Name.Variable.Global */ +.highlight .vi { color: #008080 } /* Name.Variable.Instance */ +.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */ diff --git a/css/typo.css b/css/typo.css index 984b89e..71bd213 100644 --- a/css/typo.css +++ b/css/typo.css @@ -1,19 +1,19 @@ - -/* - Copyright (C) 2011-2014 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 169376-72698-20140331 -*/ - + +/* + Copyright (C) 2011-2014 Hoefler & Co. + This software is the property of Hoefler & Co. (H&Co). + Your right to access and use this software is subject to the + applicable License Agreement, or Terms of Service, that exists + between you and H&Co. If no such agreement exists, you may not + access or use this software for any purpose. + This software may only be hosted at the locations specified in + the applicable License Agreement or Terms of Service, and only + for the purposes expressly set forth therein. You may not copy, + modify, convert, create derivative works from or distribute this + software in any way, or make it accessible to any third party, + without first obtaining the written permission of H&Co. + For more information, please visit us at http://typography.com. + 169376-72698-20140331 +*/ + @font-face{ font-family: "Whitney SSm A"; src: url(data:application/x-font-woff;base64,d09GRk9UVE8AADQ8AA0AAAAAW5QAAQAAAAAyCAAAAjQAAAasAAAAAAAAAABDRkYgAAAJgAAAHmsAACUQYZ32ekdERUYAACfsAAAAHgAAACAA5QAER1BPUwAAKAwAAAe+AAAg6tvZjUBHU1VCAAAvzAAAAFoAAACA6gstjk9TLzIAAAGMAAAATwAAAGBb91d1Y21hcAAABpwAAALQAAAEND7Qq2BnYXNwAAAwKAAAAAgAAAAIAAAAC2hlYWQAAAEwAAAANAAAADb+dK8taGhlYQAAAWQAAAAgAAAAJAfQBApobXR4AAAwMAAAAdcAAALepQg0L21heHAAAAGEAAAABgAAAAYAuFAAbmFtZQAAAdwAAAS/AAAMG35HACJwb3N0AAAJbAAAABMAAAAg/7gAMnjaY2BkYGBgZHA8r7L+bjy/zVcGbuYXQBGGs0tMN8Do/7f+PWcxZj4A5HIwMIFEAZpADsZ42mNgZGBgPvBfgIGBJeP/rf+3WIwZgCIoYDsAmlQG4QAAUAAAuAAAeNpjYGIKYnRlYGVgYdrD1MXAwNADoRnvMhgx/GJAAgsZmP47MDBEw/geam5eQEpZUYlZ4b8FwwnmAwwfgPz5IDkmIaarDApAyAQAzFoPEgB42rVUzW7bRhAexXIcO4kRG8gth0EaBHEgyfqxnSg9phDsAEWB2EiQQw8UuRLpiFxiubJCIE9RoA9Q9NA36K3HnvoKfYW+Q78drmC6cRKnaEWQ/HZmduf7ZkYkogeNX6lB1e8Id4Ub9BVWFb5GazTzeIXuU+FxsxazSpv0o8fX4fnZ4zXK6BePb9Ddxl2P12t449pW47HHN2l75WuPb9Xw7VrMJj1e+dbjOzUOWzW8LXiFGs11rH5YWXjcoBGeFb5Gm83vPF6hb5rfe9ysxazSveZPHl+nG83fPF6jP5u/e3yDHq8uY9ZreKN5f/UPj2/Sg/W/PL5Vw7drMZt0srHl8Z0ah60a3nb4uc5Lk0xjy4+e73BvODxocb/b6/KhVpOZMvyQR0YZ1X6hM1V0OLY2f7a7u1gsOrbM9dQEeVx2Qp1ePOjw4egFv+eLIS/VdD4LTO9gOHhy0H7SPxg+bSPXXncw6LUH/e5wv90bdPf6+6+UKRKdca/T73Z5pDP7Ok5spko+Do1S2XEaGMtJwQFbE0QKy7esJ5dzbvEiTsKY06DksWKjpklh4Y04yThUxgZ4n85NUkRJaJG26Fx6zkmMhIWe2EVglEtuY8W50TmOKD+anR+5Uux0+I2eC4VMWw5RqxanOkomeEfgY5Lx3KoWa8ORXmQzHUQ4v5ZQXElW2GA248TyPEd9gqzEWWmOrUYCYl1Y550YnYp3psPAaZL8hqsGWc3zQl083wkq5uNTFYrfaTtRJi2csGNlzpJQcTBF8VOVISIOLKt3IF6gpnaBnnAJgUEWSes7fDSBUpyIwp9vq3a0JHRZiw+ZTCDEcc/nJteF6mAADIrlOGbwpSKoxflMBdh7lhQQ/NGx3F2o8QQD1L5QyBCWAEplTCHlw338+Sn9cNPVWdBz0pRTSYYSmlJMlpgewbqDd4+GuA6oBdynLtZdoEPsUDTB51NhF9ND3CMgJXebXsCfARXUgcedaJHhGe3iWsjVgaWETSOjoQAoxrpDISzpJxkdItsIGZje4/7UKS/BYEpzsAzg7UHFkAb0BO82nn1ZPwWudO3hOcDVg2UgtiHtA/ew6sLbx+qVKCzAyulz1elIZFf0O5ul1+CQ4O30l7Afg42rioLlGKwcF6cnwTmMldPguEeIqLxvYdOo7pfU2fVnIZlDPFlOctnH8LJETyWj9XsjYeA0hGKxiK/Wp6iYkdhITrNerevl1fmcCBensBAtFuwCiVoqt4hwqxxW1+2KRfkvtLvZWE7FjkzcG/jmtSpkWFvRWs1VS3xaFE78OvL1cdrH2O0q1RI2RrwaCjKw0dKriv/lCs93JVI3V9sZLpa5YJyd+/kJ8Cw9rxTWue/P+Qkx3oWfF/ecSLXS2l7HKMRq2adz/UY6f/4PsrC67IXU3X62QwVix5gHJVOw3L/s24kwTSWy6tixWM5kapQwnPrJT2X6rd8dCFL0zle88HPqGFT/E4ayqoNOZVT71zt1R5ItEzaOYzXxl2Wr52jVTv3nXFylJhPfkWXdc6lwLv1RwmvkI1J5K9//al9a61BLdru5DnzeM8ladfjLv5a7UrexZHK625+YyNDHBL6n51/TqitXycf/ybf0Kpn+h1r8Dfidf20AeNqdkvsv1lEcx9+fh1SKLggPfX09ioqIRC4lErrfhXIZ6UIrhNynIlGk+40uhFqt1VZTqfVbfkhNWtJa8/gXajOz+X46z/ehPc/W1tZ3e3/P5/M+n53zOud8AFjAKFcQDKGvyEjNLS1mi7EFlbCCDjI84IdABCMC0YjFRiQjA7nIRyGKUY5WtOEhnuAZXqAL3ehFP4YxQpPJlmaSHTmQIzmTC3mQF3nTYvIjfwqmKIqmGIqjHRRPCZREKZRGmZRFh+gw5VAe5VMxlVI5scZJ46Lp1vyQKqUTUpX0S7aXtbIk62RPOVR+5K5jFqyy4JyvMoYiEjFYh81IRabKWIRScZY23MdjwdiJV3grGPswgBGMkbUZo2TCGEQh44wbTBjTzRgLVcZRwajVvNMMjDP+lO1kJ9lVZQwxMvIQ63mQv/M3/sr9/IU/cx9/4l7+yB+4h99zB7fzPW7h29zMTXydz3Mjn+MGw8uwNetYZoldWSuyWWzL04WXaJhTRpURZViMH5Ue5b3SzX4ifqN0KS+VTuW58lxkT9le/G2AsZ6x10MPhjqG2gB9jb5Kf1JfqS/XZw+ODlYbe+C/vixUmOUlZnHZeHTaxG0wqzfO1AldMHHr/rJTjaithSMC/shZvPmEtKJzg/9IQhjcEG6mMzgLd9HFE6oXJPPgiShV3liDRvio66aiQK2Y8EFW+OcVETQWsJxkNXnKVOtp021sDd4MYCYwa7advcMcODo5a+HiCsyV3GS46zzmzff0WrBwkbfPYl8/LPEPWBqIZUHBy0NCw8JXrIxYFQmx/WpEr0FMbByQnJIG7MvOOZJ7NC+/sOhYcUlZaXlF5YnjJ6urVIBta9eJTj+8ZWPH9g1I3W+w1hvRNsWj4FSCMd68qxWJezLrG27cvH2nqRmobUT7PdET2HHrLnYjyViWsRfpB7MO1F24tvXS5Ss7r1+9+BuUSPhTeNpjYGYAg/9bGYwYsAAALMIB6gB42n15B1RUV9f2mcE7cwM6IHpBo5lBsYAi2GKNAipgQZAmiqIC0qSKlV6NZVupgr2LBXtFRSyIHTRiiSmmmVejsSX7jnvI+59Bk+j7rfWvWcycsu++5+yzy/McFKxZM6ZQKAT3hPjZxoadbMFkB4XcQyn3MJGlZhObm4TT3reX3voLSOYFnzFmc9lS79iStVIyBRNYcyaxzqw3G8xGMV82iU1n8SyFLWQr2HpWzg4xg4K5zUlKiIqYMSt2TmRI2JzZ4Y5hIYlRc+IjQ5LmxMWGzJlt7IeFJCXEO4bENnUik0LmNkmFRSeFzYmLiA2f/68Mb4Qmhb+bnx0dO72pERcS9n5uenR4Uvis6FlN7YTZIWFh4fFNSpOi4yObtCTExYX8OxwWPj06NjbE2EyITIgPjzG2hickJidFR0bNtrEbbm/Ta+DAfg42vXv26mkzMiGcrybJpouNexJ/T4/R/IlZjjZRs2cnDnJymjdvnuPsZK4niW8w2ZG/qcmqRrNyWzETBVMpWBRjn6i50VgbxtoJrKMJ66pg3U1YTw1zYSyNsWFK5t6cBTAWyNhEBZusZCEKblaWy9guxoCxGYxtYyyLsU2MpTOWxNgCxu3N5jOWylgFY7sVbD9jexnbx9gSxg4wVsbYGcYqFayKsdOMLWPsAmPVSnaRsXWMFTF2lbFaBbvO2BXGrjG2krEbjN1i7KaSNTB2W8l2MHaXsa8Zu6dgDxl7wFgBYz8wtpmxHxlbxdhSxvIZW85YIWNnGatRsAzGFjGWrWB5jDsEy2TsS8YSGFvMmCtjImNzGItmbB5jcxnjZkpmLEah4JKlTLHInB03OtgQbpRgdkYxUFGpuKpoVDopJyvnKr9UFijXKHcrG5TPlI0mrUwcTIaZTDbZZnKgWbNmLZqNbBbW7FizHwRRaCe4CwHCIuE71WeqLioX1WhVuKpQdU51TXVb9VzN1J+qu6gd1YPVi9Wr1BvV98Vc8Yh4UXzzyaef2H+S/EnWJ8s++da0k2mIaarpTtMDZpZmtma5Zs+b92ue0nxJi9Yt5rdY1ELWmGgcNf00IzQ+mqWaXZpX5oJ5G/Pu5kPNJ5ofMH9u0cxinEWERZpFvsVOi5qWni2DW8a3zGy5umV5y+8tPSyDLOMssywLLCssL7YKazW/1bJWW1tVtnrQ6tdWcmuxdYfWa1rvbH2qdV3rn1qj1ErKlzZLb6yaW7W2GmI1xWqrdVfr/tbe1lOtI60zrLdaV1iftH5m/Ueblm3at7FvM7DNqDYT28xps6rN3jZX2nzf5kmbN20T2h5uF99uXrv8difanWt3td3tdm/bm7Q3b2/Tvnv78e2T2y9sXxlCk5vJa9+mGdaq7kyUZBHIy/CpQNMNIyXQ56GHobmA2XJzCRrzyENuLsR7S8glDCIIGqrSkDW+1gdJfWALTTyULVBfDJP6wmaaeCRb0KCjfFsfIPmVzKBAmgK70NcHYsiXukPRWLSGaIogCWAsmkEcjTmfKezCQJwKseR70SiLDpB9maxhL0YgF7tMpiDQlrESTml6cipfgOwg28mlErYcdre7g6sztSSLO0OfPP3qHlpoqZVho4QZKGM2/ulbShkkUzahoHdGr4+fcOZP3OVPGGrxvjQgarSHR8T1b76ruFp3Y//oAVp5IRlHx/DRa/+OatBfP2e1RH3QUdh/bfvDtf8R3cuEjH5zPRICRErEGYLvudn74DRcOHL0HlTBhXkXosTSu0LgjnHrRgKZg6sz9ICR26ZVBdoGu/IRBmT2y1C0g9/hu6NX74vYnNSCwaRG6u5x8YEOGs5d+PWAiDEUIox3c4txBlFDN3EwN/0/1raXe/SUqDe2+xx1gAMAXRqQH8ErMaNeID/6xJbbnYKAfJ6TDu2plaixP6ffK2Fv+vQR2QD1B3J1JQ05dRJXuwnoh6avsRtgEKCPHerIHvkTg+T++rZS3ibqHJ+OHZMgjTpSp525c7CdrytZrs94juw5sQ2rndFS0NyUjQa9RHEY5UlRFOeNcRR1BaPUGjqL41Ep9QQvWnaYL50kfIt7pAba59I0OdzKxlRzQr6nz5dGlhpO/vXZjXRB86tswMFSLWnk5D5qemvIgUBZA0CDbwLgYMGjVqLTgKdlO0GzXd6st5XOGWLVRaNkC6CTjea3UvlrjuJIeYBkY/qjwfht7Hs19X+mK1KvvxdzUz76WIJbBjsMkO3QH+oNsygT/ATNG/mePFq6ZsgarZazKE26bsgapebil/BrCc4bkjAThst25G/gf+AmaLLlVPm8hCa9b5Kltj+4xPlME4uHCTUnbuy+C9/DhWkwAtxCQ0njJ8amrybXyqIitBDQovZuFaBSJD/DeemPzzuoNRh8wqqD6YG+UkdTzVH5KIZL8Nu4c7231O04fhbuiciG3qGeWhrWGI2uKuz3Rz3qdKTA7yQXvwAbrQMufaZCVjXFVbeHfpR6j5hAam1H3PdChaa3g7vpNGirt6qRbE01GKn3xf9K3Ms6YFdaoaUQrjFYhYvQATviTN2QJRJNII09+WnJWv4erVXojZZdKECnmSHP4xavN2gaoxvwEa5SZ9XRl/xcVvEsME3ft0bCu7RBXeyOo/iJRQtB8YGpbiCSWxfuomPR6wX/Gaz7Aeriz08TV98TfA4O3+LI5yPpM3KkWZSEbagHJumewcPyuqPc93tiDY6Q5BPOhmPqQdMiXLRxkLR8Vr5Y7CasW7h10RYQUf31RWyp0/ypb1csGVrJZvhffGwH9IK+BfzWBYCvFED+RLY0WAiaKfIcq6x6Ogqgt22a48ll5NtOVt76aCeg1Y0ilehFR/BqjL4Np+RGXN2oqAVcrVecMjTyLZbwVPlfqZPpF0ukzqaabXKFvFZC6x53yFFLY40mufCrCp1Q+RXa6oYukuzdJ/Ez6IaH/lChqnaSIz+D0iYNmERa7EFT+MfGuHEtUMBj4o/6iHIHsiutp6zvBHSqeIOfAvqLXyyWaGwnnsT6UO+OaGm05CtuyT7Y5zWZk5dWc01+UiRRFt4Qnm26fx2wmYiWTg3UXUu+xlXdfK7CPGoQfOQtUi/uFyZaO9yNJioULgR+rtOslJehn9TFVPNAfsVPN6veUAXghgu5fWwbjJbiO/fVd8WdUlfuPD76AH20NAhoWaMprdK3dE7BE43T64xp+srbS3xqCJCn4Q1FyG+GAoXxlrdMXGhuY+hVwDi9CcY3mlzn4mijt+WrLpMFzMPnA4Am0wkKwTMuqZhFP1OZoQU/wSS8hyn0LZduo+/IlduZap7LL63sTTWD5V5kKuXU0Ay+xFKMA6ihIwB/mQuaE/q2ZCkZTr7VjkyXT/6lFTSDb+pLpcJxyGUbS4nLjkMu+9bcGL3HuJpaw0EvtUZWygapm6mmTE616m6ajG0kB1NNrXyR5yx06/IdtdA6Q8D0sFAR8KlrBjSuEC7NvZJ+lzuhA6r/gwE650USOQzxIIXWFyIKo1aLeF59+vyZfZdB/OmqO7XWaTLl3FNSD1PNWrn0quRoSklyP8mJp6jp+K0+TsqqEzKXZi9NAbGH91R7HbXu5/m9IfIrORIt1NlXSMUjTSNc3L25SrsJShcXLxY1u+TDIRLcH7mXNJvE0AKhy7rZ+bAJSkpWbylZs2jtkrWACnh6k7sE7MvalbxdRGVJ5m3ShggROyetGQ820M0dqBkMO+xXGx8xd/4cmAlzV8/fkTIgbNpkGC/2RGUwdkBbNDv/SkslD6WqHOF58r7ZECoGDgulZsRcd53TwpF9++/t2fjluoU7vhTRHBukERP8Bw6aeK7u9unqrx+cC3DTas7JW61kC/UL/0uk1LqAV7jPJG7Hl0Y77r7DI7SVUHvh0t4aEG/tCfXQGRS8QuzD8bzy9TRNaQySepl+2N8tyehqeKGeOjs5XJsG6UvTlovFI4XCJRuWlHENZyu+12ky5M35EpXjISzBrG5AX9J8kJf8/T7cizvoiGBU6mYF+uNN49yHO+kbm5Y5wbhMZxgz3Wv8vJrJe/qDK1+y90Qx454vgGG7ccWSUHvu4t4LIN4ub1rxHbm1uvZ808it8vd7MO66t6mmWj6L66Q+ps5WfU01V+XLTR7V2ehRgyEgbNqkd2obZ90pAYwSDqWeyj7HvepTNDV6Fc8kZDd0eBetH4QUTdso4jH1mZrT+67941S18lYKkPSeaq8NY0s5ZqDuJPagAHJ/OQDNdPeg+uChwyJtV+MfzYL8AyM8Qew7ug5bo8P9m6jQnYcDORUZPNk642Or7MtCxqK5i5NB9J69uVrHc7xWnXPFiN9wwrAMoDH9ADy/58n9uWB/PuaRdg/sWFm2QtTkySXydokHfF+DN/WXx7ukY7Bh6y0e5nly/iqJ/HEjjsLCwUAdaBp1xSjXdPSglRywbH0I2A1nYl9KFjQr5C1czeemmlw5mYdldk1XENwTd1fr4MSaWqiEXyftcysTl6vryyr3wWM4lXoJTojV5XtuaF/VdFSRKjCwuw4CSydBgNg3MGGEdioU+u4F4dbZhL468E8PgkCxR1UgqrQaWogBNFmCtwtGZsFfCwRNrjFFFI37HYT6bTEBOghO84JJ4FgZWZ8mLlK7pU2KBCcIKvOGKaJ//AwPbadxb3hWP1v1VAdVaZVQLf5Ytf229ijkXIgGYcT4HT/qoLrsFFSJ/xlfRfyFc+VEdJRyaoWAsKA0XxDT4IrcWtiftzelYqZYfEOIXx+5JiRfXPcmoDiZTBZxEKzt2J366ICs6/o9TRSTiZ3NWIcma0GogwvrT1eI9AT5BrD51duvl4teBo0wamvoFXgiag7Vyy2lMY/Un9M6Dp7iIeuqwRq+xVWYAjlXaTIcR62w6+nhI1/DXti8aFueWHRdSFw1c8UMoOYwZlwoWYqB1Ivn3E94lVkp4WhH8lYV+aIbQOc6gJc4GuAC8a9f0RuyL9AgQJA7fwEc/ZFA8bJyRArmGdrREGNR+Fyvkn536KruaGX81uADfa2xAs6k7uhIc2kOd1Ynmkkzkf/iXP7phj1xpjacg5BIak9tKZgXBh22xUiMwvbYBoNxEtpQG4rSkj8NknLPC1NjQlOngjjA//qTp2evf687CvvTD8WLRReF8M2hZRN5QIgD+1Arsvy6L4q6Kqhcd2Ab9/eW+FxuwbmDuj507xDtJJieFZYqFkwUDq3bV3QAxGNbU0J1KWrqljk6hEe/z+Hoy3ACDm0s3yrmhwlnqb2Uc4Y2AEwQ+MISpZiEiNRoiII566EcDu7Zha1KRM1RPM/9uZ+p3AnX8h/NH/ITeYOEjjZ/Uk/qRcyGHMjxTxvsxffM/kQHbZwVdejmxOFQe/vHPOt2+O0xfobtnzmRrZaU1FrqjWbCvqId2+CYeDa03FM7mA4fQbM9qp9JI8zCECkmKXW6NvK3A6pDm5JjdRp5oP5T6Qqd91Rr+spO8nHpqevtrnauw7t3u+P2/Pc79b9px1mNmhw0cmTQqetXK6tu3KgMHKPVyK04Iu/PE24NumCZhMrepOQn97uT5LDJnrqdMXJCc9lMPii98q7v3sPLrVPnWvf/PL1U91KbR9VGs+xvMssCrJY8Yv1HjY45f+PmrnPXr+/yG6nl0LaKG2OA6TT+TeNxq38G9qcSGkxrL3PF2ddxkEQmP7ljS+33cKf84lEx+yvBO3hUzFDoB75H4TbUHz6M5ufE8tIMHDYpK5ssBDL3dg4EUorox6F4h+//+AhM41B5sTTQ9KOhGr0kDfp46ICcJw3+eOiC3Ch98fFQuZwvPenpoO5m9aSXg/E1crq+ULoYfGKsV3Cwjxamr4/ZlSLSrsYv7vPwSMNv4DfKvbOGyvV9hfJ167lriMSolYRaekI7QcApcrQUkZgYEZmwff/+Hdv37d+eGMGPwLbM6hvgcDwNuYtRmtwFoI4e8jS8E0shu45W8OaXWM9HDe48V3ganCWcJ6vAoBL+QfrkRvaS08aeZHPaiLfm6UM/gv2hdM1eVTLykTGbc0IucH09/i8BwF046gaNwoUf8gAskb30h7lRkQyj/gHEfLThrQu3K979aPRD1EwiJ1eDm2TvvLXj1sXhhtMfajipP/2BgeXZBt//1QSv4n4IvCY+euFR6jVC8K0ctqMf0BQwQmmgWdB5Z5+q0WK/rjfTL9ULF4K+SnwEOAXQBp04nDQmzVqpDi7OPh4mGiwNvkJ01fw6+BrQ8zVaYB9eddfRZQ63bcmC+mrdwWfTlMOibCn7ChWB6z1gsMixsNxdv9W492rDyiZI7CsfetvTuO11fw+8R8v0mbyyabO+cjHn4B9sa7ChtEnyb1SL1nrB6JAV8gG5OecUDnfIQcsZQScXI4Dv+/RfWrFYsmuiFV05sFE08Qonfh52ejscwIuB2vE6jTpS9+D4NfhJRBP3OlKT6DqELLQe77HkC/WD42dv1R+aPEwLztNHun0hFvoJGDm1agznqR4Tp7tDAPitC9glZroLZxJq0y4CmsIDDt1NxI+AsRP++L9YuVpONqaND4d2c6khHw+dkYOloR8PbcZnH9aID6ey5LGSs+kUKxdTDs/1f3KzYtcRaEp22iHgGR3mNe/qxF3dwQU853smikWjhNodV9dd5QDsULybLkJNy2d19TJWtR5fTXjBAcPtw5erj4+tn/GQE/Nb5dXHxawbgm/w6JjhHAh73FuMVqLcSjX0okTnVaUvay7/AD9CpUd+d5H0NFryHj86diSMgZA9UA31tadxxiYxTQ1BhVNLI8S/kT1naR3+TZMfw/x9+KnRZGvlxKb8ipMNpz7gAGvlIE4/hphis/8Z9v2ogspKQ82HzMGIX3uZ1r1jLrxX36R7vcHwHjJXNil1/6d/6CNtOLZRZZy4giflBqnmW+HKhMPD13aZvN93mwuvm9a2JFIX6vnaEdvqrsDZDceO1tbs+xWwLaCLH1oQeyie/8ZzdYinMHXrxPW+pWL2WOFk5uHU/XPFwaQW7hs2S53HfIWmqLjx6JnuJlyOOxW0NBtyIFukEa6dO2rfI+Rd+rlGp/gQJ/Oi/9q4p2o55Z25kun13xC6Wp7+zlYdPhz799kVctw7dZM+tp0NNX4sDnfnXok6IV574Fk6LVAI3TN+rQ8Qx1ysC9BwGLrBsyJY9BxyNePwKeFw7JkUHgw2nFG9ABwu0jKMlY7BgbSdiSIV0EVhXkX2cTgD2ObGd3/yPDKCYiVq497fRjsNIkrjt4mYjzXChqjiKTBR/AfporP+K2PQfEQKhsD48JApnB4957Tkr/n/P1bQWev/ASuo3HfjH1bwzxts9CM/jK73HqOJlwV5kAQN5OoIeMeZV4G/7MeXuD+qBDoit4B31yS4mtf6XJxkBbLpsyq4az8eEPmiDJa2/iXuj08D/cgxXte3nazq6AGvTSVqXpuWNdWmm8baNIrXpoXUg2w5xJuBHTnyX647c1MKVJE3Wb5Ef5yImt/QT1el0sij3g75ILx7gFtQxKDIh66nunBH1PIToeE0/I8uaKN7Dl9VHni4f1DDpGc8juvLz72L48mjY4cbb1hH/h3Izu8D+eLlH3kgn/Qo6C4aWo6XyHJsX85cFd6/cHhrUfMTKlF51Ymb/Z+bEDLol0muH6TnV3LOh1X/OXq/HcYFZPVfwyR7npmGNHmjBtX69RK2oH71gC2wXxDYONk85vYZpE+XxhcJ6VOiZ06A8RC1LeO4GJgtFI+o9P8VnsDJ88X1vK7c0ptIL7p1URvxV8TfSQ/37pEipggRU+fFQCQE7Uo8D5thy8qNBeJJderC1MVpEAdpJbANNhVv2LJX3H2Uv87zXTDJofoiqdcmDsmdT4IQi/bvOyeMsDwC90q3Ddrh/G2r3qZghXTrr94jmm5lJ+iLpZDC3rTsZyPOO4sTOS/qBaGUZ7x95n0fVDb1c423qB0/EscszJNCC3vRsl/AOPfho3gAl0s9/9bT8f3NcFiTGj637J1O45wdkqyQklEkxTpSJM8ncT2JqJiPivUcxSzXh1mhshdHpORhZWPa9KUhv/dA29i60wQvNa8PygOl31SL5iyZA7MhBVKWpYp2UOjzDIRd1Od1F+wCD+DG9up9YvYNYVyI36wRQApwbkjEFiJWXKRjqsVrYC2sg81LNy3j8VUJ2RdpKwg70eRO/Ruoh1Ozq8LFknphYoXPelegjmDbPYLsRBvuyub6F7KVFCNbewK1pnqSsH4MxBqsq2ALVvG0efYYoCVWb6azgmE8/iLlnaJqgCBsyaPwF97CX/hO++p7c4b6tkdHddwDegGxX9gCGM4I60vTUpLT0+fr6DzGqAtLcQgUpAsR+hXSpfSpow6mTx+SqqI56CKt+eLUgzJySXsQ9EWqCg8tl8rUqxYXLloFYsnKVWt0+Nka+kydlJU1V5sHOcsWLBOdbkkL0xdmLMgU18VkLsjYsgSEBWlZORmQDJllsAnWF6xZU5JTtqAQysS1xaXr1hemp2ghNTs9PVNcG7sUhOWFy0uWFYroQp2lgllLVRu3FEHyvI0zsyBtQ04uZOaCEFkmZaTlntioKspfkKOD3C8XfrlYLEnJAcFliZSWXby6pKikrKwoMzMjOytN57NVWr2pCObHQ0ouwNr5Owt5PhlqVZGXmLklb1bG9rwo1ZgTUgFsi4HdBQDBeTBzN8RwZagyDhdFLYWSinwo4b9FFQWQPjkHsvYugaxoLtKAU6Wi4lWFUCIWLyjIzV2Qm6WF7JU5+RniGj9p7kEhJyc3AzIgrSC7EAogv2DVahG7kYWUv2LFypULl+fpslJUgalSUX5BYUFeYXZ2Xk5uTn5ukU7jhwZ9iBHN+cnu+ulS3w221OcYCAmo4+2O1Oc4Dw4/3KvPk0ZkCGviC5MgEaIzExPDxf25wqGK8mNQCdtytmRsEbnYb/IdI3nxk215g2NJvz/1ccbc5Cd30HtJE3hWCYmbFQQTIWZL5hFxIs8qI49P+AF+hmNVxde5Arm3fpSRxPjJOvmlVEv7vdS83V7+9sOE5odV8kPpqVN3ddPiBxoJjZfX5GAf75MhtbUnjlzSTrWKmJkYEZHIScp2/rfNSFJ80N1RqkgongszISE5JnSqeDJHOH1850E4CBVp26N2GNf/dd9/KYgfrtktRYcKkdPmx0I0BJcnVXG32rxyY754gmeztMXpkADpxbAFNhat37xL3HmYZ6p9reUaqaAV62j8t7HIPmNdWDQDVq4wUfRQeChCFfGKcsUZBSl7KJ2VPsoJygXKTcpjyl+Vb02amViZdDDpZvKFyRyTRSbVJrdNfjZBVPbhycPsATzm5OqhkZ41rKFT+rAhIJjhZ5yV7eCNrFuC19RhcQN56elvi+boiWNecX4wSHcPrsVfDDX+88L3gNvmfnx++rs7fJrFKZ0DTtP9DN/uunBENPvfS36ayQUccQr/cC6CSVoz8uxE5u8u9c1xLI4xMpDexkt9C/LUmsGfvlVkU0Pi6chyuAaXT53+CS7D2XlHE8XiBiFss/8aXu0swImnHiV0rgrGzl6oCjoQzWH84JGT+sBQcN8+eaeYNVQ4M7Nu/kOOS+BlA6CFaCYHuBj81dR+WD9qT1r3x9hWK49zNgSpacgbzjnc+IdhMxyhNfsceN3W03yZDUnFDQbOs8408OxUJZhlXzd4gewjv4BzhtVQPEruBQYfwwvwF8yoGTrbz8U+1E0wkzVqVIytbsI0nvPHfATRj8WN0EVxiD7blmOuluBYP+EJ3Ier+6pOiKtHCGYBQaNix4EPhJTDebh9+RTGbRLNsm9yvB6Q4gNiR9f72Bbbf9XwkgPTM3OqQsWSO8K0Xd6bXfmZdKBm9uROI5B1xQ66Bri08cxB0YyDBL8msE/NwPPuYrTmxG6NCrsO44DDntp37UBDaMzrHthJ+907dmD2M5xugv8cRfxx6eI3IJrtnLUlLi5pVnz81qTy8i1bd2rN5O2uhu1qM9lc/cK/tulue2y41wQx4/4/F8X/52rbDIfbvKCOpPsX1XTgTqF4gcO5V7R1H2zbxf07lDiSfPjqVX1/krRmQ4EGGLzJuelqNdyweba/MNsnYd5kSIW0ZZnLxOJRQuHioiWlcA8qyw++FM3GAvnRWgykrdWrqR+WCGbdN5KKnDktMaNA3BqQgf2ohAY1XbuY2WLfHvPQnmwEM8cNHajvaaOUgA4ewBGDw0n4/dHvnwtmQUVCdlhmWjKvpun54euj1qUWxsFUiA/PGiaeyhYKD68uMxbM1bkH5lckr80th6NQfqD4tmhGHA25AXFkVAnIHv/pJJhNLBayQjJS5vPiklYQtiF8fUrRDJgCMaFZzuLpbKHoaOma9VxXWe6huQeS12XvhuOw+3Bxg2hWO+nU6NFBQV6ep4KvXas8cUVrFhafMH163I5DB8vLDx7cGTdda4Z80TcB+QYmQ9fPuz4SzP4fWGaNVAB42mNgZGBg4ANiCQYQYGJgBMLtQMwC5jEAAAwnAOoAAHjaxVprbFRFFD5dKs9SW1rKsxQEQUSjaKOAIYIhxKjRPyb+8Y8xJiYiISqJ0WCI8ZFIJCEoBgmIaYEQK4bwiARooKGSmhgs4SEttNAH9rW13bJ3a9vk+M25cx+z3WfZyp3cmTtz586cc+ac75yZXcoioolUSi9TYM3al16l3HVvfLCeZlM22omZAiiyomqBNze8v4Fy33nrvfVUKC1ZkhPej6U86RWgKfSc3T73E5QL5DkbrdNpDvIsypVv8iQv0rPkUj7Np9UUKGlScxY/P2cHraGn6R5c3KLLAxzivXwCT7t0yx+4w9yva0OS93KXrnf7xjinevNVt95mf8E3uAnlDV/P/iTURIzZrLQ4CXMYeY9bG3TfoI2D4C/ELTLDZGkdvCu5DUryUci3/XwgDXKPy8+gokg/h2z52aU3mjm6UbO4EbLs4mu6Xsf1Kpd5riBvAF+X+Tx6aXrUeylvJOShz6jVmHM68ucTXAbJnfW4sXlAW7XSAul5SY3Gh/maosrVgAvgsht02zozQX8rXGDMLs1LM/+Nns1qjOG6qdbN09I01icSp92StbBcLVHUB1MYz8qQvV3R+jGIuXtEMzsNzW8zbOhiTHuLmGun+4agA5cx5gXfm1pdbuXb/B3vVU+6pUryLkMnvdn6TL3gekejfBRW8+8qj8FjENy1K6mOYN3UerTznWSoJbpxU1CmXurtsIJabnd7tOqyOQ0LuBqn1wn+Bvkpe6Uca4ekG6C17TbC2PMBRZsFhbrhbURWQl3E1EbukHyn7mO5CGH5eGsR3mpj8taZCm/p24pv3W4b700t6UtmY8a3IQMjh1TSFhDSqBwBh0MuKodTorgveu086/ZQGavxKTT3OGbp8byEzLpdvBv44u24K/kg7+CD8iTWwxv5CFdxq6NF+tudkv+g+5TzHknbeY9POp1+7JbZIjQKF3x1GeR22l4vZ/1E3hUu+h8Qy92NluPKjjXiVgCn66GnhvbwYck32a18Eoh8SfJqbQGHMVOVjcY+HxDhM24EcRJ3I/qdEVzQWAKUOAc6HR/gfFutfUBI+wnHB1xzezRoLYFXFy0JK61HHrGRkP8xdLLGXfNbHlKKd2rxea0u15s2Klp16y5oSS10pcVDK5lLaUmljh62im7s4W/5F5Gg+FX+jA9hBdocRNTIbGvD59rPlfNRPob7qFoNM+aKa4cdBr31jsz5ZvyYRWOHpSSZOWRwR6+L600HMucbU5kNtxWN38CUColAVSxUMUpxchnvQ37aaOume3a5OpJQ9gq/ILGe6L4iyV5HloJSrZKHk+4TOnxtlxPT5tVVi2OxKUXyln8fEKdXZ4J3AzFbK8WaGu2nUVsZbXviT3YrXLURIV4kyb2mvQJPdCTM56VmCRIUqj0oUPU68uueT84Ixa10j6/huAbt7LCjZewgKgXhL+Ku8KKgVGJ0O9rWz8eMfQX2h9h7hPy7sJhjYnXofh/CNuky6EY0/t1DAe5imqtjnGY7wvNFtkP/vyQzMmrQL/dEa5BgjH9dNOj1oiO5Jhodx8aIbZdnkJdQ6rs9xN1t4L0hRo8qwZIWaOfpUYrwuh3/gsjriIrQEEndQsTRl6Hxw9yPaMFKRR4j9t1zPUSWSGFgVJV/4Yh2m2Ejnmwytc/vEV2bt6JirgHs/6z0Edk4GYskXwf06byLEz4r2br5IoUeHw6DM+S90XtmhaeIbCtBVcXdnpy4Eq2DxVnx4r+UOa4Z0Ve/8n6JIm9FnbREhntKcx08aen6IaM6KeZs5fwV96lTU9/+pM/0xvynWSby1n5Pl4i2Ye+7onZHh3QZdNc/GHe3cSrav6UbvaaGJdGo4USv6VkB8HS33qHXiEfbb3SYYEqTNw0/jRiJ9cUeP+UoaBNvhoZUGt63W85at7jx/ce6/Qv75F4s+Uv+UPttY/V4hxejQh7b+Cf+WZ18OO0jtLf6+Oeusb1Vqj7MiZd0PBXU5ZAZmxifFI/u3tSMIzLn+fWpRl2Cc7Rw6qduRvTqi7kQQ/f69RoyCsdAN9u6fzOjhTRQ3JntL126/tL/+0/UbCbG9acw251h55POLwpDxk5skjFbb4woyErOXVxJhlzeQnF5O5uuJJOcDyWyt/b07c13LtBlRjaxYmZv5+PueNL297E9UOpxa1RTFgWonJbK80yUCgNmSfQ5H/cyxIVPUYnRfwxl033YaYyj8UDmidCRHJpMudjp5VE+TQFXhTSVimiahyc0nWbTHJpBC2gRLUH9EXoU+RKkx/BmHq2glfQsrXK/WE6r9dPiKHofpsfl12QnBYSaHF+aopP6xfghzOylGUKDnbxL0eClVaBnFShS3jmAfnnCSfQ1H+kJehISsnMlr8WgLQu0lNl7XlCgfrkuglSLwG8x3k5Fsq8H5bfuMfI8xv7tHF+O0W3RsrVHU5f69bsAaRY4yQeVDyDPF94KcE+DVJeCnlL9RaGP4hKhxr+7WBglR3t2L43XKUc0ItdIBW6apxMJDV4qBV2laLM5LABPDif+aybSIqwS6VzJq0Tkqf4joO6ASGYcKJyAlA2J5KOuOM2B7JdhHVbQM5DtSloLKb9AL0JfX0FaRq/ROujRevoItc20hV6nr2kbvU3f04/0LlZpH23EqOP1PxOQ/gO1jsGMAAB42mNgZGBg4GIwYLBjYHJx8wlh4MtJLMljkGJgAYoz/P/PAJJHZjMWFxsYMnCAWEDMxMDGwAfEIJ4ARJ5BA4g5gJgPiBkZVgAxC5RmgGJGBrb/kRBZAKF5DKcAAAABAAH//wAKeNptkk1IlFEUht/zXi131cJcTCGhhqlZ2OREaTY/DIIKRkyGPyhunCFi0KFBXAStWppCLsygFtHKokW1EASlhBHBaJm00EUtjTZJgfreDwOhWTw8Zw5nuPe892MZYEfFG3RzDWG3ihh/IYzf6LbPuC0itolW5hG3I6izt+iQezi0t8FJXGQXmu04+kWNn+FT3JFTrEWEf9HIAWS4hKQrlU+IXSRtBmf4TLV67jt63GUk2ak6IufU936IWv5EP7fRWJLGFS6ige9xjk/QalvIcwin5ITOKWUIc4ziGrMY5Fm0MI4WG9bsTVQyg0GrQMoq9nZZE9Qjbllz6jOt2TE5i+v2CNWs15n1OM9muU57t+GBnOBpRNmrO73CJZ014caVxTt0arcmzqkfQt42cEOeN+CWPGsf9HsguF8syKEIbgnHgmzKcdJnUIRYkMFhfAYpZbQi+52L4J7LBzkcRhl89fvL22KHo+r/y+F/wkEOPh/Z/4+6p8VR7j4h4X5oxr/TwZto51GRE/fFt+BNQlgQw6LdU3IB7fp2oiImrlpBdUF1AW22jrRr0Pvk0CQSnEWVm9f39QVh+4MXIi4+immREXfFPdEnsmJMrIsp28FL+TFe7wPgJZR+AHja7VXJbtswEL33KwY6FAlgLbYTJ25l5RDASHO1i6JHmhxZTMWlJGVFf9+RUjVu0ywfkJOoWd+beSDzq3tVwwGdl0avommSRYCaGyH1fhV93a7jy+iq+JArDEywwP4OLfJGy58NSgFSkGmxnF8s4ovZYnkZz7LpWTafT+P5LFuex9N5djY7jyAt8gNqYRxopnAV3RisS3TwkSn7GdYOHca3RqOPoHH1KqpCsJ/StG3bJHTW7B2zVZdwo4ZSteSoPb65+8sl0xZ3pdEh9qYMLXMYFdtKehh/gc6hQrDOWHShA1MC4S/r/+GHk5vBtr49TeC7aUCxDrQJwI3tJqBoxCV9hfTByV0TcAI0FGFaXRsmqM9R48EltQ+srkEGaKzRwHRHtZSlVDcEVMaH3ls6owZvbTgLtKyhvwMn91WAYKChiYV/iflmd4d88Pcct+iU7wlu0B1oysD2DlGhpoiKBcB7Au5hh6FF1NARQaYFjJwT+FISW6rKq6PUh6zJED7O4ymaksj0+G3jrPGYwJoMyvQ4NfnUQGoCtkZGuQfpifTblzrMipOFEdsRLxClp7nwuqby9LcGi1yg507aHty7bt5185pujuWS98sd5lxcjyc4uT6F6XK5mABVyJ5XTPI8iTx9LJwHxwQq5n4U3yoZNHaw4TRgvSFb6FfJ4E/IixKdQFtJ2k+/iR2Cwz1th7z0CmjgpHBG37vGSS8k7/n5JE8fu4+3Nr7+BNAVn45PT/ELD01L5g==); font-weight:400; font-style:normal; } @font-face{ font-family: "Whitney SSm B"; src: url(data:application/x-font-woff;base64,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); font-weight:400; font-style:normal; } @font-face{ font-family: "Whitney SSm A"; src: url(data:application/x-font-woff;base64,d09GRk9UVE8AADUQAA0AAAAAWxAAAQAAAAAy3AAAAjQAAAasAAAAAAAAAABDRkYgAAAJiAAAH1cAACZDAUMgUkdERUYAACjgAAAAHgAAACAA5QAER1BPUwAAKQAAAAeMAAAfNtqikURHU1VCAAAwjAAAAFoAAACA6gstjk9TLzIAAAGUAAAAUAAAAGBb91dqY21hcAAABqAAAALQAAAEND7Qq2BnYXNwAAAw6AAAAAgAAAAIAAAAC2hlYWQAAAEwAAAANQAAADb+bq87aGhlYQAAAWgAAAAiAAAAJAfYA/pobXR4AAAw8AAAAesAAALena01HG1heHAAAAGMAAAABgAAAAYAuFAAbmFtZQAAAeQAAAS5AAAMGDd1FpFwb3N0AAAJcAAAABUAAAAg/68AMnjaY2BkYGBgZHDU26DqHM9v85WBm/kFUITh7BLT7TD6/4x/z1lymQ8wMDFwADEQAABkPA2VAAAAeNpjYGRgYD7wX4CBgSXo/4z/tSy5DCkMQB4S2A4AlnAG2QAAAABQAAC4AAB42mNgYnJjdGVgZWBh2sPUxcDA0AOhGe8yGDH8YkACCxmY/jswMETD+B5qbl4MjAzKikrMCv8tGE4wH2D4ABSeD5JjEmK6yqAAhEwAyB8PB3jatVTNbttGEB5ZsmM7jhEb7a2HRRoYdiDR+nHsyFcXgm0UvchIkN4ociXSEbnEcmWFQJ6i6LmHHvoIPfTYUx+iT9Cn6LfDFUzXjuMUrQiS3+7M7HzfzIhE9Lz2K9Wo/J3hLnGNvsaqxEu0QlOH6/SMtMONis8ybdKPDq/A8rPDjyilXxxepS9rXzi8VsHrS1u1PYcf03b92OGNCn5S8dmkF/VvHX5a4bBVwduM61RrrGH1Q/3K4RoNGqsOL9FG4zuH6/RN43uHGxWfZfqq8ZPDK7Ta+M3hR/Rn43eHV+nF8sJnrYLXG8+W/3D4MT1f+8vhjQp+UvHZpIv1TYefVjhsVfC2xScqK3Q8iYzYPdkTnX7/sCm67U5bnCo5nkotdsRASy1b5yqVuSciY7Lj/f35fO6ZIlMT7WdR4QUquXnQ6c7gXHwQN13OjD+Ng85hv3d02DrqHvZftZDqoN3rdVq9brt/2Or02gfdl6+lzmOVio7XbbfFQKXmTRSbVBZiGGgp02HiayPiXPjCaD+UWL4Tanw35aaYR3EQicQvxEgKLSdxbmANRZyKQGrj430503EexoFB2ty785yLCAlzNTZzX0ub3ERSZFplOKL4aHaxayux54m3asYUUmVEgFI1RaLCeIx3CD46Hs2MbAqlRajm6VT5Ic6vJGRTnOao4FTERswy1MdPC5yVZAjV7BCp3FjrWKuErVMV+FYT59ei7I9RYpbLm+dbQflsdCkDtlttF1InuRU2lPoqDqTwJyh+IlN4RL4R8j2I56ipmaMnooBAPw258544G0MpTkThr8PKiCa7Lmpxm8kYQiz3bKYzlUsPA6BRLMsxhS1hQU2RTaWP2Ks4h+CPTuX+XI7GGKDWjUIG2PGhlKcUUm7HiU9P6e2gh7OgE1KUUYHvX0wTisiQoF3s7uHdoT6uQ2oCd6mNdRvoFBGSxvh6SkQJ2sE9AJJ8t+gc9hQoJw8We6JBhmPaxzXny8NOgT2FjJp8oAhrjwLsJPcyOkW2ATII+oD7vlPOYPXBMca6Aw196tER3i08u7x+BVyqOsCzh6uDnR7v9dmzg1Ub1i69pNesL8d5Vp2tjceebVZv9wy9AYMYb6u+wP4QuW1NJHaG4ORjZdXEOEdgZRVY5iE8Sus77CnU9nOqbLsz58wBnoJPstlHsAr2nnBG42JDZmA1BLxj61SuL2nGVc/hY08zTq3t5MP5XDAXqzBnLQbsfPZaKDfwsKsMu7bXJYviX2i3k7GYiT2et7ewzSpVSLE2rLWcqibbFCscu3Xo6mO1jxBtK9VkNpqtCgpSsFHcq5L/3Qqvo2KuWzmDU15bFjOe15S7nzK/clozl1VXTojwzt282OeYq5VUYi2jAKtFn671a+789f/HYNdmz7nu5pMdyuE7wjxInoJF/KJvF8w0Yc+yY0PeueKpkcxw4iY/4ek3LtpnJOm9q3ju5tQyKP8nAsrKDlqVYeU/b9WdcbaU2ViO5cTfla2ao1k59Z9z8ZCajF1HFnXPuMIZ90cyr4HzSPgtXf/LuKTSoSZH27n2Xd4rzlp2+PO/lftctxFnsrpb90xk4Hx819Prb2nZlYfkE//Jt/Qhmf6HWvwN3qF+QwAAAHjanZL7L9ZRHMffn4dUii4ID319PYqKiEQuJRK634VyGelCK4TcpyJRpPuNLoRardVWU6n1W35ITVrSWvP4F2ozs/l+Os/3oT3P1tbWd3t/z+fzPp+d8zrnfABYwChXEAyhr8hIzS0tZouxBZWwgg4yPOCHQAQjAtGIxUYkIwO5yEchilGOVrThIZ7gGV6gC93oRT+GMUKTyZZmkh05kCM5kwt5kBd502LyI38KpiiKphiKox0UTwmURCmURpmURYfoMOVQHuVTMZVSObHGSeOi6db8kCqlE1KV9Eu2l7WyJOtkTzlUfuSuYxassuCcrzKGIhIxWIfNSEWmyliEUnGWNtzHY8HYiVd4Kxj7MIARjJG1GaNkwhhEIeOMG0wY080YC1XGUcGo1bzTDIwz/pTtZCfZVWUMMTLyEOt5kL/zN/7K/fyFP3Mff+Je/sgfuIffcwe38z1u4dvczE18nc9zI5/jBsPLsDXrWGaJXVkrsllsy9OFl2iYU0aVEWVYjB+VHuW90s1+In6jdCkvlU7lufJcZE/ZXvxtgLGesddDD4Y6htoAfY2+Sn9SX6kv12cPjg5WG3vgv74sVJjlJWZx2Xh02sRtMKs3ztQJXTBx6/6yU42orYUjAv7IWbz5hLSic4P/SEIY3BBupjM4C3fRxROqFyTz4IkoVd5Yg0b4qOumokCtmPBBVvjnFRE0FrCcZDV5ylTradNtbA3eDGAmMGu2nb3DHDg6OWvh4grMldxkuOs85s339FqwcJG3z2JfPyzxD1gaiGVBwctDQsPCV6yMWBUJsf1qRK9BTGwckJySBuzLzjmSezQvv7DoWHFJWWl5ReWJ4yerq1SAbWvXiU4/vGVjx/YNSN1vsNYb0TbFo+BUgjHevKsViXsy6xtu3Lx9p6kZqG1E+z3RE9hx6y52I8lYlrEX6QezDtRduLb10uUrO69fvfgblEj4U3jaY2BmYPj/HYi3MhgxYAEAYrMD4AAAAHjadXkHWFTX8/Zh4e5eF1xAvQQVd7EXig0LVooUaRYQAStVCAKKoNKrdewgFopgQSxYQBQVhQgq9oI9MbEk+iTqz5gY565nTf5n15583+OD95S5c87MnZnzvmf1iIEB0dPT41zjYhO0DVvRhIjWeqKNRLTRFwWDbCNJoJF+V1rZiRCDmLd+nKhnnMfanRPbqO1MSVsJ0SMcMSIC6U4GkOFkLJlIppAwEkuSyRKympSQXaSaaPSIS2J8XGTEt/NmJ84KDk1MCLcNDZ4TmRg7Kzg+MWZ2cGKCth8aHB8Xaxs8W9eZFR88XycVGhUfmhgTMTt84WcZ1giJD38/nxA1O0zXiAkO/TAXFhUeHz4vap6uHZcQHBoaHqtTGh8VO0unJS4mJvjzcGh4WNTs2cHaZtysuNjwaG3LOW5OUnzUrMgEy17OvS3729sPtrYc0K9/P0v3uHC2m3jLHpau8WwdGw/2xjxby8iEhDnD+vZdsGCBbUIS0xPPDEyyZSvpfKt1LvMV0dcjUj0SSUgrGXMaMSekI0e66JOeesRKn/RTEAdCUglxkhBXIzKJkMmEBOqRqRISrMfcSnII2U0IEPItITsIySSkjJA0QuIJWUSYv8lCQlII2UfIHj1ygJBKQvYTspyQg4RsJuQkIcf1SD0hJwhZSUgTId9JyGlCiglZT8gFQpr1yCVCzhNykZA1hFwm5DohVyTkFiEtErKTkNuEfE/IHT3yAyH3CMkj5BEhWwl5TMhaQlYQso6QVYTkE9JAyBk9kk7IUkKy9EguYQFBMghZTEgcIcsIcSSEJySRkChCFhAynxDmpiRCovX0mOQmorfUmNRqA2wkc8o0clJvkN5RvXMSIhkkCZEskWyQVEhqJc0SUd9E31rfXT9YP11/o/4j/VcGXgaTDLYaNHEC58jN4lK4XdwR7k+pnTRFmivdIt0lbZK+killPWX9ZD6ymbJk2TLZWtkW2VPZ77K/eUd+J/+c17SybjWxVWiru60etfpd7igH+U35C0Nzw86GCwyXGt438jMqNnpk9LJ1UusHrV8qQhRzFIWKbYpDilOKf4wtjMOMk43XGJcb1xnfMjEzmWQy2+SCyQOTN6aGpp1Nh5leNX1g+nsb0qZdm25twtrcavNbm3/atm3bq61j28B2Bu06tuvbbky7oHYJ7XLb5bXb2u6IYCuMFCYIEUKysEqoMOtlNtRsldk2s0qzFjPxm8nfPP0GzQ3NO5p3NR9mPtM8xjzJvNK8xvya+U/mL83V7fXbt23fpf2A9j7to9uva7+nfVWHTh1CLCwsuls4WURZxFukWORa7LE4ZNFocdXiR4u3nTp1su4UHEOnGojlb1M15dJbgYJoAnSipgNHIzXuAqhz0UNjxOFi0UiAd7nUQzTiYsYJyCQ0JsApaIOCmogu6iBhIOTQ8dXZHDXDwPedqmxOgYPFN+pJwsQNodSfBkMVThgPoXQC7QcFXmgO0+ks2h7AG40gnHo0ZXDV6I8hEEYnnNHKYn/IOkc7QC3OQiZ2nhoBR3d5CRisezOEbUA0FvuLdcL/ply27T6SGlDjXnVuT17dQwM0UYo90FqYsJHupD/RWxrTMxn4HVKOrsQrQm3lLIc+U/q5TI/ef+v5sSdXVaKo8dJq6dftvZbj7k//uMO0GCu9VwtM0nVGFJM8/uRq7d5ZDkoF2uOyNOE3eFx76wH/gipuFNO2aMcduVB1d89TfmwhFz8iZmzUJJ7a4yxuxqmUSjgC54/X3oSTcCKpfjZffIULLPcv8gTaCuwdoDv4lc447Ed7BQwdAdQAqOSBK8qBX3dOsJ9Ud0MF989ewI41PNpSf85jlGOYI/AKegHho+O1vh4izlEnCWtvcHQvtbKkHkBnAe3ZQuVoQA34a4UcbY1tfNEA0AxwwnPsi6FoxCuG7g4VFjlxuAet3qAH4CzAnmNQTjk04F1SOGxN2zRpt2QGdEIf2peGUvaSM1urvZBbRnvFpmKXeEijXWivitxEVE4cRdtsSf8dye+UbNk4EttwiofiI7wr5J+lc2EfRnpBJI2k8ZA9Dudqmxe0gyyS6nAUSoR+0J2uPJjF+kZia3wj0EOQ5YjVoBPozQQGQDKV/Mz6jer+6nWC+6Z3/n9bXE7lFA/EF7hAoKZwX0waBJrRmuzcQPwHYumIS7ATR6Api52xZwR6APAvsTen2Cw+Yt7TzPQWpVJN13dtL6aIA9U2bJ0qTBTL2TpJunUC6PnPa7K5lC/mprC5Txt+KO58KhRc0Rijnzge/Tbe1GynGTm+LAdM1fqih1BwUbMcsjw4MYSmCgWXtJ2x7C20Ev8WMt1EU+qnmUgnZTiJ2zAjv5FThImF4k3hufMFaqQcBN7zvMN4Z9m1I+e3X4bbcDICxsKw8dNoZz9+TmYydTq5fg8ac2h36fZZQJ6npZpoYTAkd37Ado3DxGu5gqV8oNhD6CxXHBBPimeEl6POU3MlHQxU8S4KxwOHw7DVD9hVBd/7n3Au/7Hiwll4yjvkCAOG+lmyDRzG1b8C9/RYsIdqPn0k9Bw5kRorKQd1WPWQvSy9GDRcpXiu7qa2E7rIFeigdhFHC+hNZcjRcKU2GrXrTGKipvDXods3frh97A2LRH7UIoFFfIitu5eP79Do3sCzjHglPkE9JjnqoR21Uikmi4fUUQJ9p1NxE5rwEWYCXKHzWWHIwyqthUPVvcU2Ai12x7HScDqPC0uclOzOdLWzeowDcSqa42h0Vd2EizEng/ni21zQ/jE7BrH5BGpPQ2gWHcfC3AjHqB5Dy/Zr1Sy3Boht2ZqOMECzl0u2mhrlCLEQvyZ+He8mK128Y8leQA5uNm3FDrzigXoYE+0DGhN6vxHvO37Y5nmxFTZqTO4U0QZRzim8RXuzK7RChgbq7u9FWPEa8FbJXu0L9K93erSbWm8AUM93UVcBbUUN9n5H6gGpmkzSaFq0Ri4UuTShq3zVRaGbXFEsXhb3Cigfcp1aK6nVh0Xr8fRj5jhXbPULdlY5LBF6j/KkKqU9nMCan9iEQX3QSBXTpG4/TKDTfuBwxBHmm/6AcwDduqKS+kBfGB7lNX7QsElUAbQT0EGX+2FXbx5/pl05uhZnaBdvEC+IhwQ0smumvZW014fFG/DKE0A/eut2ER2Plzk02vL4LqCCd8gV+jqNpe2UtnAc9/7I9iFpmDlCpVgqlqtdhO5Mn1ql7iFc1uyUZbpjKlD9dz1uAPNUD2a1t3ou81EPFlP91YtZazjQZ+8ktIO6lWMyDn4XekZ7Chy2MIhhcyOB7tO86Ca+YB4+q3kxUnw9KvmPdzPOALaIFCUaelbrR17tzGSHAM2gtbQHnnBMwVH0Eb2mMXkAWIR3cQj96XYhHS8acIo36ilMtqdc8VjdgzV6yRV9xVT1JoHuB9r7b2M8BHCaRgCaqwsxSleVutI2gqbprdItTTz9t5Jj8i5a+ZoJGCGl5u8KaRTkTMB9THaFuHyCoKmDrPFindYIZ1Ej9JYrtovdUU/oI19xQ7CSK3Y27hIa5p9NaQIeHbATdsUINPW8ZqVyhUmhvn78OXzrmM4FvgsW6vAwd/v2yYP1wJ8/4D+IunXuQo1U4RCzNmojr5gkzhdzBWu5YgFuOSnYyGtFF8FWrqCxYld1rHBJlrkyaeV86A2B01P78wm042DI9vkJKPdu8M0NKFH3QROAZiqFUlRw+U07dpyGUihetmEpr6gQK8SlwuRSn8IJLKNGUwvajR0SrS64Plddg4bqxkY+zZ5L7uPv2wcmgk/hxB18sgdXn3gt+TygEn68vh2t+JWimzCF7uGcHCaH+QPvHX7sR3R+/QYNVQdh16LKdF6xSywThwu3p9aMULqAz/TRDvwlsa1jOm3/bk8LNOLP3PMXjTX1UAtb4yECMpYtWJbCe2skLXBO1ONWlazcAiUsrQ/iFlb0+8qnUHehn/zrvhP00LzgcqbFzw+HFEhdmbqK95QVLNuyrBhuwfHdm3/mFZFobHYUKzGa1tzdTKNxH+7HRX2AbqQLHojL3u+G02otUtcKDunsc+/RZe5f6l/Y5ltCjo5QOoL3FEeHFWtgFaxYfjn82HBwBK/AESP4RSj3AqA2nprWN+AUM+jZi6aak1ADpe8Nmr80VWvQDZ2xz3TGHoKyRAiFjKXzl6V+aewqnbG7xW1s0f5yRZFYgleFAXKnJcJAuWJXEQ0Wbm6sxOlcRfb+nBoWVyM+x1Uf1RjwC/bw4Bc90+2G20KbWGQd4W7drj948kNkuXS2pApVGMxZ8+3G/37/TgwLzKKmF1yeq67Ad9WNp/ggWnNzI3dAbSEE0sOcg0NA2GTgvSIaHqL7mz+/+MbUSZSIUUIzNZPtwQDH9BjqOQQyfR6AP73MLU1fGg1pMPp47C3YBdtWb1nDn5OlLk1ckgjBkFAE+yF/dcWKPJ5VIU4RK+5l5zQrB/M07sPEcWPS/tJsb2ZfYo5YwsbtgZX94G4Y5ZyGbekqOp+W3wd0wXiU0uTrm2gnLOEUyeIRJmonV+SIZ1kC95BSM4/xVKKykVH9iTN6KMP8KqQ/Vs6ZqALvoF7gw488HfWz8s+mAdJx0WU1Kmio+xOaoXnWTo9N/ErZk6Lmw8DQ1m+ya5W1j5TPpAqaioF0qgBvF43NhL8XcYqc9VQuvJTiNxfPoET1qwz1m478rjx4KlZqH1XepIJzdf+DZv7uhMoByi4Tf5Ge2ZsYrAL/oK7gAz774i6l8ctk/ZJ9ZgKDZ9Yyl8jpdkprqWKGOFEdIPgXzKL6mQz/DKQyakkHqsCmzv1aDB9OWzVkHEApt3HZxuWb4Dw0lB7ezp+VBcUGJE2GLMiG7JU8thHbcJXZu5N3JvClzdy8ktlF4fkMYNAqYTka/YAylAG/AqiJphU3Y2tcLVzjFZUPRBMhy+cpUENamO0rxgGc01gwYILrMVFbR4LgLo7m9lw9UH0BDsDO3N2ZfNEFLjY/Mm8mdAX/SVM780OpJ6d4ztSvFRgsTbGh4wF80Q2Su12Eoj9wLOQ3Unco/BVZnDbSIexQuSR2Z4fDNirSAfiPazI6azrSUdrCmqqWCoPklJgNZqfIK/Vz/EfAudSGoekUmkRtGaidS+eyXl9MZv9ssB/OVYYvF1gUK2l7hg+CaWdszzhIJCrZaRmCM7ELNaeRShpAhwk5jdz06JCU6cAP8r3027NTlx6pDsPBtEOxfP5pLnxr8OYAlhXyoQNpW9rmvh22UjVAXXHVDhbtlvgalwknGSjICeBwLc4XAsIik6MhBpILYQfUVu9H1UaeOjwWTpTuz98HdVAyP2cavzSdoz7pvr4MAU4+GH2KlbyarTWV/MrA47Dy3g7sxm28Hn2kP8yAmemhqbzirPiUxfEQeSJuZf9r0WhXcYvArNV7w+JhENWzpNbUFoklDmJQSfIGrZUxZrRzr74sUlS9nrLC0PnFU7RE1cu+tCtDfLSd0A8NuQPrK3bAEb4heJen0p4eOoyGldInVMElYLAQPTclVBnxvEp6aGvSbJVCzFF3ENafp82Q5cUpRoqRYq3wzKGlR8/RzlZ9bru8/P3WtefKCWZjg4LcXAPrLl2oq79y9cRkT6VCjGcIf6hcC/1dcLNQhBId8mYF9WBfwaaMmtI+DVpUboa5okx4ffs3JI/9G+y7OFhRMrB+8n0VmrDD+CSt1jn4W1YNaw7OcXGYNtJpZkT51Vu1926qFGex0OwyYCYWsc+/fVIae2UNp5lGtwr2ckUYLq4XHAIOXmQM7PRR7HKK37G+GJ0DMqOpMUftxo4eB5SHPi2ejMA+hHPbz1XxLTKX6V7xbsBfFi8ID6Dor8H/QeCYKYIwTP6vUdFW/Y0w/N+j+FbMFkb8R7a7+I8w8j+yajFfGCXvaTb640xLIbVSW3HVm8v3Qy1/eupRb++p0yYoIaIoZmcSrxHejb4HKGAqngfug44Q0UpwkCvE7o1m6M1mtjM2nioKsP4yvcDQ225croXeGVCDS7EBGN8ZAprrDMziFTwh4HGxlRerA5+IAM175yj0L6WtqGU96MDcxM+0IEJJx7LSfrEXgPtjmED/p6MHJowe3PlED+j5YULBZerN1lv+BSfQUQY3Rhnso3ux9OLZzip1CDlffYi51urdqU9AmYFdp7cOzLO061ejX4BpLFZn6Zy8UG3/thdzLG3+e/CXClqrT3xwbMm7C//S8RS+rzx/9uEP32FrLZ65lXQ5qoF//qfHJldnLui4W8WQrxG1EhyK3Sr9eavul9IuX+fqgq7E/cQsiMYWAdDk6OsbV+qOniu/Apegft6BEF4zQuPLLazKOg6neIyleQLz2NaIQ7w4XPTlSkILpsAkoMbTOju5B03znsMoD/OxmKzezpyAx8brYLO3utfbfsx+hI/994B6prhbZ7S3+Ke68oN5oo2bVuYj6sUcNaeNyUKxSuwoYOvBV6ktg1/bsNtHllOOg39hX2UMSp+gUuW4WBjoOoYqlQO1hOMOm9BvmjqUEQ4TtT66CvDK/gLtfODXn8+2wF/wi9e5rtr0GeWwkBrzGc5fIc5v1Du5TY+PNt6Bs1AVDuNhSKB7t578ZBnaRlwNhOHg5Dt1JARAQOHknXyyF9cw97vkJkBj+OUaoCH/NYgei33/A6zRCE9ra8tXg5eYoOO/BSW4W3D61+B5tP90onw14YKTBGd5iMEY5thm9Rl8LqCx102qr3SFcdFT/dIbp+zuC17gtdAvgXeXXdzdWNgAd2B3VIY9v3gORw/MH2rHDsABF6c9gBtw//D1pr2ezbMewhU4VdpczV+VeUyfnDAe7MC/GV5D4YrClZt4/EO6ZsfqCtjBO8wVaLl05x/Xz7fA91Dpk9mFp2+os+A00TPSF3whshxOQsvFcxhbsiRh2TxIgPhViasTP5MD6qbZ/EVh/Yoq1KG51okLxCO6omyjOfeZRSwQsxh3cZRTz69H0z4fvHc0LV+wjoMYxw6lfvIn7ykPPSj20WldPugDLH+t09f/Y/f3z4pwlJV2cB++FK8JZ65zhwPL3KAvnyabdjxgjzNLJQuqTzvSwbTLQ+fXqnPQsL2m+uH9elSBludKox/6XODv/DZx43gnLnTXlO2+JXyqJ3cspXrBnnh+kCUXoykTHILqX6LZTdR/rroKx76t806gIwZRs27wGVRvZYja6V/QeiQ2aY0pEr/T2YJWtOET6i4Sl+ssOv/V2BcvP2d1UadwyRem3tJePn2SPiOWCT6bZk7lvt09vdgP6ABWBak1UGeYvH76lkjedVRzek0tt3f2keRTgAMZgUZrQGc4mVm7cB+v0acpAna8z5CMTHkA9qRvjePpbnqWyy1bUg67efz+hUA72jPAI1WGw7cbE8p53INnuXWJq+dADP8JD+MN9R1t4uwSK/F/App6XeujZDsInajjooz0DP974c0NOnqRsy/nCKMXwxls6oyRKk0PukM4rmOp9VVallo1eQB1pXpdGZkIhbk6MvFplc1qr08Z9ilcFEGiq+4W5QhuQJ9fNtyiPv0b8bYj+NC/ewSB6+PDU+ghBgiSsFZHwDw1ppT3BZc/T/rSx1p21AoNGjbcofp+DBVa4gBsZEWXO/T0yvnmpvt7/gf8T9Bd85RhRjpq0GPso2Kn7zCBmkDnkFGOwxymUgJU4Kk3yiiHEUpxxv/3VGTq9d8SXfZ7a7N/GDhNnzJyzvfeh/uzCO1PJQx1OtLOt4egseoXaKk7eqN81Lnpv8HVz3nunzCB5fkkbZ4Xrdy0YjOPf7I8X6XNc83o2QI1G0k7UIMx406gIQp3sQNyV5sDqVyJq3C0cI9lfxbL/o/VgP9010I34M+Cyxcl3ocBjA+g4TEee+vEJlncxWivOsQMXcwqMFhdIvxGB18FtMbBAUBNbax+ZSauV6cLk/O5xOnhcwMgEGJ25Nbyk7K4ZS7Vvr/BUzjdUHqTV4hman2h6Pc+kKy9zXmt7vKpPjbtFabP4Pz95kVDCISWzz8JpbB19dY8ft0xLmVJyvI0mANp62ELlG0qOXCYP1jDlqxQL9CmCUux9UK/Mtqdjj4J3BLs/bmjEBOwUiho0XSHTGfW2/N2Le4TNlz/2xkyx+iukSUsllx1qHI/I3Zuupa97u7ZnuZUZXGKbh9EmulKrWC3D3L4Pa7Sinf7SpqNrmSdYe9f7SUai3rCQuSppJhKkhZSvoTyKFmIEkYpsUztbFb8EcVSz/fthe/bJZ/QLXVHka3vrr2gKkIbuv3UJmqMa7QT28wYKv1VTMZTAi2TwqG1hwqqeNzZSPOkta/v333BDopjCQ0z+KLL3LSDE7eO1OINKuniT1V8F8j2fQZcVtiikOUhfHffP6Sb6OCnvbELo6nntzTs5S/J3GZOTfOFHuB2JY1BLyyQKsSeb4eJZkK0+I0XMMpzjX6D1zxgtuabetiO9Yw8NxwBbIffbaMNnGYGPhFy6uhpgCBsC0CffAeAT5jZY9SjGdV9a2Mpm32PvoHoEZ0BNCe5ks2pyUmpaQtVtBHjZPmb0BHy0rhw9WqhOW362Oq00JEpUpbKDkLhiBP3CqlDyr3AESlSPLpK2Cxbsyx/6TrgC9auLVRhpyLaSRafkTlfmcMY6+KVvPV1YUnakvRFGXxJdPqi9G3LgVuUmpmdBkmQsRnKoCSvsHBD9uZF+bCZL9qwqbgkPy1ZCSlZaWkZfNHsFcCtyl+1YWU+j860u5A/b4W0dFsBLFxQOjcTUrbk5EBGNnARm4WM1OyjpdKCdYuyVZCzeMniZfyGZDYzermQmlmwcUPBhs2bCjIy0jMz01TjtgubytbDglhIzgEoWliRz4qMo9n+3LiMbbnz0nfmzpJ6HBXWQXk07MkDmJYLc/ZAdA5DULKjQj4URK6Agn15n55pU7Mhs3IZZEax9e7gDGF9wdp82MAXLMrLyV6Uk6mErDXZeel8oa+QWMVlZ+ekQzqk5mXlQz6sy1u7kWdhZSKsW716zZolq3JVmclS/xRh/bq8/Lzc/KzMRdk52WtzClSKEHGSOlgLAEPELeowYeAWVnIG1mkTTvW5owjB5+ocwSmDy0tYswAWQHjSrNCZ/P4c7vSRfSegAYqXFOUW80xHb/GmlveEiCGswaBnCPqpY7TFKERMVI8TgvK5+cGR86bANIjbtqiG98/mlrsfnPwzo1anjpdc12pYqh6r5T0hYpj4SljfTGsgy4dtQJwh/vixiIXgP+IPQuEzW0ix0u7tR1HNCE2Ywbljh89+ZEDjjs08p1LMRBdbYVvChiRIhNnzIv0C+dps7nLD/sOMUu/IKJu7ja2IpXZf8JcQPLBHCAnhJvsnxkAYRGxfcJzVrLLVZev4dUdZzUpjNSse0vOhBLZsKN5fze+rZhXoRDuxSchrS3ppf9w2J5ZkBllNjukZ63nrzdLL0luhV6N3TaKQeEimSmIlCyS1kluS3/VV+j31++o76nvqT9OP1I/Xz9U/oX9a/5L+T/qvDPoYjDDwMZhpEGUQzxjeEHWoK2hs383+zOUMb9Jf6Cb2DKjy3jGEnThzqR0No+k0AOXUAIepbsPVsrP7+JsyzxDXBO0PJaZ2j9AOJ6MxOqMbQz1nY+un8ob/4jbo0QUtGBf7F6GhHn9RC/QC3pB2GvEKrRnSMj76V8vlutpmRmTQAu71AGqjpSldnBlN8dHSFMPgbd6lTtofGPoNZpgfBh+fiq3dfp3M4n8cDHX2swEncKnwO8gnO3HHY+7F/QjYEVCfmWgOP4U2UJOrtvVRlSy4Lp088wwuwKl5x2bzho4wUhPCJVBzh1G0HVAjGHuREY2SldtWlfI3RHdHGKMZzS2ZuzSGQV9q9Wo42gAOYTjpyU4czRsOArqdUjpQlDik4DjNoABaf5PxmHrOUJPhKXaQarZoXuf4i8UAFxjrFUvE15zhIBzdcz52on04wzVU7zwreDbN+CfnXxq0YSJzqwPtQfvSaCpt8nysugTn6m5d5w37202aOQX4gOia79FN+xszKlTVULa4Ios3DNsxtcQH6EBGr2jfFdRpBe38oz22Y4bWF9ZWMGDgHzlDe9fUz/c06mGHJ2iKnKoOqhYe+ZY3tJvc/EoFRYwVFGrRwur3rOA9AWGw2JT9BdAOLYOwvfIT0Bg7PSDBh32P7z8hhoqXVy7dYCO75m2bHRs/LyZ2+7yK3du2VSgNnWCApryFhZXuGt4JPP+f99bai/iGjxfx6UsXfn0Rr7ubNsROjo+pMR2gBbDUmXa6MZB5YaAWsKKz0pB2GEYFajAqoBE5bH8fzdDgVr0v5ZSGuhtdz37iROc0lGkKQ124uMCYxJmQDBkrM1bynrL8ZRuXF8BdOLb7xHPesOilFST35NjTWvf8cKTa6o5UE3akGvYsZV9o9Flm02XADCyitrjdLw1NKZsbjnbWC7AdteQM+2xhlMLuNBMbgNZjgXal1nWA8kc/23GGU9ZzKaEpqUnaTayJKJtdlJQfCzMgIiLeia/L4gqrCzcXQTEULD6YuCu5OHsXHIYDB7bf4A0Lf+sLKdYce/bTPSPiyg8c2Kn9mxMRETcnQmVog4NdgXlo8AnANr8+s+EMg9ZzScHJyQvZSZa+NnRrdMnC/GhWL8PC5oziT2RxRTXFRcWs+mxYVJ2wd2FJ9h72HaqrdtzhDUNjdlZX7dpVXV0RExYaGxeqMrxUd/R8c1Dd2LGBQT5eJ6ZdUhk+ptbMC13ROgio3G7AI87wCfyAuWH5nKEW4OQygGP4f7uiI1YAeNpjYGRgYOADYgkGEGBiYATC7UDMAuYxAAAMJwDqAAB42sVZW2wVRRj+e0qB1lJaKNeWS0UuImrUqqiYaGJ4UKMvJr74YoyJiUiIlxcTE15VNBgTkypCCIWk0VQIqEFiIQZKwCBIoIGWXqC00Pa057Slp5Q2+f3mn9nd2e3ZnksL7mRmZ2bn8t//f2Yph4gKqJJeo8hLG199g4o2vf3xZiqnaegnZorglRNoRd7Z8tEWKnr/3Q83U6n05EhJ+D6dimVUhObQRt2/9DTeq6Seh/GLaTnKUrSLZFaxlPOlzENfCa2gp+lFiixdq/Yt217eQi+g5x4/PITcZurVfJn3cR1qu/UXlOeQOznum9Or29xv9Z2U+bVuu0fKEW7kRrwb/TsmgWM01Yi0sIkryBxofWv2CB49PMRNpn+WxmUStEsgjXLCbQ87kPOw4D6C3WJer4bQt0IfD8h7MI29upFGudu0b3KTS2VF+zaki1zPHRY8HebdPMG6vp31et6eOqOs5z08wH8hD7tfB0QSWvkK95mxrWo9PqBrCkaDYx9HOSqT8m0qYE3pxRrtSGeRL4yDrws5xjFPSjPgz3A43xzMlLQpGvDt9Dg+JTrXYKRlFHv3CG4xzS0HYodzpnXe0KnPj5vNO0PrAVDxIqh91vpSb95fcwNX8R7UtmvuofxTymjS3ezVTyE3KYmzd8P7BJ9QpTXytiNJwK2TO9W8rGjUNV4nQK9RT6uh69ddK/Wv0YBO/ttHJSPP3J62BvSHjDoJ25anbKOxmXHBsQf2rQOc1PLcrbWTD7vSUizvq2G78kE9YtzXG4KbwnbMxa2F//HhFk+NWwb0HvU4a/jW4EiJ+RJNRrUwHfONHbDXUTg5siJWOca3ZM8xyyqPpLHqYHK7iVVt7a7mGqz9J3YZ8vm8OO/kWj6juIa8E/kKH0d5CLnO2K8aPujw1J37i+ab1jCMqHaSB3eYDE25797HnwOPo8AvZizZkMjlLfS1OFZfsGrmXdoLQz9iBoNmSK7fzlyUskr3wo40wjKrUuNahzlDfBy73fJpwQifhuXuNGucVvIOudb27ILZrV7BqOvubprGe81qaq8OKT0r02bsZByaD8+urKXhV3I7ecZ4q/Oenohvum55LW3b+hHpXMb7sundDazb+ABsXNwXMcTA4T/4mMGmRvbYZqSk1mj7DlXzpETJgPqOcpfGhQ/xYXDkKMpD7qjrSTnaCkyHbfq4X5qMxW4K1ziDfUJ503Tsgu3zUvu/sPX4Dt9R5RTLdqMTYwTjVSR/RKUt6Rj/jPIsX1KcuWv6ttez7p58/X8P30gdlxhKdgVjYqWP0IOYkZpOaEmPiobtqNneQ+rXkqx/zlTu8/VGA6OiwZ4wabI4nVom4xlT7IpYw6tKk+8iX9ot27tLrOG2iSNJ5TM8DYMdPGqdq26KR4vKeVJZt0uavhID9oo9bJA4u07s+wXYqFqH3+nFsToiNfVfbRsF352AXR4Yr4mBFbpFbuYiTzcSdc05Lfrf8qhxS2iJ9vn+857gOpYFzXuSnR9BH4sS3DLZE+b42CbdMwM8cjugaUky4qDIZCc4WJtOPJUFlP2OnUJcXSPevx5ytGOqrJeSD2CXSE2NzH2A+6xMfn67S8/KjKGNhXkF1xr02nLpt3eu7x4GrxLp2crA/s326TClvsazu/lwtTqFxwEO4ywQJLwffqDfi4/dUwRsDv/OxwB37WRP4K6+NSIlAjKUDcansphTzd+KpR4MnNhHfdYoSKGCJCsd9zXnhuz2BQ/C6rdace5gUINcP50a+rbwu8IJ50Wt6EJ47HAzqQ8IeqCCbO9Z0tGWMDmQO7w7mdoSRE19/KPRtFPiZfZZn/P9pyr+zD71pqJEWk9+FjJZxVuhe3U+CeyTuOEH68Tznfttv6vLVcaT+mDmI94ZDGv8xkeQfkLeP0l9awq7v0t+Szrx3al9LglyYHyUEeBK2b3yOHKXOoWeX/ufUJl3b3Ez2ROyM+reTulbt/P+GMh3W3TT59fOhZ0709gtamzJpYB9H0jiTRPBaDa9k6nvT4b/nqvDxKjt4+120B6qk7A6n2aB20SU7J2AkpOIY10ZCNe3riz0rdvyAd1J/XIy3Mam6r49My2CPw7unEMRqqaHpb4Y7yXGDiynCuRKWkGP0zLf+FyaRnk0nWbQTNjlApyDC2kWFdFsKqYSmgOfXUrzaD4tkLX0s5DKaSktovtRW432GnoQ5Wqkh/BlIT1Fz9BztMGd8SQ9HxKXrqJ18mfSSRGBptBKc0xS/x4fwNpeWiQw6OQ9CgYvbQA8GzBWeecIxhULJsGnAukRehQU0qWi10r5G5pHe8wd91xQgzC3DHkddl6Llea7WKn/prlSz9X/YTEz1/QFaetFQkXAS52Ky6VWAXoqTBU+pchF4N9j9AS4pmfMs+i/TKBZ6LaXC7Q2HfXuXpppUiH61X5emi0w6FRhEgkMXqoEXJWGzrloT3cx8XucMtB/jXBhjfQsAKSKniWASP1zjghlZgDCfKRpoEgJ2guAaSEkcz3k81lIzlrIy0ZQ+WV6BbL0OtJ6epM2Qao206dobaUv6S36ir6h9+h72k0fgEt76ROsOtP85Ub6D6Zse5F42mNgZGBg4GIwYLBjYHJx8wlh4MtJLMljkGJgAYoz/P/PAJJHZjMWFxsYMnCAWEDMxMDGwAfEIJ4ARJ5BA4g5gJgPiBkZVgAxC5RmgGJGBrb/kRBZAKF5DKcAAAABAAH//wAKeNptkk1IVGEYhc97vomxoNCZBK2gMizHdGHl3+JiST9GNUPaD0LhRsHF9LMoRHRVKW0KbKPQokWzibJcRAglWLaZxUSECYFCSIQDrYKgIrideydBaBYP573ffb/vu+fclzHAIuI5xvkBre4xLvAjavEL47aIHltCpa3gKkdxxkr8vE0jZSXYy35/giPYzTb0WQz7LOZ/CXo4iS5pG9fjOhfgeBYex5DkIjz7o3oeSbun9RE9f4fn3qHebUaK7aoD7VNPPaqkl5hHD3MYinRilBkY72OAt7HF5tHCfmyVGhv8t0zgB4+jkSfRYr/RxG1otnOo4SmUM4n9Fkerxf1pbizUbgwHmBKH0Kz3ZeprtBs4wri+vVxnbkcpa3DUOnBTuoERdLATe+Tjou6acXfQbRkcZlp3TcpnAi9tGdekK8rmvLTdnuq8NCqUQyLMoQjutZ8Ps8mjLvBehF1hBmsJMjiojJ7IX+C5CK4XO1ZzWIu8VxWyQLVoYJfWV3P4n9Iwh2RBw32+9p9AtXuF0+6BeoL/9O+fyPOUyIn3TNhO6TfxQjwUt0Qqciycncviimbpp2VVZ1VnVecw6Dw02XBIBe9qLuaQ5md5iuKTGBbL4qvIiFnxRkyIZ2KKUdskXeI6zUsUHh79BRPWixMAeNrtVclu2zAQvfcrBjoUCWAttlMnbmXlEMBIc7WLokeaHFlMxaUkZUV/35FaNW7TxPmAnETN+t7MA5lfP6gaDui8NHoVTZMsAtTcCKn3q+jLdh1fRdfFu1xhYIIF9ndokTda/mhQCpCCTIvl/HIRX84Wy6t4lk0vsvl8Gs9n2XIRT+fZxexDBGmRH1AL40Azhavo1mBdooP3TNlPsHboML4zGn0EjatXURWC/ZimbdsmobNm75ituoQbNZSqJUft8dXdXy6ZtrgrjQ6xN2VomcOo2FbSw/gLdA4VgnXGogsdmBIIf1n/Dz+c3Q629d15At9MA4p1oE0Abmw3AUUjLukrpA9O7pqAE6ChCNPq2jBBfY4aDy6pfWB1DTJAY40GpjuqpSyluiGgMj703tIZNXhrw1mgZQ39HTi5rwIEAw1NLPxLzDe7e+SDv+e4Rad8T3CD7kBTBrZ3iAo1RVQsAD4QcA87DC2iho4IMi1g5JzA55LYUlVeHaX+ypoM4eM8nqIpiUyP3zbOGo8JrMmgTI9Tk08NpCZga2SUe5CeSL9+qcOsOFkYsR3xAlF6mgunNZWnvzVY5AI9d9L24N5086abU7o5lkveL3eYc3EznuDs5hymy+ViAlQhe14xyfMk8vSxcB4cE6iY+158rWTQ2MGG04D1hmyhXyWDPyEvSnQCbSVpP/0mdggO97Qd8tIroIGTwhl97xsnvZC85+eTPH3sPt7aePoJoCs+HZ+e4icgB0vq); font-weight:400; font-style:italic; } @font-face{ font-family: "Whitney SSm B"; src: url(data:application/x-font-woff;base64,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); font-weight:400; font-style:italic; } @font-face{ font-family: "Whitney SSm A"; src: url(data:application/x-font-woff;base64,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); font-weight:600; font-style:normal; } @font-face{ font-family: "Whitney SSm B"; src: url(data:application/x-font-woff;base64,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); font-weight:600; font-style:normal; } @font-face{ font-family: "Whitney SSm A"; src: url(data:application/x-font-woff;base64,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); font-weight:600; font-style:italic; } @font-face{ font-family: "Whitney SSm B"; src: url(data:application/x-font-woff;base64,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); font-weight:600; font-style:italic; } @font-face{ font-family: "Mercury SSm A"; src: url(data:application/x-font-woff;base64,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); font-weight:400; font-style:normal; } @font-face{ font-family: "Mercury SSm B"; src: url(data:application/x-font-woff;base64,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); font-weight:400; font-style:normal; } @font-face{ font-family: "Mercury SSm A"; src: url(data:application/x-font-woff;base64,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); font-weight:400; font-style:italic; } @font-face{ font-family: "Mercury SSm B"; src: url(data:application/x-font-woff;base64,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); font-weight:400; font-style:italic; } @font-face{ font-family: "Mercury SSm A"; src: url(data:application/x-font-woff;base64,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); font-weight:700; font-style:normal; } @font-face{ font-family: "Mercury SSm B"; src: url(data:application/x-font-woff;base64,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); font-weight:700; font-style:normal; } @font-face{ font-family: "Mercury SSm SC A"; src: url(data:application/x-font-woff;base64,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); font-weight:400; font-style:normal; } @font-face{ font-family: "Mercury SSm SC B"; src: url(data:application/x-font-woff;base64,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); font-weight:400; font-style:normal; } @font-face{ font-family: "Mercury SSm SC A"; src: url(data:application/x-font-woff;base64,d09GRk9UVE8AABZdAA0AAAAAIUwAAQAAAAAUNAAAAikAAAaNAAAAAAAAAABDRkYgAAAIAAAACZcAAAsrJuhIB0dERUYAABGYAAAAHQAAACAARgAER1BPUwAAEbgAAAGxAAAESKF0j7JHU1VCAAATbAAAAFoAAACA6Xss/k9TLzIAAAGMAAAAUQAAAGCWr0atY21hcAAABmgAAAGDAAADUj7IQ4BnYXNwAAATyAAAAAgAAAAIAAAAC2hlYWQAAAEwAAAANAAAADYBTxoCaGhlYQAAAWQAAAAfAAAAJAczArhobXR4AAAT0AAAAGMAAABkPqADGm1heHAAAAGEAAAABgAAAAYAGVAAbmFtZQAAAeAAAASIAAALuPdUp5Zwb3N0AAAH7AAAABMAAAAg/7gAMnjaY2BkYGBgZHCUvRRaGM9v85WBm/kFUIThfHy2E4z+/+O/BXMFswJQHQcDE0gUAFTxDBt42mNgZGBgPvCfA0jO///j/3fmCgagCAqQBACoMQbwAAAAUAAAGQAAeNpjYGJqZZzAwMrAwrSHqYuBgaEHQjPeZTBi+MWABBYyMNQHMDhEw/geas75DAoM5gyRzAr/LRguMB9g+AEUng2SYzzAVAuUU2BgAgABHRArAAAAeNq1VE1v20YQHVlybCdxkPho9LBoDSMJKNmSHDvKqYALwwGaS2wYyKXAilyKdEQusVxaEZBDj0XRQ6899C/02FN/R/9ML307XNdUnDgu0IoQ9+3sfLw3OyARbbV+pxbVv6/xr3GLvsKuxku0QqHHbfqSzj3uNHyWaZ1+8vgOTn7xeIW+o189XoXPXx6vNfDdpY3Wqsf3aKO96fH9Bl5v+Dygp+3A44cNDo8aeINxm1qdNey+b5953KKj9p8eL9GDzhcet+mbzlOPOw2fZdrs5B7fodXODx6v0B+dnz1epc3lbz1ea+C7na3l2ON7tLX2o8f3G3i94fOATtd+8/hhg8OjBt5w+FAXc5NOEiseHz4R/dFoPxCD3X5fHGsVT5UR2+JQ90RibfFiZ2c2m/XsvNATI4tk3gt1thh/vH2oxXux6PJaTaqpNP390fBgv3sw2B8976LE3u5w2O/uDQfPdrvYDPqjM2XKVOei38Pxkc7tK2XCyszFyUkm0lJIYY2MVCbNW6HjRYaBmCVpmIhMzsVYCaMmaWmVUZFIcxEqYyXW88qkZZSGFlXK3kL8aYICpY7tTBrlitlEicLoAqHza9XEG11xqVxbEaIFgch0lMZYI9Q16biyKhDaiEjP8qmWEfI1CvBRmpdWTqcitaIqIFvmc+TKCoQadkh0ad1pbHTGp1MdSsed6xtR991qUZVqMb8TUFbjcxXyudNyqkxWOiEnylykoRJyYpTKVA6PRFqh3oF4id7ZmVK5mEOgzKMPZL+MoRiZ0eir8Doy4JDLnlxnFEOQ01BUptCl6okjGDLtuOY4y1hYIIqpkoi9SEsI/+TU7czUOMaAdBcaGsIioXiRM7RdTyA+P43Xg25Phw5JU0FzMpTShBKyJOgxrE+w9mmEZ58C4AHtYt8HOkaEopimeBvst/F3WXpYXbxFvhe0g2fGTw+WOWwa+Q1JoAT7Hr6umrIb6x8jtzsX9B7/m7K8BpcJVeAkcdoH5xEN6QBrF+8B758D1yr28B7i6cOyh3VAz2Dp+pMB6z5jdSVYacq5Fz0ffcQWS6/YI0RVAyaCTvBkWFNECfBwjB3TCH4Z83oLm0bnbuqh6/UM2lJkToBdpMs+hqeAr9PpKliOVMjuKjqGIVss/Ov9OTNzvhFns15LiSqfrn/KtZ2CkrlasJFc6VKZhYfbFbC6u6urzm+hTdAbrFVDVY69Ze71FAR8pplx7PeR1+u0jBHtlAdczfCpBsMc1TT3uub3cQVXUSn3wfVqisftHYuK5yvn28uZXz1dha9qGhkSrCVH1bExdyNrxDpGIXaXfb/Sb/gmr+bd8oxXyKdu5C/+sVfoxDksYSP+8l5OmWnGnvWNnLDlgqdAMcMJ53NzqXiW62jJSNE73/HSz51joNhTQFl9g05l9JnbfsnVc2bnONcT/bHqzZpBo8qHc3KbHsX+hi7voeCOF3xfinkdeY+MV+XnoY7LGjcWcLRTJn3dC65a3/i//9btcB/HXMnp7t4woaH3kf6Ob+pzfW+3YSD+k2/jbSr9D935GyL0aIp42o2S3ysEURTHv2eNHbtj14xfkx9tSlFeUKL1IJLyILW1iReF9lUpbevdk79BiJJH+QMQyYv8eJGUovx6E0oie5y9MzFtu9t+P83ce+658z33ngZACZynESRv+EYkIhVrvg4ZR9GPUoTRhC70YBAxxDGGCcxgDvNIYgFHOMMlrnCDB7zgA5/4IZ1C1EDN1Ert1Ek9NEwxSlCKvokj78zi6/gNYEj5jWMKCeWXwj6OcaH8bvGE14wfmIJUSRFqoTbx66YojdA0JemL0pE3Zr7jUz7hQz7gfd7jXd7gdV7jVV6BEke5153VcT08Sl8jW4T86kKfdCSjOCYxq2bzWMQSlrGJLYm2sYNzXMvZ7/GIZ1nRPPihuxguJqw/it9pZ+39R89BwENQMDyEhHAOTA+Wh2oXW5Gp7pzHlsb5CzcvX3N9zh/oSCuVO5QFgkZ5KFxhWpVVkGI1qLWLy2uaXzelk0p+XWSITCujHKWtArGmeSLb9mZ0zfG1LPWF8Z/6BZZfXXgAeNpjYGYAg/9bGYwYsAAALMIB6gB42m1TC3QTVRpOaG9yLd3oKoPrg6QF5eBCweKCQuVdpSAKikBRnoWWtkDT7YM0faVtJpOZ/J2ZZJI2paH0hUALhRYri6soulCQh+vyEh/sLj4XdT27ntU75cY9e1Nxdc/ZMyeZuff+9/u///u/32iIjzcYjUb0uL2gJPYxTr/NoN9r1EcN00fF6SPiVybGuemqG4mD/YiMuTU4ymBI6LmdzPqlIc5oxBmLcjfYi7eUbppnL3QW5W3KLUkaN++BpNRp06ZOSJr8YGpqUoY9O2dLdlHS2KR59olJuSUlhdMnTXI4HBNLnIX2TUXrC3OdEzfYtw5lj6U3GA0GzmD4lcEwd5jh8UTDMoNhhcGw0mj0Ggx3DWOnMw1zDE5Dm+ED4zyjZvz7sBnDIsM+jkNxc+LUuKPxlvjF8Y74M+getALx6Lxp+C1n6T10Vbwu3qiMiqbzKzlyA+j86N2IropmcDDIk9nRRETK9EQOvufpbD0R2RdzhEXQG4As0VEWTf+cZHDXk/QUM31AoxeiaxszyZsA4yheB9k6B9BHTYfha0QnXOfoaiALSdtOdvUR/SG9i6NTaQ/7tZMJQI4OpjrboneA/aX82gLq2ld36gKy7CY62czRiXCeZDcBGk3bOJIJ3SkL7ZBHTjDwhXvofN1DxwFdEq2atQmySRlAz+P7kKVD/zcZz8G1Of00rgE3m79pGXgRzuPzS47RMVb6XbbpSjFE02cWM5YYELntz8ev2+hjKjc/L3+OtQrK5FoZA8na50MXxZfzYR6m48lUjizqNZ+VeovhCViRvXG+hC2t+hdkHbfSn0IfRNVeh+gEPG3qO2QWmXLq3HnbCXg57yS9Cw/IVaQsGwrz0ObI0uYVgOkKOoJa6AK6nNgmkmds5+HdyPF2bPHpb+nHuGjHz/kdglayLNefPhkVbckpy/Lh+yUgKzoBHYHO0pZ1OFjeD0AKs4CvQM61RdvWAC4mz5quSOhNaa9jTw4+/UhPAFlK9Q/JN5yLZEW7ALL/C0+uMR2ndQJJb/8J0RlDLGKIlahsVbGDIZaS9aarEjrm2+fYuw6fSUWWI/o1EuWqyZY18NvNKGfHsvAyVtd0ej/FdCmdQW6hJpJmOwanOw524Utr+2KIr3bCfnoYYONfHUDHIpdQLlYDnpv6GllKJp/6wznbG/ByzjmaiC3EppeRixzTJ910up3Z6O3/Ic1WfYvagWSS5QA0c1EpYnt95pmdoKdf6bwZfroUWehzZOAtju2+H9tltWZ/EANJ+7FyZJmiLyNlHJCdl2IRH7GIT4uBXkbwcH7Ws7X13+T9bhHg5zbmZM59Z923tk/gZMeRg6++2PkGfIEt1/RV5EuOjCR3f9XPLncC5JzdSO+gjy5m1T51ug16f+KNhoifBeh9ihF/5iiQRJqZWQwFZIDxyNiNLHn6GVLK5auPpaI1S7Y6MiX8vAT6wvdivK7+vHxdZTNEjgweH6rsQux8AAonpNMGF6SRkP1LeoWFX2bh02fnQTYiFX2m2T2gj4wAeSi6hliAybu2GSCavDRG6uiQEN+R4Ze5R3PYWohZohfIpTAjSl85l0TSAPSK93tZIg9DRldzgB6tBTqX7Hn6K9rKGnpxK7IMjif7OJIymSTTLTRnLE2mKXTSJzSZ2MmGf5BkMslKF49MSrAo+r/02zmCU07Q+6z0Lz94/bGZJSzzdZY5tQPIGNQmdUvdgEny9QFyq40uELmH129It0qwDXz1mIjmetgjyfC291AeTMf/L7cV6L1/pL8gj9hxx2q0c9P2sohr97Ze9xWGmgShPrQklN+4tbU44thZ0kNGH3yHmIFw+AeO3YOJ5AOugjijp8BJnQf4U5+i/lOtu3pl3FIP0QVDBmJm6Utjlluww4f6xNaS/ifxSTYZh/V/6pu5q79nakGsD6tpAv2KjtSNF3fd9OClArI6ypMRrI29egL5mnuITDi+i83Ge+zwTCmZQWvpg3TpjK0sCQ+w/5kDX5Pxf6NT0NNFkE/eZ2mfaGfie8l48uSVLgbKgvKP5yLLIf1jvZy7sI9tbWNbp/KS6Uo6jKw+03UT/N1N5DfMp/SBtGI2Mh/1mRl/MhdZBsgLLVxygraDG52w5DA3JqF5DvsT4u9LIJ/4b35Fp13murTaiGryA2sCj7UO3uTjwScA9raETRrIklyDg62ZvJbFm/7k5u5L0JfROVz0s8F+/TMTHfv901wzBEP127Hb5KsTeDfgWo/WHAkEgrYgKF7VhYPt7MiDvKqg8ICrql3O8saaFhu9/UPOI/mDmhwI+GXB7ZYEwTY+jevQhF3biwS+Q/O8bqqVkFTvrRcZap2n2ubjea3IY/6c517Q3BGT7FdUGbDP7FUkRVUU1S8qglUAryi6cYOTD7DYinNcANQgUgRV1ACH1XAo7AnW2TwgiJIH72ZR5ldWcuyKV1C9mi0E/oDagJu6mSJaOQDvB7ejrjXAVkVDKwQQLlFrfQK7AYri01hRNIV8y0FJc1VHaeMOLQI7cIerubyixlVufZN+x2lQryJGkRGIwYMGkWIPBEGWZQVUUETFi7Umj0kSkKR4ZQHqQPCAByo6WXKQJEkEAVhQAPOmLHInUzysNIbsB+xdzh01NUIVVMKW9pIuwE2/5uqYRA6zWxWC1iCoqhzCgox8AgMBLPpkxdbapFU3mslospALVUZqWwDvae/o7i5ts9uKoKyqolja7Wgs9AUalEZowgfyDz2ZsX79OisUNDjbSpc7C7bAelj+6oaT8BL0bN/TvT+vvaYLDsOBg/IJzMuottzl2gYOKA8X7W1ujTQ1hzDNppVcu+ZtNgUUlVESvVanl2/XPDvNQTFQZ+XB6xV53FA+1DDieJ5jPfExeSXJq4qq4NdYcyGAA0KgrpbneSsIsqh6eckjMHncAU8YAuCXGbSg+PxMV8Uva1ioRz6vzycBe2SJmYM9AezXTLmFnMerBmygyoos+wWWwCNKIovE9J6DXIPCtut9YAV2OWYsm1BlJneqHAtmdhNFK3glUWTUJAUUTBF5nYtUhCubKnfu93eWdNTVVtWUVeM36JUfp48W53J7NXdLu9PNs3d/UCsw8cGK0gj74INZbrOeGRgyoFcR1ZiNVdZrm2XwuRGDt3LBOwzIaLxzxsJVBXTK82kZc5edIE+QjFcG3n73tVn0Yevw+iZPqApwTV2dyxV0N9kamcPkIHMKc6jE5pgXlZBtuF/2um1VphBDtw4XRDXcyKbFr3hrXMz3tuHhUCgcrgu6XHVuV3XIHbYN/w9uLomCAHjaY2BkYGDgA2IJBhBgYmAEQgkgZgHzGAAFUgBLAAAAeNqVU01Lw0AQfUm//KhFTFs9iL/Ak/gDPIgHKZ568ibiSSlFPfvfBI/ixYNCFaGHFkop5pBACDK+nWQ1bVPEDDPZvJ2d2XmTgQNgBfs4gXt41GqjdnV228E2isQhApcvZ+bLPe/edFG7vLjuoK6IoxbcL2NdvVxs4C7BC298n2qMCrawg13s4QDHaJtY8oQCPPlCQ3w0qQ6q0idWlR6xiNiE0RoSctXnyuCexPTzZEhboW8JVebz0EATbqFlcrmfhR1s8jb/fmQgY3mVZ/HlIUW+eD+oRtRYVz61b75Tn3Aqhk/pU4IFOSIVP8mn9iPXL87Bwpnzoz8rGpIpa/X2Fs/1NpU/yyNX9ykfgZWEhYzvovpCrX+gfOVXphzm1WcZ1MxR3g5rCGXM1dhGmubM9Eslw49l6TejVhSbLv52IelwhmfdZ8TYnpyvWN5lROml/ATz/bP8p7eLsjXSvsiE8mhstpvKQGD/FmvnWDTTWTeTxM8iJ6GsGxUsYVlne5WzscY52KBX48cb6g/ODvScfUrUMk+u8kyNPkWNaeItm9kjVmKsTUZ3VJPpd74Bv2cXmgAAAHjaY2BkYGDgYjBgsGNgcnHzCWHgy0ksyWOQYmABijP8/88AkkdmMxYXGxgycIBYQMzEwMbAB8QgngBEnkEDiDmAmA+IGRkkgJgFSjNAMSMD2/+XEFkAhnkLhwAAAAEAAf//AAp42mP8wsDA8ImBgamJQYRJg8GQadr/H0yTGNSZ+oHsKiCdCsQrGAyZ2RjUGbcymDCpMrAzXQSKRTKoM89n0GB6BsTHGPSZ6oBiIHoWgxLTMqCaBQyCTIsYRJm2MRgBABANE+kAeNrtVU1z0zAQvfMrdnxgYMYfcVLSBhz3kJkMMNNTyoGjYq9jFeuDlRzX/561IW0goe0P6EmyVnq77+2bdXZ9rxrYIzlp9DJI40kAqAtTSr1bBt9u19FVcJ2/yRR6UQov/r6aZ62WP1uUJciSj+aL2eU8upzOF1fRdJJeTGazNLqYTT9MIv6YposAkjzboy4NgRYKl8Fng02FBG+Fsp9gTUgYfTUaXQAtNcug9t5+TJKu62LfW7MjYes+LowaoRpZoHb44uxPQyYdbiujfeRM5TtBGOS3tXRw+ATe+xrBkrFIvgdTAddfNQ/1r0wM300LSvSgjYfC2D4ExXJWvJbSeZLb1mMILEBpOt0YUTLmUZIxJLXzomlAemit0SB0z1jK8lMaL9TG+SFakVFjtDGF8NyYMT8ByV3twRtoWR3/LwnXbu+wGOMDn1sk5QYyG6Q9KwpiR4gKNd+ohQe858IdbNF3iBp6Jih0eYb6l4pZM3pRH0H8fh2Ozw66nFZVMamBh23JGocxrPlAmaFezTE1kgvBNij47V46Jv/yRo6aFXwimPVp3czxFASeN1SW/DFgnpXoCpJ2qPLVNK+medI0x17Jhm6Pwuerww7erd5DuljMQ2CE9Ezu/5LIkke8zJMoUQn6kd8gFS31sNmooZUCHkJn7RhCV0vux6D8FoFwx93gycxjXkPBLha83rUkXSmLgYaLs+Qx22Es4/Mznmd4cvi35L8AuUBBBA==); font-weight:700; font-style:normal; } @font-face{ font-family: "Mercury SSm SC B"; src: url(data:application/x-font-woff;base64,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); font-weight:700; font-style:normal; } @font-face{ font-family: "Whitney SSm SC A"; src: url(data:application/x-font-woff;base64,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); font-weight:400; font-style:normal; } @font-face{ font-family: "Whitney SSm SC B"; src: url(data:application/x-font-woff;base64,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); font-weight:400; font-style:normal; } @font-face{ font-family: "Whitney SSm SC A"; src: url(data:application/x-font-woff;base64,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); font-weight:600; font-style:normal; } @font-face{ font-family: "Whitney SSm SC B"; src: url(data:application/x-font-woff;base64,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); font-weight:600; font-style:normal; } \ No newline at end of file diff --git a/halloffame.html b/halloffame.html index dbb099d..d73f2db 100644 --- a/halloffame.html +++ b/halloffame.html @@ -1,563 +1,563 @@ ---- -layout: default -title: Hall of Fame ---- - - - - -
-

IPL Season 3 Open Division

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
RankIDRating
1 jpbloom2 2249
2 clhuang2 1799
3 acao6 1592
4 hongyuw2 1583
5 lostandfoundii 1459
6 lethien_96 1283
7 black_box 1194
8 sxie12 1189
9 govindv 896
10 johnlq2 859
-
- -
- -
-

IPL Season 3 Freshman Division

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
RankIDRating
1 kuilin 1791
2 Scott0129 1495
3 bmw4 1219
4 howards2 1119
5 tlietz2 541
6 annieq2 469
7 pingche2 404
8 herrell3 272
9 df100 252
10 kjew2 204
- -
- -
-

IPL Season 2 Open Division

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
RankIDRating
1 zexuan2 2719
2 sxie12 2469
3 zihanw2 2323
4 jpbloom2 2194
5 Kailang 2098
6 black_box 2006
7 takeshisuzuki 1917
8 ankiths2 1490
9 lostandfoundii 1331
10 cherian2106 1315
-
- -
- -
-

IPL Season 2 Freshman Division

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
RankIDRating
1 bts2 2479
2 ASankaran 2391
3 bmw4 2243
4 joan2 1984
5 kaempen2 1961
6 howards2 1871
7 kuilin 1795
8 shreyc2 1731
9 df100 1609
10 ssethia2 1386
-
- -
- -
-

IPL Season 1 Top Contestants

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
RankIDRating
1 landao2 3354
2 tana 3203
3 liujch1998 3177
4 sxie12 2968
5 zihanw2 2841
6 jrday2 2681
7 justinyang 2596
8 acao6 2534
9 deb2 2386
10 tim_sanchir 2299
11 dooollydd 2280
12 pangyuchen 2279
13 davidb2 2277
14 Kailang 2186
15 nick_leung 2106
16 ygong10 2088
17 siratan2 2010
18 pche3 1986
19 wichula2 1961
20 jsolori2 1904
-
- -
- - -
-

ICPC World Finals 2019

-
- - -

Team name: VIM - Help poor children!

-

Alan Mattox Beckman Jr, Coach

-

Zhengkai Wu, Co-coach

-

Zexuan Zhong, Contestant

-

Lan Dao, Contestant

-

Jiacheng Liu, Contestant

-
- -
-
- -
-

ICPC World Finals 2018

-
- - -

Team name: Unicorn

-

Jingbo Shang, Coach

-

Alan Mattox Beckman Jr, Co-coach

-

Uttam Thakore, Co-coach

-

Xiyao Shi, Contestant

-

Shunping Xie, Contestant

-

Tianwei Xu, Contestant

-
- -
-
- -
-

ICPC World Finals 2017

-
- - -

Team name: Time Limit Exceeded

-

Uttam Thakore, Coach

-

Mattox Beckman, Co-coach

-

Jingbo Shang, Co-coach

-

Yewen Fan, Contestant

-

Tong Li, Contestant

-

Yuting Zhang, Contestant

-
- -
-
- -
-

ICPC World Finals 2016

-
- - - -

Team name: Poor Man's Shield

-

Uttam Thakore, Coach

-

Lan Dao, Contestant

-

Xin Gao, Contestant

-

Siwakorn Srisakaokul, Contestant

-
- -
-
- -
-

ICPC World Finals 2015

-
- - - -

Team name: Quadrature Rules

-

Uttam Thakore, Coach

-

Joon Young Seo, Contestant

-

Ruihan Shan, Contestant

-

Timothy Smith, Contestant

-
-
-
- -
-

ICPC World Finals 2013

-
- -

Team name: PLATO

-

Marsha Woodbury, Coach

-

Joon Young Seo, Contestant

-

Rohan Sharma, Contestant

-

Yerzhan Suleimenov, Contestant

-
-
-
- -
-

ICPC World Finals 2012

-
- -

Team name: ILLIAC

-

Marsha Woodbury, Coach

-

Krishan Chockalingam, Contestant

-

Hassan Eslami, Contestant

-

Justin Kopinsky, Contestant

-
-
-
- -
-

ICPC World Finals 2011

-
-

Team name: Bardeen

-

Marsha Woodbury, Coach

-

Pichayoot Ouppaphan, Co-coach

-

Arindam Saha , Contestant

-

Sukolsak Sakshuwong, Contestant

-

Rohan Sharma, Contestan

-
-
-
- -
-

ICPC World Finals 2010

-
-

Team name: UIUC Bardeen

-

Marsha Woodbury, Coach

-

Qieyun Dai, Contestant

-

Justin Kopinsky, Contestant

-

Chi Wang, Contestant

-
-
-
- -
-

ICPC World Finals 2009

-
-

Team name: UIUC

-

Marsha Woodbury, Coach

-

Pichayoot Ouppaphan, Contestant

-

Yintao Yu, Contestant

-

Mianwei Zhou, Contestant

-
-
-
- -
-

ICPC World Finals 2008

-
-

Team name: UIUC

-

Marsha Woodbury, Coach

-

Jacob Lee, Contestant

-

Pichayoot Ouppaphan, Contestant

-

Arindam Saha, Contestant

-
-
-
- -
-

ICPC World Finals 2007

-
-

Team name: UIUC-A

-

Marsha Woodbury, Coach

-

Jesse Beder, Contestant

-

Jacob Lee, Contestant

-

Jonathan Ray, Contestant

-
+--- +layout: default +title: Hall of Fame +--- + + + + +
+

IPL Season 3 Open Division

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RankIDRating
1 jpbloom2 2249
2 clhuang2 1799
3 acao6 1592
4 hongyuw2 1583
5 lostandfoundii 1459
6 lethien_96 1283
7 black_box 1194
8 sxie12 1189
9 govindv 896
10 johnlq2 859
+
+ +
+ +
+

IPL Season 3 Freshman Division

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RankIDRating
1 kuilin 1791
2 Scott0129 1495
3 bmw4 1219
4 howards2 1119
5 tlietz2 541
6 annieq2 469
7 pingche2 404
8 herrell3 272
9 df100 252
10 kjew2 204
+ +
+ +
+

IPL Season 2 Open Division

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RankIDRating
1 zexuan2 2719
2 sxie12 2469
3 zihanw2 2323
4 jpbloom2 2194
5 Kailang 2098
6 black_box 2006
7 takeshisuzuki 1917
8 ankiths2 1490
9 lostandfoundii 1331
10 cherian2106 1315
+
+ +
+ +
+

IPL Season 2 Freshman Division

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RankIDRating
1 bts2 2479
2 ASankaran 2391
3 bmw4 2243
4 joan2 1984
5 kaempen2 1961
6 howards2 1871
7 kuilin 1795
8 shreyc2 1731
9 df100 1609
10 ssethia2 1386
+
+ +
+ +
+

IPL Season 1 Top Contestants

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RankIDRating
1 landao2 3354
2 tana 3203
3 liujch1998 3177
4 sxie12 2968
5 zihanw2 2841
6 jrday2 2681
7 justinyang 2596
8 acao6 2534
9 deb2 2386
10 tim_sanchir 2299
11 dooollydd 2280
12 pangyuchen 2279
13 davidb2 2277
14 Kailang 2186
15 nick_leung 2106
16 ygong10 2088
17 siratan2 2010
18 pche3 1986
19 wichula2 1961
20 jsolori2 1904
+
+ +
+ + +
+

ICPC World Finals 2019

+
+ + +

Team name: VIM - Help poor children!

+

Alan Mattox Beckman Jr, Coach

+

Zhengkai Wu, Co-coach

+

Zexuan Zhong, Contestant

+

Lan Dao, Contestant

+

Jiacheng Liu, Contestant

+
+ +
+
+ +
+

ICPC World Finals 2018

+
+ + +

Team name: Unicorn

+

Jingbo Shang, Coach

+

Alan Mattox Beckman Jr, Co-coach

+

Uttam Thakore, Co-coach

+

Xiyao Shi, Contestant

+

Shunping Xie, Contestant

+

Tianwei Xu, Contestant

+
+ +
+
+ +
+

ICPC World Finals 2017

+
+ + +

Team name: Time Limit Exceeded

+

Uttam Thakore, Coach

+

Mattox Beckman, Co-coach

+

Jingbo Shang, Co-coach

+

Yewen Fan, Contestant

+

Tong Li, Contestant

+

Yuting Zhang, Contestant

+
+ +
+
+ +
+

ICPC World Finals 2016

+
+ + + +

Team name: Poor Man's Shield

+

Uttam Thakore, Coach

+

Lan Dao, Contestant

+

Xin Gao, Contestant

+

Siwakorn Srisakaokul, Contestant

+
+ +
+
+ +
+

ICPC World Finals 2015

+
+ + + +

Team name: Quadrature Rules

+

Uttam Thakore, Coach

+

Joon Young Seo, Contestant

+

Ruihan Shan, Contestant

+

Timothy Smith, Contestant

+
+
+
+ +
+

ICPC World Finals 2013

+
+ +

Team name: PLATO

+

Marsha Woodbury, Coach

+

Joon Young Seo, Contestant

+

Rohan Sharma, Contestant

+

Yerzhan Suleimenov, Contestant

+
+
+
+ +
+

ICPC World Finals 2012

+
+ +

Team name: ILLIAC

+

Marsha Woodbury, Coach

+

Krishan Chockalingam, Contestant

+

Hassan Eslami, Contestant

+

Justin Kopinsky, Contestant

+
+
+
+ +
+

ICPC World Finals 2011

+
+

Team name: Bardeen

+

Marsha Woodbury, Coach

+

Pichayoot Ouppaphan, Co-coach

+

Arindam Saha , Contestant

+

Sukolsak Sakshuwong, Contestant

+

Rohan Sharma, Contestan

+
+
+
+ +
+

ICPC World Finals 2010

+
+

Team name: UIUC Bardeen

+

Marsha Woodbury, Coach

+

Qieyun Dai, Contestant

+

Justin Kopinsky, Contestant

+

Chi Wang, Contestant

+
+
+
+ +
+

ICPC World Finals 2009

+
+

Team name: UIUC

+

Marsha Woodbury, Coach

+

Pichayoot Ouppaphan, Contestant

+

Yintao Yu, Contestant

+

Mianwei Zhou, Contestant

+
+
+
+ +
+

ICPC World Finals 2008

+
+

Team name: UIUC

+

Marsha Woodbury, Coach

+

Jacob Lee, Contestant

+

Pichayoot Ouppaphan, Contestant

+

Arindam Saha, Contestant

+
+
+
+ +
+

ICPC World Finals 2007

+
+

Team name: UIUC-A

+

Marsha Woodbury, Coach

+

Jesse Beder, Contestant

+

Jacob Lee, Contestant

+

Jonathan Ray, Contestant

+
diff --git a/home.html b/home.html index dcb32b2..e1fd6e2 100644 --- a/home.html +++ b/home.html @@ -1,128 +1,128 @@ ---- -layout: default -title: UIUC's ICPC Team Homepage ---- -{% assign now = site.time | date: "%j" %} - - - - -{% if site.data.message['show'] %} -
-
-

{{ site.data.message['message'] }}

-
-
-
-
-{% endif %} - -{% assign week = today - 7 %} -{% if site.categories["announcements"] | size > 0 %} -
-
-

Hey! Here are the past week's announcements, latest first: -

-
-
- -
-
-{% endif %} - -{% if site.categories["practices"] | size > 0 %} - {% for practice in site.categories["practices"] limit:1 %} - -
-
-

Review the latest practice from - {{ practice.date | date: "%b %-d, %Y" }}.

-
-
-
-

{{ practice.title }}

-
- {% if practice.description %} - {{ practice.description }} - {% else %} - {{ practice.content | strip_html | truncatewords:30 }} - {% endif %} -
-
-
-
- {% endfor %} -{% endif %} - - - - +--- +layout: default +title: UIUC's ICPC Team Homepage +--- +{% assign now = site.time | date: "%j" %} + + + + +{% if site.data.message['show'] %} +
+
+

{{ site.data.message['message'] }}

+
+
+
+
+{% endif %} + +{% assign week = today - 7 %} +{% if site.categories["announcements"] | size > 0 %} +
+
+

Hey! Here are the past week's announcements, latest first: +

+
+
+ +
+
+{% endif %} + +{% if site.categories["practices"] | size > 0 %} + {% for practice in site.categories["practices"] limit:1 %} + +
+
+

Review the latest practice from + {{ practice.date | date: "%b %-d, %Y" }}.

+
+
+
+

{{ practice.title }}

+
+ {% if practice.description %} + {{ practice.description }} + {% else %} + {{ practice.content | strip_html | truncatewords:30 }} + {% endif %} +
+
+
+
+ {% endfor %} +{% endif %} + + + + diff --git a/index.html b/index.html index 9cf9339..b2437c3 100644 --- a/index.html +++ b/index.html @@ -1,2 +1,2 @@ - - + + diff --git a/ipl.html b/ipl.html index ff91c7e..2add272 100644 --- a/ipl.html +++ b/ipl.html @@ -1,136 +1,130 @@ ---- -layout: default -title: Illinois Programming League ---- - -
-

Illinois Programming League

-
- -
-
-
- -
-

Announcements

-
  • Every day, we release a Problem Of The Day, as well as solutions and explanations! You can find them on our CodeForces blog
    -
  • - -
    -

    Contest Problemsets, Editorials and Solutions

    - All of our contests/problems can be found here! -
    -
    - -
    -
    - If you have any questions, ping us on our Slack channel, #ICPC -
    - -
    -

    Quick Start:

    - 1. Sign up for CodeForces and join our group here: - CodeForces Group
    - 2. Sign up for our RSO so we know who you are! IPL Signup Form
    - 3. Join the ACM slack and find our channel #ICPC
    - 4. Beginner's Cheatsheet
    -
    - - - -
    -

    What?

    - Illinois Programming League (IPL) is a series of algorithmic programming contests organized by ACM SIG-ICPC at UIUC. Contestants try to solve problems that are likely to be asked in technical interviews. Come in practice and sharpen your programming skills! -
    - -
    -

    When?

    - Every Wednesday, 7-9 PM
    - Starting from September 4th!
    -
    - -
    -

    Where?

    - Siebel 1214
    -
    - -
    -

    Food

    - Free pizza will be provided for IPL contestants! (starting 6:45 PM)
    -
    - -
    -

    Eligibility

    - Anyone is allowed to participate in our weekly meetings.

    - You are eligible to represent UIUC at the Regionals/World Finals if you are: -
      -
    • Enrolled in University of Illinois at Urbana-Champaign, and
    • -
    • Started college in 2014 or later OR born in 1995 or later.
    • -

    -
    - -
    -

    Rules

    - You must physically present in the room to compete. No remote participation allowed.

    - However, you will be allowed to access the questions after the contest has ended, for your own practice.

    - Students compete individually and communication during the contest is not allowed except for special 'open' contests.

    - During the contest, Internet usage (e.g. Google, Stack Overflow, etc.) is forbidden, with the following exceptions: - - Any physical reference materials (e.g. notes, textbooks, printed code, etc.) are allowed. Any electronic and digital reference materials are forbidden, with exception of websites listed above.

    - If you violate these contest rules, you will be disqualified from the leaderboard.
    -
    - -
    -

    Rating

    - In each contest,
    -
      -
    • Each problem is worth the same.
    • -
    • Contestants are ranked by the number of problems solved. Ties are broken by time penalty.
    • -
    • Time penalty = sum of {[Time of acceptance since start of contest] + 20mins * [number of rejected submissions before acceptance]} for each accepted problem
    • -
    • Baseline: work on easier problems first, solve quickly and accurately.
    • -

    - After each contest, your rating will be adjusted based on your projected rank and actual rank.
    -
    - -
    -

    Languages allowed

    -
      -
    • C++ 11
    • -
    • Java 8
    • -
    • Python 3
    • -
    -
    - -
    -

    Questions?

    - Please feel free to reach out to us at icpc@cs.illinois.edu -
    - -
    -

    Sponsors

    - Caterpillar -
    +--- +layout: default +title: Illinois Programming League +--- + +
    +

    Illinois Programming League

    +
    + +
    +
    +
    + +
    +

    Sponsored By Caterpillar

    +
    + +
    +

    Announcements

    +
  • You can find our weekly contest problems and solutions on the blog: CodeForces blog
    +
  • + +
    +

    ICPC Slack

    +
    + If you have any questions, ping us on our Slack channel, #ICPC +
    + +
    +

    Quick Start:

    + 1. Sign up for CodeForces and join our group here: + CodeForces Group
    + 2. Sign up for our RSO so we know who you are! IPL Signup Form
    + 3. Join the ACM slack and find our channel #ICPC
    + 4. Beginner's Cheatsheet
    +
    + + + +
    +

    What?

    + Illinois Programming League (IPL) is a series of algorithmic programming contests organized by ACM SIG-ICPC at UIUC. Contestants try to solve problems that are likely to be asked in technical interviews. Come in practice and sharpen your programming skills! +
    + +
    +

    When?

    + Every Tuesday, 7-9 PM
    +
    + +
    +

    Where?

    + Siebel 1109
    +
    + +
    +

    Food

    + Free pizza will be provided for IPL contestants! (starting 6:45 PM)
    +
    + +
    +

    Eligibility

    + Anyone is allowed to participate in our weekly meetings.

    + You are eligible to represent UIUC at the Regionals/World Finals if you are: +
      +
    • Enrolled in University of Illinois at Urbana-Champaign, and
    • +
    • Started college in 2014 or later OR born in 1995 or later.
    • +

    +
    + +
    +

    Rules

    + You must physically present in the room to compete. No remote participation allowed.

    + However, you will be allowed to access the questions after the contest has ended, for your own practice.

    + Students compete individually and communication during the contest is not allowed except for special 'open' contests.

    + During the contest, Internet usage (e.g. Google, Stack Overflow, etc.) is forbidden, with the following exceptions: + + Any physical reference materials (e.g. notes, textbooks, printed code, etc.) are allowed. Any electronic and digital reference materials are forbidden, with exception of websites listed above.

    + If you violate these contest rules, you will be disqualified from the leaderboard.
    +
    + +
    +

    Rating

    + In each contest,
    +
      +
    • Each problem is worth the same.
    • +
    • Contestants are ranked by the number of problems solved. Ties are broken by time penalty.
    • +
    • Time penalty = sum of {[Time of acceptance since start of contest] + 20mins * [number of rejected submissions before acceptance]} for each accepted problem
    • +
    • Baseline: work on easier problems first, solve quickly and accurately.
    • +

    + After each contest, your rating will be adjusted based on your projected rank and actual rank.
    +
    + +
    +

    Languages allowed

    +
      +
    • C++ 11
    • +
    • Java 8
    • +
    • Python 3
    • +
    +
    + +
    +

    Questions?

    + Please feel free to reach out to us at icpc@cs.illinois.edu +
    + +
    +

    Sponsors

    + Caterpillar +
    diff --git a/scc.html b/scc.html index 890073e..53006f3 100644 --- a/scc.html +++ b/scc.html @@ -1,98 +1,98 @@ ---- -layout: default -title: Spring Coding Contest ---- - -
    -

    Spring Coding Contest 2019! (Outdated)

    -
    - - - -
    -

    Results

    - Final Scoreboard
    - Congratulations to team TwoSimple for solving the entire problem set in an amazing 160 minutes! Team SoySauce got second place by solving all 11 problems with a higher time penalty. Team PleaseAcceptMe solved 9 problems, while IseePC and 3Idiots1Computer both solved 6 problems. Great job everyone! -
    - -
    -

    Register here!

    -

    (requires Illinois login, each team should submit one form)

    -
    - Check this page for updates as we get closer to the contest. We will also send e-mail updates to registered students. Registration closes promptly in 11:00 AM CDT on Saturday, April 13th.
    - Teams of up to 3 students
    - If you can't find a team by the end of registration, we will do our best to match you with other students as soon as registration ends! But since we can't make any guarantees, start looking for teammates now!
    -
    - -
    -

    What?

    - A team-based ICPC-style programming contest on campus, open to all students of UIUC.
    -
    - -
    -

    When?

    - Saturday, April 13th, from 11:00 AM to 5:00 PM CDT
    -
    - -
    -

    Where?

    - Digital Computer Lab, Room 440 (in the basement)
    -
    - -
    -

    Why?

    - It'll be a lot of fun! If you like programming and solving challenging problems, grab a couple of friends and form a team and compete for prizes at the Spring Coding Contest! (Plus free food, snacks, and drinks!)
    -
    - -
    -

    Food

    - We will be providing pizza and drinks for lunch plus snacks and drinks during the contest, but you can bring your own if you'd like!
    -
    - -
    -

    Prizes

    -
      -
    • First place team: $40 each team member
    • -
    • Second place team: $20 each team member
    • -
    • Third place team: $10 each team member
    • -
    • Fourth place team: $10 each team member
    • -
    -
    - -
    -

    Eligibility

    - This contest is open to everyone, no matter your school year or major! -
    - -
    -

    Rules

    - During the contest internet usage is forbidden, with the following exceptions: -
    - Any physical reference materials such as notes, textbooks, printed code, etc are allowed although electronic and digital reference materials are strictly forbidden.
    - The rules are tentative and are subjective to change at our discretion.
    -
    - -
    -

    Languages allowed

    -
      -
    • C++ 11
    • -
    • Java 8
    • -
    • Python 3
    • -
    -
    - -
    -

    Questions?

    - Please feel free to reach out to us at icpc@cs.illinois.edu -
    +--- +layout: default +title: Spring Coding Contest +--- + +
    +

    Spring Coding Contest 2019! (Outdated)

    +
    + + + +
    +

    Results

    + Final Scoreboard
    + Congratulations to team TwoSimple for solving the entire problem set in an amazing 160 minutes! Team SoySauce got second place by solving all 11 problems with a higher time penalty. Team PleaseAcceptMe solved 9 problems, while IseePC and 3Idiots1Computer both solved 6 problems. Great job everyone! +
    + +
    +

    Register here!

    +

    (requires Illinois login, each team should submit one form)

    +
    + Check this page for updates as we get closer to the contest. We will also send e-mail updates to registered students. Registration closes promptly in 11:00 AM CDT on Saturday, April 13th.
    + Teams of up to 3 students
    + If you can't find a team by the end of registration, we will do our best to match you with other students as soon as registration ends! But since we can't make any guarantees, start looking for teammates now!
    +
    + +
    +

    What?

    + A team-based ICPC-style programming contest on campus, open to all students of UIUC.
    +
    + +
    +

    When?

    + Saturday, April 13th, from 11:00 AM to 5:00 PM CDT
    +
    + +
    +

    Where?

    + Digital Computer Lab, Room 440 (in the basement)
    +
    + +
    +

    Why?

    + It'll be a lot of fun! If you like programming and solving challenging problems, grab a couple of friends and form a team and compete for prizes at the Spring Coding Contest! (Plus free food, snacks, and drinks!)
    +
    + +
    +

    Food

    + We will be providing pizza and drinks for lunch plus snacks and drinks during the contest, but you can bring your own if you'd like!
    +
    + +
    +

    Prizes

    +
      +
    • First place team: $40 each team member
    • +
    • Second place team: $20 each team member
    • +
    • Third place team: $10 each team member
    • +
    • Fourth place team: $10 each team member
    • +
    +
    + +
    +

    Eligibility

    + This contest is open to everyone, no matter your school year or major! +
    + +
    +

    Rules

    + During the contest internet usage is forbidden, with the following exceptions: +
    + Any physical reference materials such as notes, textbooks, printed code, etc are allowed although electronic and digital reference materials are strictly forbidden.
    + The rules are tentative and are subjective to change at our discretion.
    +
    + +
    +

    Languages allowed

    +
      +
    • C++ 11
    • +
    • Java 8
    • +
    • Python 3
    • +
    +
    + +
    +

    Questions?

    + Please feel free to reach out to us at icpc@cs.illinois.edu +
    diff --git a/tryouts.html b/tryouts.html index 95d6022..5487382 100644 --- a/tryouts.html +++ b/tryouts.html @@ -1,89 +1,89 @@ ---- -layout: default -title: ICPC Regional Tryouts ---- - -
    -

    2019 ICPC Regional Tryouts

    -
    - -
    -
    -
    - - - - - - -
    -

    What?

    - Tryouts that select and form UIUC's ICPC regional teams. Participants will write code to solve problems on their own. Top-ranking contestants will form 3-5 teams each consisting 3 people.
    -
    - -
    -

    When?

    - First tryout: Saturday, September 21nd, 1:00 PM - 6:00 PM
    - Second tryout: Saturday, October 5th, 1:00 PM - 6:00 PM
    -
    - We will be starting the contest exactly on time, so we recommend you show up early . We will try to be there from 12:00 to help anyone get set up.
    -
    - To qualify for regional team selection, you will have to participate in at least one of the two tryouts. Taking both tryouts is strongly recommended.
    -
    - -
    -

    Where?

    - Digital Computer Lab, Basement Room 0416 (Both days) -
    - -
    -

    Registration

    - Register Now!
    - Registration closes on Sep 19th 23:59.
    -
    - -
    -

    Food

    - We will be providing pizza and drinks for lunch (starting from 12:30 AM), plus snacks during the contest. You can also bring your own snacks.
    -
    - -
    -

    Eligibility

    - You are eligible for regional team selection as long as you are eligible for the regional contest this fall.

    - You are most likely to be eligible if you are -
      -
    • Enrolled in University of Illinois at Urbana-Champaign, AND
    • -
    • Started college in 2015 or later OR born in 1996 or later.
    • -

    - If you are uncertain about your eligibility, please see this link.
    -
    - -
    -

    Rules

    - You must physically present in the lab to compete. No remote participation allowed.

    - Students compete individually and communication during the contest is not allowed.

    - During the contest, Internet usage (e.g. Google, Stack Overflow, etc.) is forbidden, with the following exceptions: - - Any physical reference materials (e.g. notes, textbooks, printed code, etc.) are allowed. Any electronic and digital reference materials are forbidden, with exception of websites listed above.

    - If you violate these contest rules, you will be disqualified for regional team selection.
    -
    - -
    -

    Languages allowed

    -
      -
    • C++ 11
    • -
    • Java 8
    • -
    • Python 3
    • -
    -
    - -
    -

    Questions?

    - Please feel free to reach out to us at icpc@cs.illinois.edu -
    +--- +layout: default +title: ICPC Regional Tryouts +--- + +
    +

    2019 ICPC Regional Tryouts

    +
    + +
    +
    +
    + + + + + + +
    +

    What?

    + Tryouts that select and form UIUC's ICPC regional teams. Participants will write code to solve problems on their own. Top-ranking contestants will form 3-5 teams each consisting 3 people.
    +
    + +
    +

    When?

    + First tryout: Saturday, September 21nd, 1:00 PM - 6:00 PM
    + Second tryout: Saturday, October 5th, 1:00 PM - 6:00 PM
    +
    + We will be starting the contest exactly on time, so we recommend you show up early . We will try to be there from 12:00 to help anyone get set up.
    +
    + To qualify for regional team selection, you will have to participate in at least one of the two tryouts. Taking both tryouts is strongly recommended.
    +
    + +
    +

    Where?

    + Digital Computer Lab, Basement Room 0416 (Both days) +
    + +
    +

    Registration

    + Register Now!
    + Registration closes on Sep 19th 23:59.
    +
    + +
    +

    Food

    + We will be providing pizza and drinks for lunch (starting from 12:30 AM), plus snacks during the contest. You can also bring your own snacks.
    +
    + +
    +

    Eligibility

    + You are eligible for regional team selection as long as you are eligible for the regional contest this fall.

    + You are most likely to be eligible if you are +
      +
    • Enrolled in University of Illinois at Urbana-Champaign, AND
    • +
    • Started college in 2015 or later OR born in 1996 or later.
    • +

    + If you are uncertain about your eligibility, please see this link.
    +
    + +
    +

    Rules

    + You must physically present in the lab to compete. No remote participation allowed.

    + Students compete individually and communication during the contest is not allowed.

    + During the contest, Internet usage (e.g. Google, Stack Overflow, etc.) is forbidden, with the following exceptions: + + Any physical reference materials (e.g. notes, textbooks, printed code, etc.) are allowed. Any electronic and digital reference materials are forbidden, with exception of websites listed above.

    + If you violate these contest rules, you will be disqualified for regional team selection.
    +
    + +
    +

    Languages allowed

    +
      +
    • C++ 11
    • +
    • Java 8
    • +
    • Python 3
    • +
    +
    + +
    +

    Questions?

    + Please feel free to reach out to us at icpc@cs.illinois.edu +