F]競技プログラミングhttps://atcoder.jp/contests/joi2018yo/tasks/joi2018_yo_f解法https://atcoder.jp/contests/joi2018yo/submissions/8137835K番目に小さな整数を愚直に全列挙することを考えてみる。N=2*10^5の場合は無理だが、N=4000なら可能であるため、小課題2は全列挙してL番目を出すことを考える。最大ケースでは全列挙は無理なのでなんらかの方法でL番目を特定するが、これは典型がある。K番目に小さな整数列の中でx以下の数が何個あるか」これを使って二分探索でL番目を特定していく。経験が無いと、まずここまでが厳しいかもしれない。次の問題はcheck(x)の計算である。この問題はO(N)か最悪O(NlogN)くらいではやりたい。あるのが右端Rを全探索して、満たす左端を数え上げるというテクがあるが、こっちの方面で考えてみよう。[?,R]の範囲でK番目に小さい整数がx以下である個数は何個かと言う問題を考える。Kとなり、上記の式を満たすLの個数を数え上げればいい。BITと累積和を使えば以上の問題は解決できる。公式解説では、BITを使っている部分を尺取り法で行っている。確かにRを単調増加させていくと、Lも単調増加していく。BIT解法でも間に合うが尺取り法の方が計算量がいい。F]月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。