Link bài ạ: Problem - 1676F - Codeforces
int main()
{
int num, n, k;
cin >> num;
for (int i = 0; i < num; i++)
{
cin >> n >> k;
map<int, int> cnt;
cnt[3e8] = 0;
for (int j = 0; j < n; j++)
{
int x;
cin >> x;
cnt[x]++;
}
bool broken = true;
int l = -1, r = -1;
int ans_l = -1, ans_r = -1, tracker;
int curr = numeric_limits<int>::min();
for (auto& p : cnt)
{
if (broken)
tracker = p.first;
if (p.second >= k && tracker == p.first)
{
if (broken)
{
l = p.first;
r = p.first;
tracker = l;
}
else
r = p.first;
broken = false;
}
else
{
if (!broken)
{
int diff = r - l;
if (diff > curr)
{
curr = diff;
ans_l = l;
ans_r = r;
}
}
broken = true;
}
tracker++;
}
//cout << "->";
if (ans_l == -1)
cout << -1;
else
cout << ans_l << " " << ans_r;
cout << endl;
cnt.clear();
}
return 0;
}
Ý tưởng của em là đếm tần suất của mỗi số bằng ordered map và tìm các khoảng thỏa đề bài bằng ngắt(khi tracker tăng dần nhưng không bằng giá trị hiện tại hoặc khi gặp 1 số không có tần số >=k). Sau đó, tìm khoảng rộng nhất.
Kết quả: 1, Thuật toán em chạy 2.