코드
#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 |