B06 - Lottery

atcoder.jp

アタリとハズレの累積和をそれぞれ計算しておく。0 番目の累積和として 0 を追加しておくテクニックを使ってみた。

var N = int.Parse(Console.ReadLine()!);
var A = Console.ReadLine()!.Split(' ').Select(x => int.Parse(x)).ToList();
var Q = int.Parse(Console.ReadLine()!);
var L = new List<int>();
var R = new List<int>();
for (var i = 0; i < Q; i++)
{
    var lr = Console.ReadLine()!.Split(' ').Select(x => int.Parse(x)).ToList();
    L.Add(lr[0]);
    R.Add(lr[1]);
}

// 番兵(?)として 0 を登録しておく
var SW = new List<int>() { 0 };
var SL = new List<int>() { 0 };
for (var i = 0; i < N; i++)
{
    if (A[i] == 1)
    {
        SW.Add(SW[i] + 1);
        SL.Add(SL[i]);
    }
    else
    {
        SW.Add(SW[i]);
        SL.Add(SL[i] + 1);
    }
}

for (var i = 0; i < Q; i++)
{
    var win = SW[R[i]] - SW[L[i] - 1];
    var lose = SL[R[i]] - SL[L[i] - 1];
    if (win > lose)
    {
        Console.WriteLine("win");
    }
    else if (win == lose)
    {
        Console.WriteLine("draw");
    }
    else
    {
        Console.WriteLine("lose");
    }
}