Manhattan Minimum Spanning Tree

問題

解法

  • NOTE: ここで述べる解法は基本的に以下の topcoder の記事を参考に分割統治部分を座標圧縮+セグメント木で置き換えたものである.

ナイーブに考えると,全点対でマンハッタン距離を計算して Kruskal 法などの最小全域木を求めるアルゴリズムを適用すればよいと思えるが,この解法では入力の頂点数 \(N\) に対して,枝数が \(O(N^2)\) になってしまう.

実は全点対を考える必要はなくて,マンハッタン距離で最小になる点の間で枝を貼るだけでよい(要証明).この方法によって枝数が \(O(N)\) になり,解法の計算量を \(O(N \log N)\) にすることができる.

ではここからは,ある点 P に対してマンハッタン距離が最短になる点を求める方法を説明する.ある点 P とマンハッタン距離が最短になる点を以下の図のような 8 方向の領域のそれぞれで探索し,その 8 …

more ...

連続する部分列の和の総和

問題

  • 長さ \(N\) の数列 \(A = [a_1, a_2, ..., a_N]\) が与えられる
  • この数列の任意の連続する部分列の和の総和を \(10^9+7\) で割った余りを求めよ

\(A = [1, 2, 3]\) のとき、和は \(1+2+3+(1+2)+(2+3)+(1+2+3)=20\)

制約

  • \(1 \le N \le 10^6\)
  • \(-10^9 \le a_i \le 10^9 (i = 1, ..., N)\)

解法 …

more ...