백준
백준 11659 - 구간 합 구하기 4
황태건
2023. 7. 15. 15:34
https://www.acmicpc.net/problem/11659
11659번: 구간 합 구하기 4
첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j
www.acmicpc.net
알고리즘보다는 수학 기초 이론에 관련된 문제
매 입력마다 정직하게 반복문으로 합을 구하면 당연히 시간초과가 발생한다.
그래서 위 문제에서는 수열 An을 입력받은 뒤, A1부터 An까지의 합 Sn에 대하여
급수(수열의 합)의 성질 2가지를 활용해 답을 구했다.
1) S(n+1) = Sn + A(n+1)
2) Ai부터 Aj까지의 부분합 Ai+A(i+1)+...+A(j-1)+Aj 를 interval(i,j)라고 할때,
interval(i,j) = Sj - S(i-1)
ex) S5 - S(3-1) = A1+A2+A3+A4+A5 - (A1 + A2) = A3+A4+A5 = interval(i,j)
구현한 코드는 다음과 같다.
int main() {
...
//sum[i] = Si = S(i-1) + Ai
for (int i = 1; i < sum.size(); i++)
sum[i] = sum[i - 1] + v[i - 1];
}
//interval(i,j) = Sj - S(i-1)
int getInterval(const vector<int>& sum, int start, int end) {
return sum[end] - sum[start - 1];
}