Problem: 2057B - Gorilla and the Exam
Language: C++23 (GCC 14-64, msys2)

Previous submission (verdict: Wrong answer on test 2):
#include <iostream>
#include <stdio.h>
#include <string>
#include <stack>
#include <deque>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <set>
#include <queue>
#include <climits>
#include <cstdio>
#include <cmath>
#include<unordered_map>
#include<unordered_set>
#include<list>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef tree<ll, null_type, less<>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

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

#define all(a)   a.begin(),a.end()
#define all_r(a)   a.rbegin(),a.rend()

// bool is_suffix(string a, string b)
// {
//     reverse(a.begin(), a.end());
//     reverse(b.begin(), b.end());

//     for(int i = 0; i < b.size(); i++)
//     {
//         if(a[i] != b[i])
//             return false;
//     }

//     return true;
// }

// bool ispalin(vector<int>& v)
// {
//     for(int i = 0; i < v.size() / 2; i++)
//     {
//         if(v[i] != v[v.size() - i - 1])
//             return false;
//     }

//     return true;
// }



int main(void)
{
    flash();

    int t;
    cin>>t;

    while(t--)
    {
        int n, k;
        cin>>n>>k;

        vector<ll> v(n);
        for(int i = 0; i < n; i++)
            cin>>v[i];

        sort(all(v));

        int mx = 0;
        int mxn = v[0];
        int cnt = 1;
        for(int i = 1; i < n; i++)
        {
            if(v[i] == v[i-1])
                cnt++;
            else
            {
                if(mx < cnt)
                {
                    mx = cnt;
                    cnt = 1;
                    mxn = v[i-1];
                }
            }
        }

        for(int i = 0; i < n && k > 0; i++)
        {
            if(v[i] != mxn)
            {
                v[i] = mxn;
                k--;
            }
        }

        unordered_set<ll> s;
        for(int i = 0; i < n; i++)
        {
            s.insert(v[i]);
        }

        cout<<s.size()<<'\n';
    }
}


Submission (verdict: Accepted):
#include <iostream>
#include <stdio.h>
#include <string>
#include <stack>
#include <deque>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <set>
#include <queue>
#include <climits>
#include <cstdio>
#include <cmath>
#include<unordered_map>
#include<unordered_set>
#include<list>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef tree<ll, null_type, less<>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

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

#define all(a)   a.begin(),a.end()
#define all_r(a)   a.rbegin(),a.rend()

// bool is_suffix(string a, string b)
// {
//     reverse(a.begin(), a.end());
//     reverse(b.begin(), b.end());

//     for(int i = 0; i < b.size(); i++)
//     {
//         if(a[i] != b[i])
//             return false;
//     }

//     return true;
// }

// bool ispalin(vector<int>& v)
// {
//     for(int i = 0; i < v.size() / 2; i++)
//     {
//         if(v[i] != v[v.size() - i - 1])
//             return false;
//     }

//     return true;
// }



int main(void)
{
    flash();

    int t;
    cin>>t;

    while(t--)
    {
        int n, k;
        cin>>n>>k;

        vector<ll> v(n);
        for(int i = 0; i < n; i++)
            cin>>v[i];

        sort(all(v));

        vector<ll> freq = {1};
        for(int i = 1; i < n; i++)
        {
            if(v[i] == v[i-1])
                freq.back()++;
            else
                freq.push_back(1);
        }

        sort(all(freq));

        bool is = false;
        for(int i = 0; i < freq.size(); i++)
        {
            if(freq[i] > k)
            {
                cout<<freq.size() - i<<'\n';
                is = true;
                break;
            }
            
            k -= freq[i];
        }

        if(!is)
            cout<<1<<'\n';
    }
}