ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 2900번: 프로그램 - C++
    개발/알고리즘 & PS 2024. 8. 27. 01:23

    https://www.acmicpc.net/problem/2900

     

    문제 구현을 그대로 구현하면 답을 얻을 수 있다. 하지만 시간복잡도가 굉장히 커지기 때문에 시간 초과를 받게 된다. something 함수를 호출 하는 과정에서 $O(KN)$, 합을 구하는 과정에서 $O(QN)$의 시간복잡도가 필요하다. 하지만 $N, K, Q$가 최대 $10^6$까지 커질 수 있으니 시간 제한을 만족시킬 수 없다.

    구간 합

    구간의 합은 누적합을 사용하면 $O(1)$에 구할 수 있다. 따라서 누적합을 적용하면 $O(Q)$에 처리가 가능하다.

     

    something 호출

    매번 입력이 주어질 때마다 갱신하면 연산을 여러 번 반복하게 된다. 예를 들어 첫번째 원소는 항상 1씩 증가한다. 따라서 매번 업데이트 하지 말고 각 입력이 주어진 횟수를 저장해 두었다가 한번에 갱신하면 더 빠르게 처리할 수 있다.

     

    #include <iostream>
    #include <map>
    #include <algorithm>
    
    using namespace std;
    
    long long a[1000000];
    
    int main() {
        cin.tie(nullptr);
        cout.tie(nullptr);
        ios_base::sync_with_stdio(false);
    
        int n, k;
        cin >> n >> k;
    
        map<int, int> cache;
        while (k--) {
            int x;
            cin >> x;
            cache[x]++;
        }
    
        for (auto [nxt, cnt] : cache) {
            int i = 0;
            while (i < n) {
                a[i] += cnt;
                i += nxt;
            }
        }
    
        long long sum[n + 1];
        sum[0] = 0;
        for (int i = 1; i <= n; i++)
            sum[i] = sum[i - 1] + a[i - 1];
    
        int m;
        cin >> m;
        while (m--) {
            int l, r;
            cin >> l >> r;
            cout << sum[r + 1] - sum[l] << '\n';
        }
    }

    '개발 > 알고리즘 & PS' 카테고리의 다른 글

    [BOJ] 9344번 : 도로 - C++  (0) 2024.10.06
    [백준] 30022번: 행사 준비 - C++  (0) 2024.09.02
    [백준] 27583번: Hunt the Wumpus - C++  (0) 2024.08.27
    [BOJ] 20365 블로그2 - C++  (0) 2024.04.07
    최소 신장 트리 (MST)  (0) 2024.04.04
YEAHx4