似た数」の問題とよく似ています。実際同様の解法で解くことができます。TTTTTのようなクエリの場合です。個数」を数えるという問題だと読み替えることにしましょう。考えるというようにします。ここまで整理すると自然に解くことができます。なるものが何個あるか答えよ。点問題史上最難問と名高い問題です。点が適当なのではないかという声も多々上がっています。それはともかくとして、ここまで累積和の感覚を研ぎ澄ませていると、この問題は自然に思えるのではないでしょうか。「条件を満たす区間の個数を数え上げよ」という問題で検討したいこととして累積和しゃくとり法があると思います。詳細は省略しますが、今回の問題はしゃくとり法が使える構造にはなっていません。代わりに累積和を用いて効率良く解くことができます。値を計算したものにピッタリ対応していることがわかります。組の個数を求めよという問題に変換されました。通りあるということになります。中にどの数値が何個あるのかがわかれば上記のようにして集計することができます。用いると簡単に実現できます。二次元累積和ここまでは一次元配列を考えて来ましたが、二次元配列に対して同様のことがしたいケースもあります。下図の長方形区域内の値の総和を高速に求めたい場面を考えます。長方形区間を表しています。図にすると下のようになります。上手く足し引きして、任意の長方形区間を作ることを考えてみましょう。足し引きで実現することができます。つの値を足し引きすることで求めることができます。a[x][y]$と求めることができます。長方形の絵を描いて確認していただけたらと思います。以上をまとめると、実装例として以下のようになるでしょう。5という入力を与えると出力結果は以下のようになります。$84$となっています。計算で求めることもできます。詳しくは以下の記事に記載があります。