[백준] 14427번 수열과 쿼리 15 (C++)

2025. 10. 23. 14:22·Algorithm
728x90

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

 

 

이 문제는 N개의 수열이 존재할때 각 쿼리에 맞는 수행을 하는 문제이다.

 

이 문제에서 2개의 쿼리가 주어진다.

 

1. 인덱스, 요소가 주어지며 인덱스에 대한 값을 요소로 바꾸는 쿼리이다.

2. 현재 수열에서 가장 작은 값의 인덱스를 출력한다. 이때 가장 작은 값이 여러개인 경우 인덱스가 가장 작은 것을 출력한다.

 

이때 수열의 크기는 최대 10만이며 쿼리의 개수도 10만이다 이를 단순하게 완전탐색으로 진행하게 된다면

이는 O(NM)으로 10억이 넘어가며 시간초과가 난다.

 

따라서 시간을 단축할 수 있는 방법을 찾아야 하는데 이때 최소힙이 생각이 났다.

 

나의 방법은 이러한데

초기에 배열을 입력받고 최소힙에 (배열 값, 인덱스)를 넣는다.

 

1번쿼리가 입력된 경우 배열의 값을 변경하고 (변경된 값, 인덱스)를 넣는다.

 

이후 2번 쿼리가 입력된 경우 루트에 있는 값을 꺼내고 그 값의 인덱스를 확인하여 변경된 값과 수열의 인덱스 값과 비교를 한다.

만약 다를 경우 이는 힙에 저장된 값이 이전의 값이므로 꺼내는것을 반복한다.

 

 

정답코드

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
#define endl "\n"
#define MAX 1e9

struct coordinate {
    int x;
    int y;
    int r;
};

int dx[] = {-1, 1, 0, 0, 1, -1, -1, 1};
int dy[] = {0, 0, -1, 1, -1, 1, -1, 1};
int N, M;
int arr[100001];
priority_queue<pii, vector<pii>, greater<pii>> pq;

void solve() {
    for(int i = 0; i < M; i++) {
        int a, b, c;
        cin >> a;

        if(a == 1) {
            cin >> b >> c;

            arr[b] = c;
            pq.push({c, b});
        }
        else {
            int value = pq.top().first;
            int idx = pq.top().second;

            if(arr[idx] != value) {
                while(arr[idx] != value) {
                    pq.pop();
                    value = pq.top().first;
                    idx = pq.top().second;
                }
            }

            cout << idx << endl;
        }
    }
}

void input() {
    cin >> N;

    for(int i = 1; i <= N; i++) {
        cin >> arr[i];
        pq.push({arr[i], i});
    }

    cin >> M;

    solve();
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    input();
}

 

728x90
저작자표시 (새창열림)

'Algorithm' 카테고리의 다른 글

[백준] 3079번 입국심사 (C++)  (1) 2025.10.27
[백준] 10711번 모래성 (C++)  (0) 2025.10.26
[백준] 6209번 제자리 멀리뛰기 (C++)  (0) 2025.10.22
[백준] 21278번 호석이 두 마리 치킨 (C++)  (0) 2025.10.21
[백준] 14585번 사수빈탕 (C++)  (0) 2025.10.20
'Algorithm' 카테고리의 다른 글
  • [백준] 3079번 입국심사 (C++)
  • [백준] 10711번 모래성 (C++)
  • [백준] 6209번 제자리 멀리뛰기 (C++)
  • [백준] 21278번 호석이 두 마리 치킨 (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (279)
      • Programming (47)
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (3)
        • Android (2)
        • CI,CD (1)
      • Algorithm (173)
        • Review (4)
      • Security (14)
        • WebHacking (3)
        • Websecurity (11)
      • OS (19)
        • Linux (12)
        • Mac os (2)
      • 머신러닝 (1)
      • CS(Computer Science) (12)
        • 컴퓨터 네트워크 (3)
        • 컴퓨터 구조 (1)
        • 인공지능 (8)
      • Docker (1)
      • Dev Book Review (3)
        • Clean Code (1)
        • Effective Java (0)
        • Real MySQL (2)
      • SWM (1)
      • Review (6)
      • AWS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백트래킹
    BFS
    DFS
    정렬
    우선순위큐
    c언어
    WebSecurity
    이분탐색
    그래프 이론
    트리
    깊이우선탐색
    브루트포스
    다이나믹 프로그래밍
    투포인터
    재귀
    비트마스킹
    누적합
    linux
    시뮬레이션
    wargame
    에라토스테네스의 체
    Leviathan
    백준
    구현
    다익스트라
    우선순위 큐
    DP
    코딩
    Bandit
    그리디
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 14427번 수열과 쿼리 15 (C++)
상단으로

티스토리툴바