難易度評価

難易度を1〜10段階で評価できます。投票はあとから変更・取り消しできます。

難易度(投票) 未投票 (0票)

投票の分布

まだ投票はありません。

  1. Lv.10票
  2. Lv.20票
  3. Lv.30票
  4. Lv.40票
  5. Lv.50票
  6. Lv.60票
  7. Lv.70票
  8. Lv.80票
  9. Lv.90票
  10. Lv.100票

難易度の目安を見る ↗

ログインして難易度を投票

外部サイトへ移動します

リンク先の URL を確認してから開いてください。

別タブで開く

Intersection Floor Sum

作成者 mackerel38

テスター yukimy32

難易度(作成者設定) Lv.7

難易度(投票) 未投票 (0票)

実行時間制限
3 秒
メモリ制限
512 MiB

解説

SiS_i と SjS_j の共通部分に点 (x,y)(x,y) が存在するための条件は、

(j−i)x≤Ai+Aj,(j−i)x≥−(Ai+Aj)(j-i)x\le A_i+A_j,\qquad (j-i)x\ge -(A_i+A_j)

である。よって、 SiS_i と SjS_j の共通部分に含まれる点の xx 座標の最大値は

f(i,j)=Ai+Ajj−if(i, j) = \dfrac{A_i+A_j}{j-i}

である。したがって、求める答えは

∑i=1N−1∑j=i+1N⌊Ai+Ajj−i⌋\sum_{i=1}^{N-1}\sum_{j=i+1}^{N}{\left\lfloor{\dfrac{A_i+A_j}{j-i}}\right\rfloor}

となる。

各組 (i,j)(i, j) について、

⌊Ai+Ajj−i⌋{\left\lfloor{\dfrac{A_i+A_j}{j-i}}\right\rfloor}

は、 k(j−i)≤Ai+Ajk(j-i) \le A_i+A_j を満たす正整数 kk の個数に等しい。

主客転倒より、各整数 kkについて、 k(j−i)≤Ai+Ajk(j-i) \le A_i+A_j を満たす組 (i,j)(i, j) の個数を求め、それらを合計すればよい。

適当な正整数 BB を定め、 kk を k≤Bk \le B と k>Bk \gt B に分けて考える。

  • k≤Bk \le B

    k(j−i)≤Ai+Ajk(j-i) \le A_i+A_j が成り立つことと、区間 [ki−Ai,ki+Ai],[kj−Aj,kj+Aj][ki-A_i, ki+A_i], [kj-A_j, kj+A_j] が共通部分を持つことは同値である。したがって、各 ii に対する区間の両端の値をソートし、共通部分を持つ区間の組の個数を数えれば良い。

    計算量は O(BNlog⁡N)O(BN\log{N}) である。

  • k>Bk \gt B

    このとき、k(j−i)≤Ai+Ajk(j-i) \le A_i+A_j を満たす k>Bk \gt B が存在するならば、 (B+1)(j−i)≤Ai+Aj≤2N(B+1)(j-i) \le A_i+A_j \le 2N が成り立つ。よって、 j−i≤2NB+1j-i \le \dfrac{2N}{B+1} を満たす i,ji, j について考えれば良い。

    i,ji, j に対して条件を満たす k>Bk \gt B の個数は max⁡(0,⌊Ai+Ajj−i⌋−B)\max\left(0,\left\lfloor\frac{A_i+A_j}{j-i}\right\rfloor-B\right) であるので、これらを足せば良い。

    計算量は O(N2B)O\left(\dfrac{N^2}{B}\right) である。

以上より、計算量は O(BNlog⁡N+N2B)O\left(BN\log{N} + \dfrac{N^2}{B}\right) となる。

B=Θ(Nlog⁡N)B = \Theta\left(\sqrt{\dfrac{N}{\log{N}}}\right) とすることで、 O(NNlog⁡N)O(N\sqrt{N\log{N}}) でこの問題を解くことができる。

ユーザー解説

ユーザー解説を書く

ユーザー解説はまだありません。