πŸ™‡β€β™€οΈ[Silver I] μˆ˜μ—΄ - 13274

문제 링크

μ„±λŠ₯ μš”μ•½

λ©”λͺ¨λ¦¬: 3592 KB, μ‹œκ°„: 52 ms

λΆ„λ₯˜

μ •λ ¬

제좜 일자

2024λ…„ 6μ›” 11일 15:35:34

문제 μ„€λͺ…

μ§€ν›ˆμ΄λŠ” μˆ˜μ—΄μ„ μ’‹μ•„ν•œλ‹€. μ§€κΈˆ μ§€ν›ˆμ΄λŠ” size κ°€ N 인 μˆ˜μ—΄μ„ 가지고 놀고 μžˆλ‹€. μ§€ν›ˆμ΄λŠ” K 개의 쿼리에 따라 μˆ˜μ—΄μ„ λ³€ν™”μ‹œν‚¬ 것인데, 쿼리의 ν˜•μ‹ 및 μž‘μ—… 과정은 λ‹€μŒκ³Ό κ°™λ‹€.

  • L R X : μˆ˜μ—΄μ„ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œ κ²°κ³Όλ₯Ό A[1], A[2], … , A[N]이라 ν•˜μž. μš°μ„  A[L], A[L+1], … , A[R]에 X 만큼 λ”ν•œλ‹€. κ·Έ κ²°κ³Ό μˆ˜μ—΄μ„ λ‹€μ‹œ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œλ‹€.

쿼리듀을 μˆœμ„œλŒ€λ‘œ λͺ¨λ‘ μˆ˜ν–‰ν•œ ν›„μ˜ μˆ˜μ—΄μ„ 좜λ ₯ν•˜λΌ.

μž…λ ₯

첫째 쀄에 N κ³Ό K κ°€ λ„μ–΄μ“°κΈ°λ‘œ κ΅¬λΆ„λ˜μ–΄ 주어진닀. (1 ≀ N ≀ 100000, 1 ≀ K ≀ 1000)

λ‘˜μ§Έ 쀄에 μ ˆλŒ“κ°’μ΄ 1018 μ΄ν•˜μΈ, μˆ˜μ—΄μ„ μ΄λ£¨λŠ” N 개의 μ •μˆ˜κ°€ 주어진닀.

μ…‹μ§Έ 쀄뢀터 K+2 번째 μ€„κΉŒμ§€ 쿼리 L R X κ°€ 주어진닀. (1 ≀ L ≀ R ≀ N, |X| ≀ 109)

좜λ ₯

쿼리듀을 μˆœμ„œλŒ€λ‘œ λͺ¨λ‘ μˆ˜ν–‰ν•œ ν›„μ˜ μˆ˜μ—΄μ„ 좜λ ₯ν•œλ‹€.

πŸš€ν’€μ΄

문제의 μš”κ±΄λŒ€λ‘œ μž‘μ—…μ„ ν•˜λ©΄ μ‹œκ°„ μ΄ˆκ³Όκ°€λ‚©λ‹ˆλ‹€.

κ·Έλž˜μ„œ μƒˆλ‘œμš΄ λ°©λ²•μœΌλ‘œ λˆ„μ ν•©μ„ κ³„μ‚°ν•΄μ€˜μ•Όν•©λ‹ˆλ‹€.

μ²˜μŒμ— μˆ˜μ—΄μ„ μ •λ ¬ν•©λ‹ˆλ‹€.
ꡬ간 λ³€κ²½ 관리: 각 쿼리에 λŒ€ν•΄ ꡬ간에 더할 값을 κΈ°λ‘ν•©λ‹ˆλ‹€.
λˆ„μ  ν•© 적용: λ§ˆμ§€λ§‰μ— λˆ„μ  합을 μ μš©ν•˜μ—¬ μ΅œμ’… κ²°κ³Όλ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.

μ•„λž˜ μ½”λ“œμ—μ„œ μœ„ ꡬ간 λ³€κ²½ 관리λ₯Ό ν•˜λŠ” 뢀뢄은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

// 각 쿼리에 λŒ€ν•΄ 처리
for (int i = 0; i < K; ++i) 
{
    int L, R;
    long long X;
    cin >> L >> R >> X;
    L--; R--; // 1λΆ€ν„° μ‹œμž‘ν•˜λŠ” 인덱슀λ₯Ό 0λΆ€ν„° μ‹œμž‘ν•˜λŠ” 인덱슀둜 λ³€ν™˜

    // delta 배열에 ꡬ간 λ³€κ²½ 사항 기둝
    delta[L] += X;
    if (R + 1 < N) 
    {
        delta[R + 1] -= X;
    }
}

delta[R + 1] -= X;을 ν•΄μ€ŒμœΌλ‘œμ¨ ꡬ간합이 λλ‚¬μŒμ„ μ•Œλ¦½λ‹ˆλ‹€.

μ‹€μ œ μ μš©μ€ λ‹€μŒκ³Ό 같이 ν•©λ‹ˆλ‹€.

// λˆ„μ  ν•© 계산 및 적용
long long cumulative = 0;
for (int i = 0; i < N; ++i) 
{
    cumulative += delta[i];
    arr[i] += cumulative;
}

λ³€ν™”λŸ‰μ΄ 계속 κΈ°λ‘λ˜μ–΄ μžˆμœΌλ―€λ‘œ 문제의 μš”κ±΄μ— μ„±λ¦½ν•˜μ—¬ λ™μž‘ν•©λ‹ˆλ‹€.

κ·Έ ν›„ μ΅œμ’…μ μœΌλ‘œ 정렬을 ν•˜λ©΄ μ›ν•˜λŠ” 좜λ ₯값이 λ‚˜μ˜΅λ‹ˆλ‹€.

image

πŸš€μ½”λ“œ

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>
#include <climits>

using namespace std;

void solve()
{
    int N, K;
    cin >> N >> K;

    vector<long long> arr(N);
    for (int i = 0; i < N; ++i) 
    {
        cin >> arr[i];
    }

    // μˆ˜μ—΄ μ •λ ¬
    sort(arr.begin(), arr.end());

    // λˆ„μ  λ³€ν™”λŸ‰μ„ μ €μž₯ν•  λ°°μ—΄
    vector<long long> delta(N + 1, 0);

    // 각 쿼리에 λŒ€ν•΄ 처리
    for (int i = 0; i < K; ++i) 
    {
        int L, R;
        long long X;
        cin >> L >> R >> X;
        L--; R--; // 1λΆ€ν„° μ‹œμž‘ν•˜λŠ” 인덱슀λ₯Ό 0λΆ€ν„° μ‹œμž‘ν•˜λŠ” 인덱슀둜 λ³€ν™˜

        // delta 배열에 ꡬ간 λ³€κ²½ 사항 기둝
        delta[L] += X;
        if (R + 1 < N) 
        {
            delta[R + 1] -= X;
        }
    }

    // λˆ„μ  ν•© 계산 및 적용
    long long cumulative = 0;
    for (int i = 0; i < N; ++i) 
    {
        cumulative += delta[i];
        arr[i] += cumulative;
    }

    // μ΅œμ’… μˆ˜μ—΄μ„ λ‹€μ‹œ μ •λ ¬
    sort(arr.begin(), arr.end());

    // μ΅œμ’… κ²°κ³Ό 좜λ ₯
    for (int i = 0; i < N; ++i) 
    {
        cout << arr[i] << " ";
    }
    cout << '\n';
}

int main()
{
	FILE* stream;
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	freopen_s(&stream, "input.txt", "rt", stdin);

	solve();

	return 0;
}

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ: