700点3つ
D. All Your Paths are Different Lengths
問題:頂点1からnが有向グラフでトポロジカルに並んでいて、1からnのパスがL個あり長さが0~L-1であるものを構築せよ。ただし頂点数20以下辺の数60以下とする。二重辺を許す。
L<=10^6
考察:
10^6が2^20以下なことからbitをそれぞれの頂点間で表せばよさそうです。
桁DPみたく考えます。
2進数表記で10010000みたいなLがあったとします。
1番上の桁を0とすると残りの桁は自由になります。
したがってある頂点間に2^kと0の枝を張っていきます
一番上の桁1で4番目の桁までを0とすると残りは自由です。
5番目の頂点に向けて2^(一番上の位)の辺を張ります。
こうすることでどこから任意の桁以下を自由にできます。
あとはガチャガチャすれば通ります
D. Worst Case
問題:1からinfまでの順位が2種類ある。最終的な順位は掛け算して小さい順にします。Ai、Bi位を取った参加者より小さい順位の参加者は最大で何人いるか。
考察:
a,b位をとったとして、a*b=cとします。
2種類のコンテストで対称なので1つをx<yとして考えあとで2倍します。
x=1,2・・・としていくと、c^0.5通りあります。c^0.5*(c^0.5+1)>=cのときー1します。
a<bとすると、必ずa<c^0.5より1組減ります。
以上からO(1)で求まります。
E. 高橋君とホテル / Tak and Hotels
問題:ホテルがそれぞれxi座標にn個ある。あるホテルからL以内のホテルまで、1日で移動できる。Q個のクエリ、ホテルaからホテルbまで移動する最小日数を求めよ
考察:
これです。
まずクエリはa<bとできます。
それぞれのホテルから一番右に行ける場所を前計算します。
このパスをaからb以上になるまでたどれば最小日数になります。
これはO(NQ)ですが、1回計算したパスの終着点と長さを記録しておきます。
b昇順でクエリを処理すればO(N+M)になります。
クエリ先読みなんですが、idx:加工クエリと加工クエリ:解の2つのmapをもって、重複に気を付けましょう。もっといいやり方知りたい。