less than 1 minute read

문제 접근

N과 똑같은 길이의 배열을 하나 더 만듭니다.
명령들을 한번에 수행하기 의하여 누적합 알고리즘을 이용합니다.
{0,0,0,0,0} 1 ~ 5까지 3만큼을 덮으라고 명령합니다. {3,0,0,-3,0} 이렇게 해줍니다. 이유는 다음과 같습니다.
누적합을 사용하면

{3,3,3,0,0}

이런식으로 되겠죠.

코드

#include <bits/stdc++.h> 
#define ll long long
using namespace std;


int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int n, m; cin >> n >> m;
    vector<int> v(n + 1, 0);
    for (int i = 1; i <= n; i++)
        cin >> v[i];
    vector<int> com(n + 2, 0);
    int a, b, h;
    for (int i = 0; i < m; i++)
    {
        cin >> a >> b >> h;
        com[a] += h;
        com[b + 1] -= h;
    }
    for (int i = 1; i <= n; i++)
        com[i] = com[i] + com[i - 1];
    for (int i = 1; i <= n; i++)
    {
        cout << v[i] + com[i] << " ";
    }
    return  0;
}

Leave a comment