LoginSignup
0
0

More than 1 year has passed since last update.

AtCoder Beginer Contest 220 感想

Posted at

総合結果

  • [Score] 1500 pts
  • [Time] 44:37 + 05:00 $\times$ 0 = 44:37
  • [Ranking] 805 th [Rated内: 622 nd]
  • [Performance] 1587 
  • [Rating] 1946 1914 (-32)

各問題ごとの詳細, 提出コード

Question Score Time/Result Penalty During Contest After Contest
A問題 100 pts 01:08
B問題 200 pts 02:47
C問題 300 pts 05:49
D問題 400 pts 09:45
E問題 0 pts --:--
F問題 500 pts 44:37
G問題 0 pts --:--
H問題 0 pts --:--
Total 1500 pts 44:37 No Penalties

問題ごとの感想

A問題 (100pts, diff: 14) Find Multiple

$A$ 以上 $B$ 以下の $C$ の倍数を見つけるためには, いくつかの方法がある.

  • $C \left \lceil \dfrac{A}{C} \right \rceil=C \left \lfloor \dfrac{A+C-1}{C} \right \rfloor$ が $A$ 以上の最小の $C$ の倍数である.
  • $C \left \lfloor \dfrac{B}{C} \right \rfloor$ が $B$ 以上の最大の $C$ の倍数である.
  • $x=A,A+1, \dots, B$ それぞれが $C$ の倍数かどうかを判定する.

B問題 (200pts, diff: 58) Base K

$K$ 進表記で表された $x_0 \dots x_m$ が表す値 $X$ は以下のようにして求められる.

  • $X \gets 0$
  • $i=0,1, \dots, m$ の順に以下を実行する.
    • $X \gets LX+x_i$
  • $X$ を出力する.

C問題 (300pts, diff: 119) Long Sequence

数列 $B$ の連続する $N$ 項の和は, $\alpha:=\sum_{i=1}^N A_i$ であることから, $q:=\left \lfloor \dfrac{X}{\alpha} \right \rfloor$ とすると, 答え $K$ は $qN < K \leq (q+1)N$ を満たすことがわかる. よって, $N \leq 10^5$ なので, $\beta \gets q \alpha$ として, $\beta$ に $A_i$ を足しながら, $qN+i$ が答えかどうかを順々にみれば, 計算量 $O(N)$ で求められる.

D問題 (400pts, diff: 644) FG operation

動的計画法で求める. ${\rm DP}[i][a]$ で, $i$ 回操作した結果, 先頭の項が $a$ であるような操作の数とする. このとき, ${\rm DP}[N-1][K]~(K=0, \dots, 9)$ が求めるべき解である.

  • $i=0$ のとき, 操作はしないので, 結果は元の列に一致する. よって,

$${\rm DP}[0][a]=\begin{cases} 1 & (a=A_1) \\ 0 & (a \neq A_1) \end{cases}$$

  • $1 \leq i \leq N-1$ のとき, $i-1$ 回の操作で, 先頭の項が $b$ になったとする. このとき, 操作 $F$ , 操作 $G$ それぞれを考えることにより,

$${\rm DP}[i][(b+A_{i+1}) \bmod{10}] \quad (\because F), \quad {\rm DP}[i][(bA_{i+1})] \bmod{10}] \quad (\because G)$$

に ${\rm DP}[i-1][b]$ を足すことになる.

この動的計画法により, 計算量 $O(N)$ で求めることができる.

E問題 (500pts, diff: 1593) Distance on Large Perfect Binary Tree

※制約上ありえないが, $D=0$ のときも言及する (答えは $2^N-1$ であるが) .

まず, $T_n$ で深さが $n$ の完全二分木とする. このとき, 以下のような特徴がある.

  • $T_n$ にある深さ $k~(0 \leq k \leq n)$ の頂点のは $2^k$ 個ある.
  • $T_n$ は2つの $T_{n-1}$ の根を共に新たな頂点で結んだ木である.

ここで, $T_{N-1}$ 上での2点間の距離の最大値は $2(N-1)$ なので, $2(N-1)<D$ のときは直ちに解答を $0$ と求められる. 以下 $2(N-1) \leq D$ とする.

全ての頂点対を最小共通先祖 (LCA) で場合分けする. このとき, 対称性から, ある深さ $k$ の頂点において, その頂点を根とする部分木に制限したときの距離 $D$ の点対の個数を $X_k$ とすると, 求めるべき答えは

$$\sum_{k=0}^{N-1} 2^k X_k$$

である. 以下, $X_k$ を求める.

$X_k$ は $T_{N-1-k}$ に同型である. 今, 最小共通先祖が根なので, 選べる頂点の対 $(u,v)$ は以下のうちのどれかが成立するような選ぶ方になる.

  • $u,v$ のうち, 少なくとも一方が根
  • 根が結ぶ2つの部分木をそれぞれ左, 右と呼ぶことにすると, $u$ は左, $v$ は右の頂点 (またはその逆).

場合分けする. ここで, $\mu:=N-1-k$ とし, $\mu$ は頂点が深さの最大値である.

  • $u$ が根のとき, $0 \leq D \leq \mu$ ならば, $v$ として深さが $D$ となる頂点を選ぶことで最小共通先祖が根で, $\operatorname{dis}(u,v)=D$ になることができる. $\mu < D$ のときはこの条件下では$\operatorname{dis}(u,v)=D$ にすることができない. 深さ $D$ の頂点は $2^D$ 個あり, $v$ が根のときも合わせて, このパターンでは

$$\begin{cases} 1 & (D=0) \\ 2 \times 2^D & (1 \leq D \leq \mu) \\ 0 & (\mu < D) \end{cases}$$

となる.

  • $u$ が右, $v$ が左のとき, $T_\mu$ における $u,v$ の深さの和と $\operatorname{dis}(u,v)$ は一致する.
    • $u \neq v$ が確定しているので, このパターンで $D=0$ とはならない.
    • $1 \leq D \leq \mu$ のとき, $u,v$ の深さの組として可能なのは, $(1,D-1), \dots, (D-1, 1)$ の $D-1$ 通りである.
    • $\mu < D \leq 2\mu$ のとき, $u,v$ の深さの組として可能なのは, $(D-\mu,\mu), \dots, (\mu, D-\mu)$ の $2\mu-D+1$ 通りである.
    • $T_\mu$ における $u,v$ の深さは $\mu$ 以下なので, $2\mu <D$ とはなりえない.

ここで, 右左の区別があり, 2つの深さの組が $i,j$ となるような頂点の選び方は $2^{i-1} \times 2^{j-1}=2^{i+j-2}$ であり, 今 $i+j=D$ となるようにしているので, $2^{D-2}$ 通りである.

このことから, $u,v$ の頂点の役割を交換することも考慮して, このパターンでは,

$$\begin{cases} 0 & (D=0) \\ 2 \times 2^D (D-1) & (0 < D \leq \mu) \\ 2 \times 2^{D-2} & (2 \mu-D+1) \\ 0 & (2 \mu <D) \end{cases}$$

である. 以上の2パターンを合わせることにより, $\mu_k:=N-1-k$ として,

$$X_k=\begin{cases} 1 & (D=0) \\ 2 \times (2^{D-2}(D-1)+2^D) & (0 < D \leq \mu) \\ 2 \times 2^{D-2}(2 \mu-D+1) & (\mu < D \leq 2\mu) \\ 0 & (2 \mu < D) \end{cases}$$

となる.

よって, $k=0,1,\dots, 2(N-1)$ に対して, $2^k$ を前計算すことにより, 各 $X_k$ を $O(1)$ で求められので, $\displaystyle \sum_{k=0}^{N-1} 2^k X_k$ を $O(N)$ で求めることができる.

F問題 (500pts, diff: 1304) Distance Sums 2

$X_i:=\sum_{j=1}^N \operatorname{dis}(i,j)$ とする. ここで, 与えられる木 $T$ を適当な頂点 ${\rm root}$ を根とする根付き木とみなす.

まず, $X_{\operatorname{root}}$ は以下のようにして求められる.

頂点 $v$ の $T$ における深さを $\operatorname{depth}_T(v)$ とすると,
$$\displaystyle X_{\rm root}=\sum_{v=1}^N \operatorname{depth}_T(v)$$
である.

この $X_{\operatorname{root}}$ を利用して残りを求めることにする.

根でない頂点 $v$ の親を $w$ とし, $X_w$ が既に求まっているとする. このとき, $v$ の子孫の集合を $S_v$ とすると,

$$\operatorname{dis}(v,u)=\begin{cases} \operatorname{dis}(w,u)-1 & (u \in S_v) \\ \operatorname{dis}(w,u)+1 & (u \not \in S_v) \end{cases}$$

である. よって,

\begin{align*}
X_v
&=\sum_{u=1}^N \operatorname{dis}(v,u) \\\\
&=\sum_{u \in S_v} (\operatorname{dis}(w,u)-1)+\sum_{u \not \in S_v} (\operatorname{dis}(w,u)+1) \\\\
&=\sum_{u=1}^N \operatorname{dis}(w,u)-|S_v|+(N-|S_v|) \\\\
&=X_w+N-2|S_v|
\end{align*} 

である. ここで, $|S_v|$ は頂点 $v$ の子孫の個数であるが, これは以下の漸化式を葉から計算することで求めることができる. ただし, ${\rm ch}(v)$ で頂点 $v$ の子とする.

$$|S_v|=\sum_{a \in {\rm ch}(v)} |S_a|+1$$

この $|S_v|$ の情報と, $X_{\rm root}$ から, 深さが小さい順に全ての $X_{\bullet}$ を求めることができる. 計算量は $O(N)$ である.

G問題 (600pts, diff: 2439) Isosceles Trapezium

(正解でき次第加筆予定)

H問題 (600pts, diff: 3047) Security Camera

(正解でき次第加筆予定)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0