Slide 1

Slide 1 text

No:284 門松と魔法(2) 原案,解説: camypaper

Slide 2

Slide 2 text

問題概要 • 一列に並んだN本の竹が与えられる • 以下の条件を満たすように0本以上の竹を抜くとき, 最大何本残すことが可能か? – 隣り合う3本の竹の高さが異なり,真ん中の竹の高さが 最大または最小 – 竹が0本 • 制約: 6 5 10 1 10 1     i A N

Slide 3

Slide 3 text

考察(1):竹の高さ • 座標圧縮すると竹の高さは最大でも高々N種類 – 竹の取りうる値の範囲はどうでもいい

Slide 4

Slide 4 text

考察(2):特徴は?

Slide 5

Slide 5 text

考察(2):特徴は? • ジグザグしている

Slide 6

Slide 6 text

考察(2):特徴は? • ジグザグしている • 同じ高さのものには注意が必要

Slide 7

Slide 7 text

考察(2):特徴は? • ジグザグしている • 同じ高さのものには注意が必要 • 離れている場合には気にしなくても良さそう

Slide 8

Slide 8 text

方針(1): どうやって答えを求める? • 最長増加部分列の亜種っぽい? – DPでできそう – 状態は? • 求めたい列を最長門松部分列と呼ぶことにする – この数列は右端と右から2番目の高さによって状態が決まる • 右端の高さをr ,右から2番目の高さがmのときの, 最長門松部分列の長さをdp[m][r]としたとき で表せる   ) , , ( | 1 ] ][ [ max ] ][ [ m r l or m r l and r l m l dp r m dp     

Slide 9

Slide 9 text

方針(1): どうやって答えを求める? • ジグザグしている特徴があったことを考えると 増加してるときと減少してるときを分けてよさそう • mrのときをdec[m][r]で 管理することにすると で表せる。 • これは – 間に合わない     ) , ( | 1 ] ][ [ max ] ][ [ ) , ( | 1 ] ][ [ max ] ][ [ m r l and r l m l inc r m dec m r l and r l m l dec r m inc         ) ( 3 N O

Slide 10

Slide 10 text

方針(2):どうやって状態を減らす? • ここから先ではincだけ考える(対称なので) • 先ほどの漸化式のmを固定することを考える • するとx軸をlの値,y軸をinc[l][m]の値とした 棒グラフが描ける l inc[l][m]

Slide 11

Slide 11 text

方針(2):どうやって状態を減らす? • inc[l][m]のうち,いくつ調べる必要がある? l inc[l][m]

Slide 12

Slide 12 text

方針(2):どうやって状態を減らす? • inc[l][m]のうち,いくつ調べる必要がある? – 実はinc[l][m]が最大のものと2番目に大きいものの 2つだけ見ればよい l inc[l][m]

Slide 13

Slide 13 text

方針(2):どうやって状態を減らす? • inc[l][m]が最大のものと2番目に大きいものの どちらかはl≠rを満たす l inc[l][m]

Slide 14

Slide 14 text

方針(2):どうやって状態を減らす? • inc[l][m]が最大のものと2番目に大きいものの どちらかはl≠rを満たす • inc[l][m]が最大のものと2番目に大きいものの どちらもl≠rのとき:最大のものを取ればよい l inc[l][m] r

Slide 15

Slide 15 text

方針(2):どうやって状態を減らす? • inc[l][m]が最大のものと2番目に大きいものの どちらかはl≠rを満たす • inc[l][m]が最大のものがl=rのとき:2番目に大きいもの を取ればよい l inc[l][m] r

Slide 16

Slide 16 text

方針(2):どうやって状態を減らす? • inc[l][m]が最大のものと2番目に大きいものの どちらかはl≠rを満たす • inc[l][m]が2番目に大きいのものがl=rのとき:最大のも のを取ればよい l inc[l][m] r

Slide 17

Slide 17 text

方針(2):どうやって状態を減らす? • lについてinc[l][m]が最大のものと2番目に大きいもの だけを見ればいいことがわかった • 最大のもののlをa,二番目に大きいもののlをbとしたと き漸化式は以下のように表せる • 計算量は – まだ間に合わない ) ( 2 N O            m r b a otherwise m b dec r a m a dec r m inc , , ) ( 1 ] ][ [ ) ( 1 ] ][ [ max ] ][ [

Slide 18

Slide 18 text

方針(3): さらに状態を減らせる? • mを全て見る必要はある? • ここでlを無視して先ほどの式を眺める            m r b a otherwise m b dec r a m a dec r m inc , , ) ( 1 ] ][ [ ) ( 1 ] ][ [ max ] ][ [

Slide 19

Slide 19 text

方針(3): さらに状態を減らせる? • mを全て見る必要はある? • ここでlを無視して先ほどの式を眺める            m r b a otherwise m b dec r a m a dec r m inc , , ) ( 1 ] ][ [ ) ( 1 ] ][ [ max ] ][ [

Slide 20

Slide 20 text

方針(3): さらに状態を減らせる? • mを全て見る必要はある? • ここでlを無視して先ほどの式を眺める • これはRMQ(Range Maximum Query)            m r b a otherwise m b dec r a m a dec r m inc , , ) ( 1 ] ][ [ ) ( 1 ] ][ [ max ] ][ [

Slide 21

Slide 21 text

想定解法: RMQ+DP • セグメント木の葉ノードに {最長門松部分列の長さL, 右から2番目の高さl,右端の高さm} をlが異なり,Lが最大になるようなものと,2番目に大きいも のを持たせる(ここまでは配列と一緒) • 節ノードにも同様に2つの子ノードの情報から {最長門松部分列の長さL, 右から2番目の高さl,右端の高さm} をlが異なり, Lが最大になるようなものと,2番目に大きいも のを持たせる

Slide 22

Slide 22 text

想定解法: セグメント木のノード • イメージ L1 l1 m1 L2 l2 m1 L2 l2 m2 L4 l4 m2 L1 l1 m1 L4 l4 m2 親ノードはlが異なりLを最大化 するように,子ノードから値を もらう 4 1 4 1 L L and l l   2 1 2 1 L L and l l   4 3 4 3 L L and l l  

Slide 23

Slide 23 text

想定解法: セグメント木のノード • イメージ L1 l1 m1 L2 l2 m1 L2 l2 m2 L4 l4 m2 L1 l1 m1 L4 l4 m2 親ノードはlが異なりLを最大化 するように,子ノードから値を もらう 基本的には配列がセグメント木になっただけ!!! 4 1 4 1 L L and l l   2 1 2 1 L L and l l   4 3 4 3 L L and l l  

Slide 24

Slide 24 text

想定解法: セグメント木 • イメージ – さっきのがいっぱいある

Slide 25

Slide 25 text

想定解法: RMQ • ある区間におけるlが異なり, Lが最大, 2番目に大きいものが O(log(N))で取得可能 – さっきのがいっぱいある

Slide 26

Slide 26 text

想定解法: 最大値の取得 • rに着目しているときに最大のdec[l][m]を返すクエリ • ペアのどちらを返すか注意してやればよい

Slide 27

Slide 27 text

想定解法: 2番目に大きい値の取得 • inc[m][r]を更新することを考えると,inc[m][r]が2番目に大きい ものも取得する必要があった 1回目のクエリで得られた位置mで2つの区間に分割して調査

Slide 28

Slide 28 text

想定解法: 更新 • 葉ノードから丁寧に根まで押し上げればよい. O(log(N))

Slide 29

Slide 29 text

想定解法: RMQ+DP • 以上のように,セグメント木にうまく情報を持たせることで 取得O(log(N)),更新O(log(N))でDPを行うことができる. • 全体としてO(N log(N))

Slide 30

Slide 30 text

ジャッジ解 • camypaper: – C# 223行 /7724Bytes

Slide 31

Slide 31 text

結果 • First Accepted: – そんなものはない • AC/submit: – 0/12 (0%) • AC/trying: – 0/4 (0%)