Pagini recente » Cod sursa (job #2543734) | Cod sursa (job #1646716) | Cod sursa (job #729115) | Cod sursa (job #2678455) | Cod sursa (job #3125208)
#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;
}