Educational Codeforces Round 10 D. Nested Segments

http://codeforces.com/contest/652/problem/D

問題概要

n 個の区間 [Li, Ri] が与えられる。i 番目の区間が含む区間の個数をすべての i に対して求めよ。

解法

BIT を使う。

区間の左端が小さい方から処理していき、処理した区間は削除する。このようにすると、ある区間 [L, R] を処理するとき未処理の区間の左端は必ず L 以上になる。

あとは右端が R 以下の区間の個数が求まればよく、これは BIT で処理できる。 最初に右端に 1 を加算しておき、区間を削除するときに右端に -1 加算すればいい。

具体的な動作は次のスライドを参照。

左端と右端を座標圧縮しないと BIT が使えない。

BIT を unordered_map で動的化させたコードも通るには通ったが 1652 ms も掛かった。

  • 添字が負だとバグるので適当に下駄を履かせる。
  • あらかじめ reserve しておかないと TLE する。

という点に注意。

Educational Codeforces Round 10 D. Nested Segments

BIT に慣れてれば簡単。