Cod sursa(job #3125208)

Utilizator dragoncrackCandidatu Mario Luca dragoncrack Data 2 mai 2023 12:06:24
Problema Jocul Flip Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.44 kb
#include <iostream>
#include <algorithm>

using namespace std;

pair <int, int> poz[100005], sol;
int n, frecvColoane[1000005], frecvLinii[1000005], cnt, maxim, coloanePosibile[100005], liniiPosibile[100005], startCol[1000005], finCol[1000005], ant;

int cmp(pair<int, int> a, pair<int, int> b)
{
    if(a.first != b.first)
        return a.first < b.first;
    else
        return a.second < b.second;
}

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> poz[i].first >> poz[i].second;
        frecvColoane[poz[i].first]++;
        frecvLinii[poz[i].second]++;
    }
    sort(poz + 1, poz + n + 1, cmp);
    for(int i = 1; i <= n; i++)
    {
        if(startCol[poz[i].first] == 0)
        {
            startCol[poz[i].first] = i;
            finCol[ant] = i - 1;
            ant = poz[i].first;
        }
    }
    finCol[ant] = n;
    for(int i = 1; i <= 1000000; i++)
    {
        if(maxim < frecvColoane[i])
        {
            maxim = frecvColoane[i];
            cnt = 0;
            coloanePosibile[++cnt] = i;
        }
        else if(maxim == frecvColoane[i])
        {
            coloanePosibile[++cnt] = i;
        }
    }
    maxim = 0;
    int cnt2 = 0;
    for(int i = 1; i <= 1000000; i++)
    {
        if(maxim < frecvLinii[i])
        {
            maxim = frecvLinii[i];
            cnt2 = 0;
            liniiPosibile[++cnt2] = i;
        }
        else if(maxim == frecvLinii[i])
        {
            liniiPosibile[++cnt2] = i;
        }
    }
    int minim = 2 * n + 1;
    int st2, dr2;
    for(int i = 1; i <= cnt; i++)
    {
        for(int j = 1; j <= cnt2; j++)
        {

            int nrMutari = 0;
            bool conditie = false;
            int a = coloanePosibile[i];
            int b = liniiPosibile[j];
            int st = startCol[a];
            int dr = finCol[a];
            while(st <= dr)
            {
                int mid = (st + dr) / 2;
                if(poz[mid].second == b)
                {
                    conditie = true;
                }
                if(poz[mid].second < b)
                {
                    st = mid + 1;
                    st2 = mid + 1;
                }
                else
                {
                    dr = mid - 1;
                    st2 = mid;
                }
            }
            while(st <= dr)
            {
                int mid = (st + dr) / 2;
                if(poz[mid].second == b)
                {
                    conditie = true;
                }
                if(poz[mid].second > b)
                {
                    dr = mid - 1;
                    dr2 = mid - 1;
                }
                else
                {
                    st = mid + 1;
                    dr2 = mid;
                }
            }
            if(conditie)
            {
                nrMutari = frecvColoane[a] + frecvLinii[b] - 2 * (dr2 - st2 + 1);
                nrMutari += (n - nrMutari - (dr2 - st2 + 1)) * 2;
            }
            else
            {
                nrMutari = frecvColoane[a] + frecvLinii[b];
                nrMutari += (n - nrMutari) * 2;
            }
            if(minim > nrMutari)
            {
                minim = nrMutari;
                sol.first = a;
                sol.second = b;
            }
        }
    }
    cout << sol.first << " " << sol.second << " " << minim;
}