SlideShare a Scribd company logo
1 of 19
解説:ボス
技術室奥プログラミングコンテスト#2 問題I
問題概要
以下のクエリをたくさん処理してください
区間[L,R]が増えたり減ったりする
区間が与えられて、それをすっぽり覆うような区間
の中で、左端の距離と右端の距離の積の最大を求め
る。
考察
区間がいっぱいだとわかりづらい
区間[L,R]を、座標(L,R)にプロットすると、問題は次
のように言い換えられる。
問題概要
平面上に点が増えたり減ったりする
ある点が与えられるので、それよりもx座標が小さく、
y座標が大きいものの中で、その二つを対角とする長
方形の大きさの最大を求めよ
考察
点が増えたり減ったりするのがやばそう
そこで、
・ステップ1 点を固定して解ける形に
問題を変形する
・ステップ2 点が固定された状態で解く
という方法をとる
ステップ1
答えるクエリの列を考えて、その上にSegmentTree
を作ってみる。
Q Q Q Q Q Q Q Q
ステップ1
そして、すべての点に対し、存在する期間に対応す
る区間にその点を突っ込む
例えば、青の期間、点Pがあるなら、赤の位置に点P
を突っ込む。
Q Q Q Q Q Q Q Q
ステップ1
また、すべてのクエリについて、SegTreeを登ってい
く途中の位置にそのクエリを突っ込む
Q Q Q Q Q Q Q Q
ステップ1
以上の操作を行ったあと、SegmentTreeの各ノード
において点が固定された問題を解き、各クエリにつ
いてmaxをとると、答えが求まる。
ステップ2
とりあえず、O(N)個の点とO(N)個のクエリが来ると
思って問題を解きます。
ステップ2
自明な観察として、点がいっぱいあっても、左上の
階段を作る点以外無視していい。
ステップ2
2点の場合について考えてみると、その2点の間を
通るある直線を境に、Aの側にあるものはAと作る長
方形の方が大きく、逆もまた然り。
A
B
ステップ2
3つ以上ある場合も同様に、領域ごとに、最大とな
る点が分かれている。
点が所属する領域を高速に求めたい。
A
B
C
ステップ2
x軸の小さい方から平面走査していけば、二分探索で、
どの領域に含まれるかわかる
おしまい・・・・・・?????????????
A
B
C
ステップ2
おしまいじゃない
線の交差を考える必要がある
A
B
C
ステップ2
線の交点よりx座標が大きいところでは、点Bはない
ものとして扱ってよい。
そこで、線が交差したタイミングで、Bを消去し、
AとCの間の新しい線を伸ばす。
A
B
C
ステップ2
線の交点をすべて列挙すると最悪N^2かかる
実は、隣り合う線だけでできる交点のみ保持してい
ればいい
なぜなら、たとえば左のような赤い二つの離れた線
を考えると、その間から生えてくる線との交点が
先にあるから。
ステップ2
交点追加のタイミングは、点の追加、削除の時だが、
どちらもO(N)回、よって管理する交点もO(N)個
この交点イベントと、本来のクエリイベントを、x座
標の小さい順に処理していけばいい
ソートや二分探索でlogがついて、O(NlogN)
まとめ
ステップ1で点とクエリの数がlogN倍になったこと
を踏まえると、全体でO(Nlog^2N)で解ける
おしまい

More Related Content

More from 理玖 川崎

カードの取り合い
カードの取り合いカードの取り合い
カードの取り合い理玖 川崎
 
区間和剰余クエリ
区間和剰余クエリ区間和剰余クエリ
区間和剰余クエリ理玖 川崎
 
ユークリッド最小全域木
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木理玖 川崎
 
解説:歩くNPCたち
解説:歩くNPCたち解説:歩くNPCたち
解説:歩くNPCたち理玖 川崎
 
解説:エンブレム
解説:エンブレム解説:エンブレム
解説:エンブレム理玖 川崎
 
線形識別によるパターン認識
線形識別によるパターン認識線形識別によるパターン認識
線形識別によるパターン認識理玖 川崎
 
解説:サポーター
解説:サポーター解説:サポーター
解説:サポーター理玖 川崎
 
解説:おおきな数を作った
解説:おおきな数を作った解説:おおきな数を作った
解説:おおきな数を作った理玖 川崎
 
解説:吹奏楽部
解説:吹奏楽部解説:吹奏楽部
解説:吹奏楽部理玖 川崎
 

More from 理玖 川崎 (13)

RNNで頑張ろう
RNNで頑張ろうRNNで頑張ろう
RNNで頑張ろう
 
カードの取り合い
カードの取り合いカードの取り合い
カードの取り合い
 
石油
石油石油
石油
 
釣り
釣り釣り
釣り
 
区間和剰余クエリ
区間和剰余クエリ区間和剰余クエリ
区間和剰余クエリ
 
ユークリッド最小全域木
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木
 
解説:歩くNPCたち
解説:歩くNPCたち解説:歩くNPCたち
解説:歩くNPCたち
 
解説:エンブレム
解説:エンブレム解説:エンブレム
解説:エンブレム
 
線形識別によるパターン認識
線形識別によるパターン認識線形識別によるパターン認識
線形識別によるパターン認識
 
解説:サポーター
解説:サポーター解説:サポーター
解説:サポーター
 
解説:おおきな数を作った
解説:おおきな数を作った解説:おおきな数を作った
解説:おおきな数を作った
 
解説:吹奏楽部
解説:吹奏楽部解説:吹奏楽部
解説:吹奏楽部
 
WAVE_WITH_GLSL
WAVE_WITH_GLSLWAVE_WITH_GLSL
WAVE_WITH_GLSL
 

解説:ボス