整数MとN要素の数列Aが与えられるので、以下の形のQ個のクエリを順に処理せよ。r]の全要素にxを加算する。その後、同じ区間内にMの倍数が何個あるかを出力する。平方分割に関しては以下のブログがわかりやすい。この問題の場合、分割したあとの上位のバケットに対して、以下の2つの情報を記録しておく必要がある。M)の値が何個存在するか1の方は上記記事の最初に解説されているbucketSumと同じである。2の方はそれぞれの区間でサイズMの配列を持つことで管理する。メモリが心配になるが、Mが小さいので十分収まる。次にクエリの処理について。加算クエリは、区間全体に足せるならsumバケットに足すだけ。区間に一部だけ重なっている場合は、もとの数列の方に直接加算する(このときcountバケットも更新する)。倍数カウントクエリの方は、まず区間全体に重なっているならcountの値を見ればよい。0」であるから、count配列の対応する要素を見るだけでMの倍数の数がわかる。このとき同じ区間のsumの値に注意が必要で、この値はつまり「その区間全体に足されたことになっている数値」であるから、そのぶん見る場所をずらす必要がある。区間に一部だけ重なっている場合は愚直にひとつひとつMで割り切れるか判定していけばよい。「区間に一部だけ重なっている場合の処理」についてはO(sqrt(N))かかる(区間全体の長さが高々sqrt(N)であるため)。後者の処理回数は高々2回(左右のはみだし)であるから、どちらの処理も結局O(sqrt(N))となる。N要素の数列AとM要素の数列Bが与えられる。(1)はてなブログをはじめよう!fluffyowlさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。