Más contenido relacionado
La actualidad más candente (20)
AtCoder Regular Contest 036 解説
- 4. A-数式で表す
● t[i] = i日目の高橋くんの睡眠予定時間
● 3 ≦ i ≦ N なる i のなかで
t[i-2] + t[i-1] + t[i] < K
となる最小の i を、存在するなら求めよ
- 5. A-解法
● t[i] = i日目の高橋くんの睡眠予定時間
● 3 ≦ i ≦ N なる i のなかで
t[i-2] + t[i-1] + t[i] < K
となる最小の i を、存在するなら求めよ
● N ≦ 100,000なので、iを全通り試しても十分
まにあう
– 満点解法
- 6. A-注意点
● i = 1, i = 2のときは調べないようにしなければ
ならない
– t[-1]に参照して実行時エラーになりうる
● 不等号に注意
– t[i-2] + t[i-1] + t[i] ≦ K にすると失敗する
– 問題文をよく読みましょう
- 8. 概要
• 長さ 𝑁 の数列があります。
• ℎ 𝑠 ≦ ℎ 𝑠+1 ≦ ⋯ ≦ ℎ 𝑡 ≧ ⋯ ≧ ℎ 𝑢 となる整数組 (𝑠, 𝑡, 𝑢) のうち、 𝑢 −
𝑠 + 1 の最大値を求めてください。
• 1 ≦ 𝑁 ≦ 300,000
• 1 ≦ ℎ𝑖 ≦ 1,000,000,000
- 9. 部分点解法
• すべての整数組 (𝑠, 𝑡, 𝑢) について考えます。
• 整数組 (𝑠, 𝑡, 𝑢) が実際に山の条件を満たしているかは、O(𝑁) 回の
判定でできます。
• 考えられる整数組は O(𝑁3
) 個あるので、全体で O(𝑁4
) の計算量と
なります。
- 10. 考察
• 𝑠 や 𝑢 に関して、外側に伸ばせるのに伸ばさないのはもったいない
です。
• 先に 𝑡 を固定して、 𝑠 と 𝑢 を外側に伸ばせるだけ伸ばすという方針
で O(𝑁2) に減らすことができます。
• O(𝑁2) よりも高速にするために、さきほどの 𝑡 に関して考えてみます。
- 11. 満点解法
• 先ほどの 𝑡 としては、データの両端であるか、ℎ 𝑡−1 ≦ ℎ 𝑡 かつ ℎ 𝑡 ≧
ℎ 𝑡+1 であるような 𝑡 だけ考慮すれば良いことが分かります (そうでな
い場合、 𝑡 − 1 あるいは 𝑡 + 1 の方がより良い結果になることが分
かります)。
• このように限定した場合、どの要素も高々定数回しかアクセスされな
いので、全体で O(𝑁) となります。
- 13. 概要
• 長さ 𝑁 の 0,1 からなる数列があります。
• ? となっている場所をうまく 0,1 で埋めて、どのように部分列を取って
きても 0,1 の個数の差が 𝐾 以下となるようにします。
• 考えられる総数を 1,000,000,007 で割った余りを求めてください。
• 1 ≦ 𝑁 ≦ 300
• 1 ≦ 𝐾 ≦ 𝑁
- 14. 部分点解法 1
• すべての 0,1 割り当てを考えます。
• すべての配置が定まれば、その配置が条件を満たしているかは
O(𝑁3) で判定できます。
• 考えられる個数は 2 𝑁
個あるので、全体で O(2 𝑁
𝑁3
) となります。
• 1 つめのデータセットに対して正解できます。
- 15. 部分点解法 2
• 動的計画法を用いて左から順に調べることを考えます。
• 考えるべき状態数としては、今まで調べた場所と、調べた場所の右
端から左に伸ばしたときに (0 の個数)-(1 の個数) として何が考えら
れ、何が考えられないのかという情報です。
• 後者 (0,1 の差) は、(0 の個数)-(1 の個数)として、 <1 が考えられる>、
<2 が考えられる>、…、 < 𝐾 が考えられる>、 <-1 が考えられる>、 <-2
が考えられる>、…、 < −𝐾 が考えられる> という、合計で 2𝐾 ビットの
情報を持っていれば表現できます (差 0 は、長さ 0 の列を考えれば
常に存在します)。
- 16. 部分点解法 2
• dp[i][j] = (場所 i まで調べていて矛盾 (差が 𝐾 を上回る状態) がなく、
かつ場所 i から左に伸ばしたときに考えられる差がビット列 j となる
ような 0,1 割り当ての総数) とします。
• 状態遷移は、今見ている場所に 0,1 のどちらが入るかを決めれば次
は一意に定まるので各状態につき O(1) で判定できます。
• このような動的計画法は O(2 𝐾 𝑁) で実行できます。
• 𝐾 が小さいデータセット 2 に関して正解することができます。
- 17. 考察
• すべての状態を考えていても、指数オーダーの計算量となります。
• (0 の個数)-(1 の個数) の最大値および最小値が一致するもの同士
をまとめて数え上げたいです。
• 実は最大値および最小値が一致するものをまとめても、特に問題は
ありません (なぜなら、差が 𝐾 を最初に越えるのは、必ず最大値か
最小値のいずれかであり、かつ状態遷移によってどの状態が考えら
れるかは、平行移動 (+ 差が 0) という変化しかないので、最大値と
最小値だけ考慮しておけばよいことになります)。
- 18. 満点解法
• dp[i][j][k] = (場所 i まで考えて矛盾 (差が 𝐾 を上回る状態) がなく、i
から左に伸ばしたときの (0 の個数)-(1 の個数) の最大値が j で最小
値が –k であるようなものの総数) とします。
• このような動的計画法は O(𝑁3) で実行できます。
• このアルゴリズムなら満点を得ることができます。
- 47. D-部分点1
● N,Q ≦ 3,000
● クエリ毎に毎回質問された頂点が二部グラフか
どうか判定しても充分間に合う
● 二部グラフ判定法
– 適当な頂点を赤く塗る
– そこから始めて、隣接する頂点の色が異なるように
DFSしながら塗っていく
– 隣接する頂点の色がおなじになる辺があったら二部
グラフではない。なかったら二部グラフ
- 69. D-満点解法1
● パターン1, 2の辺については適当に処理する
– 変更する情報は定数個なので、あまり計算量に影響
しない
● パターン3の塗り直しをどうするか
– 頂点数が少ない方を塗り直すようにすれば良い
– いわゆる「マージテク」
– どの頂点も塗り直されるタイミングで自分が属する
連結成分の大きさが2倍以上になる
● たかだかlogN回しか塗り直さない