[백준] 12999번 화려한 마을3 C++ 코드

2024. 12. 1. 16:33· 백준
목차
  1. 코드
  2. 풀이

코드

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;

struct Query {
    int L, R, idx;
};

const int MAX_N = 100003;
int n, q, max_cnt = 0;
int arr[MAX_N], freq[200003], cnt[MAX_N];
vector<Query> queries;
vector<int> res;

void add(int x) {
    cnt[freq[x]]--;         // 현재 빈도 감소
    freq[x]++;              // 값의 빈도 증가
    cnt[freq[x]]++;         // 증가한 빈도 반영
    max_cnt = max(max_cnt, freq[x]); // 최대 빈도 갱신
}

void remove(int x) {
    cnt[freq[x]]--;         // 현재 빈도 감소
    if (freq[x] == max_cnt && cnt[freq[x]] == 0) {
        max_cnt--;          // 최대 빈도 감소
    }
    freq[x]--;              // 값의 빈도 감소
    cnt[freq[x]]++;         // 감소한 빈도 반영
}

void FASTIO() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}

int main() {
    FASTIO();
    cin >> n >> q;

    for (int i = 0; i < n; i++) {
        cin >> arr[i];
        arr[i] += 100000; // 음수 값 처리
    }

    int block_size = sqrt(n);
    queries.resize(q);
    res.resize(q);

    for (int i = 0; i < q; i++) {
        cin >> queries[i].L >> queries[i].R;
        queries[i].L--; // 0-based 인덱스로 변환
        queries[i].R--; // 0-based 인덱스로 변환
        queries[i].idx = i;
    }

    // Mo's Algorithm에 맞게 쿼리 정렬
    sort(queries.begin(), queries.end(), [block_size](Query a, Query b) {
        if (a.L / block_size != b.L / block_size) 
            return a.L / block_size < b.L / block_size;
        return a.R < b.R;
    });

    int currentL = 0, currentR = -1;
    for (int i = 0; i < q; i++) {
        int L = queries[i].L;
        int R = queries[i].R;

        while (currentR < R) add(arr[++currentR]);
        while (currentR > R) remove(arr[currentR--]);
        while (currentL < L) remove(arr[currentL++]);
        while (currentL > L) add(arr[--currentL]);

        res[queries[i].idx] = max_cnt;
    }

    for (int i = 0; i < q; i++) {
        cout << res[i] << '\n';
    }

    return 0;
}

풀이

업데이트 없이 쿼리를 구하는 것만 있으므로 오프라인 쿼리를 사용하는 것이 유리하다. Mo's를 이용해서 해결했다. 몇 번 나오는지 확인하는 freq배열과 개수를 기록한 cnt 배열을 이용해서 최대값을 조절하며 구하면 된다. 주의할 점은 freq배열을 unordered_map으로 변경하면 시간이 늘어난다. 배열과 해시의 차이로 인해 시간초과에 걸릴 수 있으니 주의!

'백준' 카테고리의 다른 글

[백준] 16978번 수열과 쿼리 22 C++ 코드  (2) 2024.12.01
[백준] 12986번 화려한 마을2 C++ 코드  (0) 2024.12.01
[백준] 2150번 Strongly Connected Component C++ 코드  (2) 2024.11.14
[백준] 1275번 커피숍2 C++ 코드  (1) 2024.11.11
[백준] 1946번 신입 사원 C++ 코드  (0) 2024.11.11
  1. 코드
  2. 풀이
'백준' 카테고리의 다른 글
  • [백준] 16978번 수열과 쿼리 22 C++ 코드
  • [백준] 12986번 화려한 마을2 C++ 코드
  • [백준] 2150번 Strongly Connected Component C++ 코드
  • [백준] 1275번 커피숍2 C++ 코드
Melon Man
Melon Man
Hello World
Melon Man
제발 CPU는 집에서 만들어 씁시다
Melon Man
전체
오늘
어제
  • 분류 전체보기 (644)
    • 직접 만들어 보기 (2)
    • 가내공업 (2)
    • HTML (0)
    • CSS (4)
    • JAVASCRIPT (51)
    • TYPESCRIPT (14)
    • NODE.JS (19)
    • REACT (7)
    • NEXT.JS (1)
    • REACT NATIVE (5)
    • REDUX (2)
    • PYTHON (17)
    • 자료구조 및 알고리즘 (35)
    • 컴퓨터 구조 (9)
    • 운영체제 (7)
    • NETWORK (3)
    • CodeUp 기본 100제 - Python (98)
    • 잡지식 (1)
    • 백준 (347)
    • SWEA (0)
    • GIT (4)
    • C (2)
    • C++ (11)
    • JAVA (2)
    • 객체지향프로그래밍 (0)
    • 정보처리기사 (1)
    • 프로그래머스_SQL (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 함수
  • event
  • 표준내장객체
  • 알고리즘
  • C++
  • input
  • 입출력
  • 입문
  • 정렬
  • 백준
  • 초보
  • Node
  • TypeScript
  • python
  • BFS
  • 파이썬
  • 운영체제
  • 다익스트라 알고리즘
  • mdn
  • React
  • 자바스크립트
  • 자료구조
  • CodeUp
  • 유니온 파인드
  • 코드업
  • javascript
  • 기초
  • standard built-in object
  • node.js
  • 위상정렬

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.3.0
Melon Man
[백준] 12999번 화려한 마을3 C++ 코드
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.