torus711 のアレ

主に競技プログラミングの問題について書きます.PC 以外だと数式が表示されないかもしれないです

AtCoder Beginner Contest 181, B : Trapezoid Sum

問題概要

 $N$ 個の正整数の対 $( A_i, B_i )$ が与えられる.$\sum_{ i = 1 }^N \sum_{ j = A_i }^{ B_i } j$ を求めよ.

制約

  • $1 \leq N \leq 10^5$
  • $1 \leq A_i \leq B_i \leq 10^6$

解法

 ぐぐったりすると分かりますが,$1$ ~ $x$ の和 $s( x )$ は $s( x ) = \frac{ x ( x + 1 ) } 2$ で求まります.これを使うと,$a$ ~ $b$ の和は $s( b ) - s( a - 1 )$ と求まります.よって,各 $i$ についてこの値を計算して足し合わせることで答えが求まります.
 計算量としては $\Theta( N )$ となります.

コード

main = do
	n <- readInt
	[ as, bs ] <- transpose <$> replicateM n readIntegers
	print $ sum ( map s bs ) - sum ( map s ( map pred as ) )

s x = x * ( x + 1 ) `div` 2