Educational Codeforces Round 54

A. Minimizing the String

問題概要

Problem - A - Codeforces

長さ n の文字列 s が与えられる。1文字削除して辞書順最小の s' を出力せよ。

制約

 2 \le n \le 2 \cdot 10^5

考え方

辞書順最小の文字列を求めるには、前から順番に辞書順最小の文字列で構成していくことになります。よって s_i \geq s_{i+1} なる i が存在した場合は  s_i を除くことで辞書順最小が達成されます。

Submission #45970471 - Codeforces

B. Divisor Subtraction

問題概要

Problem - B - Codeforces

以下の操作をするとき、操作の回数を求めよ。

操作
n = 0 ならば操作を終了する。そうでなければ n の最小の素因数 d をもとめ、n から d を引く

制約

2 \le n \le 10^{10}

考え方

一度 n が偶数になった場合はその後は常に 2 が最小の素因数になるため、2 を引き続けることになります。よって n が奇数の場合は最小の素因数 d を求め n-d をし、残りの数を 2 で割った回数が解となります。

Submission #45970778 - Codeforces

C. Meme Problem

問題概要

Problem - C - Codeforces

a + b = d かつ a \cdot b = d を満たすような a, b を求めよ。誤差は |(a + b) - a \cdot b| \le 10^{-6}, |(a + b) - d| \le 10^{-6} まで許容される。クエリが t 個与えられるのでそれぞれに答えよ。

制約

  • t : 1 \le t \le 10^3
  • d : 0 \le d \le 10^3

考え方

二分探索なのかと思いきや、2次方程式の解を求めることに帰着します。解の公式  \displaystyle a = \frac{d \pm \sqrt{d^2-4d}}{2}, b = d - a に代入して解が求まりますが、判別式 D = d^2-4d \lt 0 となる場合は解なしのため N と出力します。

Submission #45971338 - Codeforces

D. Edge Deletion

問題概要

Problem - D - Codeforces

n 頂点の m 本の辺をもつ重み付き無向木が与えられる。1 から各頂点 i への最短経路を d_i とする。

今、多くとも k 本の辺が残るようにして、いくつかの辺を削除したい。削除したときに 1 から i への最短経路が d_i に一致する場合は i は良い頂点という。良い頂点を最大化するように辺を削除せよ。

制約

  • 2 \le n \le 3 \cdot 10^5
  • 1 \le m \le 3 \cdot 10^5
  • n - 1 \le m
  • 0 \le k \le m

考え方

頂点 i からの各頂点への最短経路は Dijkstra法で求めることができます。そのとき頂点 1 から各頂点への最短経路木を求めておけば、1 から k 辺たどることができる木が求める辺の集合となります。

Dijkstra法は各頂点の更新は高々 1 回なので、ある頂点を更新したときに使用した辺は最短経路木に必要な辺になります。このようにすると最短経路木に必要な辺の集合が求めることができるので、そのうち min(n-1, k) 個を出力すればよいです。

Submission #45972282 - Codeforces