AtCoder ABC 177の復習
前回の続き
177のC問題ができなかったので、解説を見て再実装しました。
C - Sum of product of pairs
実際にTLEとなった実装は以下
n=int(input()) sum=0 a=list(map(int, input().split())) for i in range(n): for j in range(i+1, n): #print(i,j) sum+=a[i]*a[j] sum = sum%((10**9)+7) print(sum)
解き始め当初は、
あーどう考えてもO(n**2)やん、どうすればいいの・・・と頭が固ーくなってました。
配列の前後の数値を使ってみたり、pypy使ってみたりと小手先の手法を色々試しましたが当然ダメでした。
解説を見て、先に合計値を計算してから順に当てはめていくことを試すと、サクッと解けました
うーん、これはきちんと紙に書いて自分でひらめくべきだった・・・。
n=int(input()) sums=0 a=list(map(int, input().split())) b = sum(a) for i in range(n): b -= a[i] sums += a[i]*b sums = sums%((10**9)+7) print(sums)
やっぱりじっくり腰を据えてやる時間が欲しいなぁ
それから、D, E, F問題の解説を一応確認しておきます。
アルゴリズムの名前だけでも知っておきたいから・・・。
D...Union-Findを用いて解ける問題
E...高速素因数分解、およびエラトステネスの篩を用いて解ける問題
F...セグメント木、順序集合を用いて解ける問題
エラトステネスの篩は後ほど実装したい!
以上。