본문으로 바로가기

[백준 11659] 구간 합 구하기 4

category PS/백준 문제풀이 2019. 8. 7. 18:17
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 

 

문제 : https://www.acmicpc.net/problem/11659

 

11659번: 구간 합 구하기 4

첫째 줄에 수의 개수 N (1 ≤ N ≤ 100,000), 합을 구해야 하는 횟수 M (1 ≤ M ≤ 100,000)이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j가 주어진다.

www.acmicpc.net


2019/08/07 - [PS/Tip] - [C++/STL] 부분 합 partial_sum( )

 

 

[C++/STL] 부분 합 partial_sum( )

특정 구간의 합을 O(1)에 구하고 싶을 때, 부분 합(partial sum)을 미리 구해놓으면 가능하다. 부분 합은 다음과 같다. i 0 1 2 3 4 v 1 2 3 4 5 psum 1 3 6 10 15 자 이제 여기서 특정 구간의 합만 구하는 방법은..

hyeonnii.tistory.com

위에 설명되어 있는 partial_sum( )을 이용하면 쉽게 구할 수 있다.

마지막 출력할 때 endl을 사용하면 시간 초과 뜬다.

그렇기 때문에 '\n' 으로 개행을 해준다.

 

 

#include <iostream>
#include <numeric>
#include <vector>
using namespace std;

int n, m;
vector<int> ori;
vector<int> ps;

int getRange(int s, int e){
    if(s == 0) return ps[e];
    return ps[e] - ps[s-1];
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    cin >> n >> m;
    ori.resize(n);
    ps.resize(n);
    
    for(int i = 0; i < n; i++)
        cin >> ori[i];
    
    partial_sum(ori.begin(), ori.end(), ps.begin());
    
    int s, e;
    for(int i = 0; i < m; i++){
        cin >> s >> e;
        cout << getRange(s-1, e-1) << '\n';
    }
    
    return 0;
}

 

 

 

 

'PS > 백준 문제풀이' 카테고리의 다른 글

[백준 16139] 인간-컴퓨터 상호작용  (0) 2019.08.07
[백준 17203] ∑|ΔEasyMAX|  (0) 2019.08.07
[백준 1562] 계단 수  (0) 2019.08.06
[백준 1102] 발전소  (0) 2019.08.06
[백준 11723] 집합  (0) 2019.08.06