코드
#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;
}
풀이
화려한 마을3과 같은 풀이이다. 다만 차이를 찾아보자면, 화려한 마을2는 "집의 번호가 증가한다면 어두워지지 않는 방향으로 페인트를 칠하였다."라는 조건이 있다. 해당 조건이 있다면 Mo's를 사용하지 않고 일반 세그먼트 트리로 해결할 수 있다고 한다. 다만 본인은 업데이트 과정이 따로 없기 때문에 오프라인 방식을 채택했다.
'백준' 카테고리의 다른 글
[백준] 2912번 백설공주와 난쟁이 C++ 코드 (0) | 2024.12.01 |
---|---|
[백준] 16978번 수열과 쿼리 22 C++ 코드 (2) | 2024.12.01 |
[백준] 12999번 화려한 마을3 C++ 코드 (0) | 2024.12.01 |
[백준] 2150번 Strongly Connected Component C++ 코드 (2) | 2024.11.14 |
[백준] 1275번 커피숍2 C++ 코드 (1) | 2024.11.11 |