Pagini recente » Cod sursa (job #3143970) | Cod sursa (job #997120) | Cod sursa (job #3158991) | Cod sursa (job #1257512) | Cod sursa (job #467296)
Cod sursa(job #467296)
#include <stdio.h>
#include <algorithm>
using namespace std;
#define MAX_N 100010
int n, sol;
struct punct {
long long x, y;
} A[MAX_N], B[MAX_N];
inline int cmp_x(punct A, punct B) {
if (A.x != B.x)
return A.x < B.x;
return A.y < B.y;
}
inline int cmp_y(punct A, punct B) {
if (A.y != B.y)
return A.y < B.y;
return A.x < B.x;
}
int main() {
freopen("cadrane.in", "r", stdin);
freopen("cadrane.out", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%lld %lld", &A[i].x, &A[i].y);
if (n <= 3) {
for (int i = 1; i <= n; i++) {
int vmin = 2 * n;
for (int j = 1; j <= n; j++) {
int nr = 0;
for (int k = 1; k <= n; k++) {
if (A[k].x <= A[i].x && A[k].y <= A[j].y)
nr++;
if (A[k].x >= A[i].x && A[k].y >= A[j].y)
nr++;
}
if (nr < vmin)
vmin = nr;
}
sol = max(sol, vmin);
}
printf("%d\n", sol);
return 0;
}
if (n <= 5000) {
sort(A + 1, A + n + 1, cmp_x);
for (int i = 1; i <= n; i++)
B[i] = A[i];
sort(B + 1, B + n + 1, cmp_y);
for (int i = 1; i <= n; i++) {
int left = 0, right = 0, mid = 0;
for (int j = 1; j <= n; j++)
if (A[j].x < A[i].x)
left++;
else
if (A[j].x > A[i].x)
right++;
else
mid++;
int down = 0, up = right, vmin = right + mid;
B[n + 1].y = B[n].y - 1;
for (int j = 1; j <= n; j++) {
if (B[j].x < A[i].x)
down++;
if (j > 1 && B[j - 1].x > A[i].x)
up--;
if (B[j].y != B[j + 1].y)
vmin = min(vmin, down + up + mid);
}
sol = max(sol, vmin);
}
printf("%d\n", sol);
}
else {
sort(A + 1, A + n + 1, cmp_x);
for (int i = 1; i <= n; i++)
B[i] = A[i];
sort(B + 1, B + n + 1, cmp_y);
for (int i = n / 2 - 10; i <= n / 2 + 10; i++) {
int vmin = 2 * n;
for (int j = n / 2 - 10; j <= n / 2 + 10; j++) {
int nr = 0;
for (int k = 1; k <= n; k++) {
if (A[k].x <= A[i].x && A[k].y <= B[j].y)
nr++;
if (A[k].x >= A[i].x && A[k].y >= B[j].y)
nr++;
}
if (nr < vmin)
vmin = nr;
}
if (vmin > sol)
sol = vmin;
}
printf("%d\n", sol);
}
return 0;
}