A08 - Two Dimensional Sum

atcoder.jp

回答する際の、配列のインデックス指定で混乱した。変数名にもうちょい工夫が必要だったな。

var input = Console.ReadLine()!
    .Split(' ')
    .Select(x => int.Parse(x))
    .ToList();
var H = input[0];
var W = input[1];
var X = new int[H, W];
for (var i = 0; i < H; i++)
{
    input = Console.ReadLine()!
        .Split(' ')
        .Select(x => int.Parse(x))
        .ToList();
    for (var j = 0; j < W; j++)
    {
        X[i, j] = input[j];
    }
}

// 横平方向の累積和を計算
var Z = new int[H + 1, W + 1];
for (var i = 1; i <= H; i++)
{
    for (var j = 1; j <= W; j++)
    {
        Z[i, j] = Z[i, j - 1] + X[i - 1, j - 1];
    }
}

// 縦方向の累積和を計算
for (var j = 1; j <= W; j++)
{
    for (var i = 1; i <= H; i++)
    {
        Z[i, j] = Z[i - 1, j] + Z[i, j];
    }
}

// 問題を読み込む
var Q = int.Parse(Console.ReadLine()!);
var A = new int[Q];
var B = new int[Q];
var C = new int[Q];
var D = new int[Q];
for (var i = 0; i < Q; i++)
{
    input = Console.ReadLine()!
        .Split(' ')
        .Select(x => int.Parse(x))
        .ToList();
    A[i] = input[0];
    B[i] = input[1];
    C[i] = input[2];
    D[i] = input[3];
}

// 答えを求める
for (var i = 0; i < Q; i++)
{
    var answer = Z[C[i], D[i]]
        + Z[A[i] - 1, B[i] - 1]
        - Z[A[i] - 1, D[i]]
        - Z[C[i], B[i] - 1];
    Console.WriteLine(answer);
}