(R日目までの累積来場者数) - (L - 1 日目までの累積来場者数)を愚直に実装してみた。
var NQ = Console.ReadLine()! .Split(' ') .Select(x => int.Parse(x)) .ToList(); var N = NQ[0]; var Q = NQ[1]; var A = Console.ReadLine()! .Split(' ') .Select(x => int.Parse(x)) .ToList(); // 質問を読み込む var L = new List<int>(); var R = new List<int>(); for (var j = 0; j < Q; j++) { var LR = Console.ReadLine()! .Split(' ') .Select(x => int.Parse(x)) .ToList(); L.Add(LR[0]); R.Add(LR[1]); } // 累積和を計算 var s = 0; var S = new List<int>(); for (var i = 0; i < N; i++) { s += A[i]; S.Add(s); } for (var j = 0; j < Q; j++) { var l = L[j]; var r = R[j]; var answer = S[r - 1]; if (l - 1 - 1 >= 0) { answer -= S[l - 1 - 1]; } Console.WriteLine(answer); }
解答例の「0 日目の累積来場者数を登録しておく」手法は思いつかなかった。番兵みたいなものか。頭良いな。