문제링크 : https://www.acmicpc.net/problem/17390
17390번: 이건 꼭 풀어야 해!
[2, 5, 1, 4, 3]을 비내림차순으로 정렬하면 [1, 2, 3, 4, 5]이다.
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
int N, Q, arr[300001];
int L, R;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N >> Q;
for(int i=1; i<=N; i++) cin >> arr[i];
sort(arr+1, arr+N+1); //비내림차순 정렬
for(int i=1; i<=N; i++) arr[i]+=arr[i-1]; //누적합
while(Q--)
{
cin >> L >> R;
cout << arr[R] - arr[L-1] << "\n";
}
}
이중 반복문(O(QN))으로 풀면 시간초과가 나기에 누적합을 응용하여 푼 문제이다.
수열을 입력받고 비내림차순 정렬을 먼저 해준 이후에 누적합을 구해준다.
우리가 구하고자하는 것은 L~R의 일정 구간의 합이므로, R까지의 합 - (L-1)까지의 합을 구해주면 된다.
<2, 4>
(1+2+3+4) - (1)
<3, 4>
(1+2+3+4) - (1+2)
'백준 > 실버' 카테고리의 다른 글
[백준 9711번] 피보나치 (C++) (0) | 2024.02.07 |
---|---|
[백준 1402번] 아무도이문제는A번난이도인것같다 (C++) (0) | 2024.02.05 |
[백준 19939번] 박 터뜨리기 (C++) (0) | 2024.02.01 |
[백준 5347번] LCM (C++) (0) | 2024.01.31 |
[백준 2635번] 수 이어가기 (C++) (0) | 2024.01.30 |