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まで移動する最小日数を求めよ

 

 

考察:

Problem - E - Codeforces

 

これです。

まずクエリはa<bとできます。

 

それぞれのホテルから一番右に行ける場所を前計算します。

このパスをaからb以上になるまでたどれば最小日数になります。

 

これはO(NQ)ですが、1回計算したパスの終着点と長さを記録しておきます。

 

b昇順でクエリを処理すればO(N+M)になります。

 

 

 

クエリ先読みなんですが、idx:加工クエリと加工クエリ:解の2つのmapをもって、重複に気を付けましょう。もっといいやり方知りたい。