Official
B - 本棚の蔵書調査 / Library Book Survey on the Bookshelf Editorial
by
B - 本棚の蔵書調査 / Library Book Survey on the Bookshelf Editorial
by
physics0523
累積和を用いてこの問題に正解できます。
まず、予め \(S_k=A_1+A_2+\dots+A_k\) を計算しておきます。これは時間計算量 \(O(N)\) で実現できます。
その後、クエリ \((L_i,R_i)\) について \(S_{R_i}-S_{L_i-1}\) の値が \(A_{L_i}+A_{L_i+1}+\dots+A_{R_i}\) となります。
このことは \(S\) の定義から計算すると分かります。クエリ当たり時間計算量 \(O(1)\) で計算可能です。
実装例 (C++):
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
int main(){
ll N,Q;
cin >> N >> Q;
vector<ll> A(N+1,0);
for(ll i=1;i<=N;i++){
cin >> A[i];
A[i]+=A[i-1];
}
while(Q--){
ll L,R;
cin >> L >> R;
cout << A[R]-A[L-1] << "\n";
}
return 0;
}
posted:
last update:
