AtCoder Regular Contest 060
Updated:
- Review: 2020-07-05
Source codes
Solutions
C - 高橋君とカード / Tak and Cards
Assume $0$-indexed.
Solution
The condition that the average of $y _1, \dots, y _m$ is $A$ is equivalent to that the average of $y _ 1 - A, \dots, y _m - A$ is $0$, i.e., its sum is $0$. Therefore, we execute $x _ i \mathbin{- =} A$ first.
DP part
Let $C = 10000$.
Definition
vector<vector<ll>>
$dp[i][j] =$ the number of ways to choose elements from $x[0, i)$ with its sum being $j$.
Initial state
$dp[0][C] = 1$. Otherwise $0$.
Answer
$dp[N][C] - 1$, since we have to exclude the empty set.
Transition
For $i = 0, \dots, N - 1$, for $j = 0, \dots, 2C - 1$, we execute the followings.
\[
\begin{align}
dp[i + 1][j] &\mathbin{+=} dp[i][j], \
dp[i + 1][j + x _ i] &\mathbin{+=} dp[i][j] & (0 \leq j + x _ i < 2C).
\end{align}
\]
D - 桁和 / Digit Sum
This problem is about sqrt-decomposition. Let $m = 10 ^ 6$.
Solution
First, we think of easy cases. If $s > n$, it is impossible, so the answer is -1
. If $s = n$, the answer is $n + 1$. Hereinafter, we assume that $s < n$.
For $2 \leq b < m$, we try honestly. For $b > m$, we use another method. Let $p = n / b$ and $q = n \% b$. Then, it follows that $n = pb + q$. Since $b ^ 2 > n$, we have $p < b$. Thus the recursion of $f$ stops and it follows that $s = p + q$. Therefore, we have $n - s = p(b - 1)$. Note that $n - s > 0$. If $p = 0$, it implies that $n = q = s$. Thus, hereinafter we consider of the case $p \geq 1$. Then, $b - 1$ is a divisor of $n - s$. We can try them all.
The time complexity is $O(m) = O(\sqrt{n})$.
E - 高橋君とホテル / Tak and Hotels
This is a doubling problem. Let $M = 30$ be such that $2 ^ M > 10 ^ 5$.
Solution
We prepare for the queries in $O(NM)$-time and answer for each query in $O(M)$-time.
We define as follows.
$v[i][j] = $ the largest id of the hotels we can visit in $2 ^ i$ days from $j$-th hotel.
We fill $v[0][j]$. This is done by two-pointers method. Then, we apply doubling method for $v[i][j]$ such as $v[i][j] \gets v[i - 1][v[i - 1][j]]$.
For each query $(a, b)$, we can assume $a < b$ without loss of generality. We try $i = 29, \dots, 0$ so that we can move $a \gets v[i][a]$ as close to $b$ as possible, not reaching or overcoming $b$. The answer is its cost $+1$.
Point
Let $r(i) = v[0][i]$. This problem is to calculate $\min \{ n \in \mathbb{N} \mid r ^ n(a) \geq b \}$. We want to apply binary search for $n$. In this case, we use doubling method.
F - 最良表現 / Best Representation
Let $n = \lvert w \rvert$.
Solution
If the string consists of only one type of characters, the answer is $n$ and $1$.
The following proposition is a key to solve this problem.
Proposition F.1: If $w$ does not consist of only one type of characters, the minimum number of the terms of the best representation is $1$ or $2$.
We prove this proposition later. We consider how to solve this problem given this proposition.
How to judge given string is good or not #1 (Suffix Array)
We create a function bool is_good(int a, int s);
where we determine whether $w[a, a + s)$ is good or not. We test if $w[a, a + s)$ has a period $d$ or not for all the possibilities of $d$ which can divide $s$ with $d \neq s$. This means that the LCP of $w[a, n)$ and $w[a + d, n)$ is greater than or equal to $s - d$. We can do this check by suffix array.
We can gather all the divisors on $[1, n]$ in $O(n \log n)$-time. This is similar to sieve of Eratosthenes. For the case the answer is $1$, we check is_good(0, n)
. For the case the answer is $2$, we try all $i = 1, \dots, n - 1$ to see is_good(0, i) && is_good(i, n - i)
. Count the numbers and flush it.
How to judge given string is good or not #2 (KMP algorithm)
We can also use KMP algorithm. With MP-array of a string $S$, we can calculate $S[0, i)$’s period.
int period(int i) const
{ // The period of S[0, i).
auto tmp{i - A[i]};
if (i % tmp == 0)
{
return tmp;
}
return i;
}
This is because $i$-th element of MP-array means that the longest common length of prefixes of $S$ and suffixes of $S[0, i)$. But be careful for the mid-terms. For instance, consider the case $S = $”abcabcab”. Then, its mp arrays says that $8$ th element of MP-array is $5$, but its period is not $3$. Therefore, we need to check about divisors.
We make MP-array for $w$ and reversed $w$. Then, the idea is the same above.
Proof of Proposition F.1
It suffice to show that either of $w$ or $w[0, n - 1)$ is a good string. Suppose to the contrary that both of them are non-good string. Let $p$ and $q$ be the period of $w$ and $w[0, n - 1)$, respectively. Since $p$ divides $n$, $q$ divides $n - 1$ and $\gcd(n, n - 1) = 1$, it follows that $\gcd(p, q) = 1$. Note that $p \geq (n - 1) / 2$ and $q \geq n / 2$.
Let $0 \leq a < b < n$. We will show that $S[a] = S[b]$. There exists such $k, l \in \mathbb{N}$ that $\lvert b - a \rvert = kp - lq$. For any $i \in n$, at least either $i - q \geq 0$ or $i + p < n$ follows since the length of the string $S$ is greater than or equal to $p + q$. In addition, it also follows that $S[i - q] = S[i] = S[i + p]$, where the indexes are not out-of-range. Therefore, it follows that $S[b] = S[a + kp - lq] = S[a]$ if we show that there is a path between $a$ and $b$.
There are two type of possibilities of stalemates. Suppose that there exists $l’ < l$ that we come to $a + kp - l’q$ but cannot transit $a + kp - l’q \to a + kp - (l’ + 1)q$. This means either $a + kp - (l’ + 1)q < 0$ or $a + kp - (l’ + 1)q \geq n$. If the former held, we would have $b < 0$. If the latter held, we would have $a + kp - l’q \geq n$. Both of them are contradictions. Suppose that there exists $k’ < k$ that we come to $a + k’p - lq$ but cannot transit $a + k’p - lq \to a + (k’ + 1)p - lq$. This is also impossible proved in the same way. This completes the proof.
References
- AtCoder ARC 060 F - 最良表現 (900 点) (けんちょんの競プロ精進記録) by drken-san
- Especially, how to judge … #2.