Cod sursa(job #467296)

Utilizator savimSerban Andrei Stan savim Data 28 iunie 2010 13:54:28
Problema Cadrane Scor 20
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 2 Marime 2.32 kb
#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;
}