https://www.acmicpc.net/problem/11659
처음에는 이렇게 풀었다. 그냥 흔히 떠올릴만한 풀이이다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
long n, m;
cin >> n >> m;
long input;
vector<int> v(n);
for (int i = 0; i < n; i++)
{
cin >> input;
v[i] = input;
}
for (int i = 0; i < m; i++)
{
long sum = 0;
long a, b;
cin >> a >> b;
for (int k = a - 1; k <= b - 1; k++)
{
sum += v[k];
}
cout << sum << '\n';
}
return 0;
}
놀랍게도 어찌보면 당연히 시간초과가 뜬다.
m이 엄청 크면 어떻게할건데...
그렇기에 생각한 것이 아예 누적합, 즉 arr[2]면 1부터 2까지의 합
arr[5]면 1부터 5까지의 합을 저장해놓은 배열을 만들어놓고
시작과 끝 인덱스를 받으면 이에 맞는 합을 출력하게 해주었다.
#include <bits/stdc++.h>
using namespace std;
long long dp[100000];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, m;
int start, end;
long long num;
cin >> n >> m;
dp[0] = 0;
for (int i = 1; i <= n; i++)
{
cin >> num;
dp[i] = dp[i-1] + num;
}
for (int i = 0; i < m; i++)
{
cin >> start >> end;
cout << dp[end] - dp[start - 1] << '\n';
}
return 0;
}
'백준 문제풀이 > 실버3' 카테고리의 다른 글
백준 3273번 - 두 수의 합 (0) | 2022.08.18 |
---|---|
백준 1388 - 바닥 장식 (0) | 2022.08.04 |
백준 1213번 - 팰린드롬 만들기 (0) | 2022.07.05 |
백준 14425번 - 문자열 집합 (0) | 2022.06.08 |
백준 2108번 - 통계학 (0) | 2022.06.01 |