Cod sursa(job #467304)

Utilizator Mishu91Andrei Misarca Mishu91 Data 28 iunie 2010 13:59:37
Problema Cadrane Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 2 Marime 1.86 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <cstring>

using namespace std;

#define foreach(V) for(typeof (V).begin() it = (V).begin(); it != (V).end(); ++it)
#define foreach_r(V) for(typeof (V).rbegin() it = (V).rbegin(); it != (V).rend(); ++it) 

const int MAX_N = 100005;

ifstream fin ("cadrane.in");
ofstream fout ("cadrane.out");

int N, Sol = 0, Nx, Ny, X[MAX_N], Y[MAX_N], Cnt[MAX_N];
pair <int, int> C[MAX_N];
set <int> Su, Sd;
vector <int> G[MAX_N];

void citire() {
	fin >> N;

	for(int i = 1; i <= N; ++i) {
		int x, y;
		fin >> x >> y;
		swap(x, y);
		C[i] = make_pair(x, y);

		X[i] = x;
		Y[i] = y;
	}

}

void norm() {
	sort(X+1, X+N+1);
	Nx = unique(X+1, X+N+1)-X-1;

	sort(Y+1, Y+N+1);
	Ny = unique(Y+1, Y+N+1)-Y-1;

	for(int i = 1; i <= N; ++i) {
		int y = lower_bound(Y+1, Y+Ny+1, C[i].second) - Y;
		int x = lower_bound(X+1, X+Nx+1, C[i].first) - X;
		++Cnt[x];

		G[y].push_back(x);
		Su.insert(x);
	}
}

void solve() {
	int s1[MAX_N], s2[MAX_N];


	for(int i = 1; i <= Ny; ++i) {
		foreach(G[i]) {
			Sd.insert(*it);
		}

/*		if(i == 2) {
			for(int i = 1; i <= N; ++i) {
				printf("%d %d\n", i, Cnt[i]);
			}
			foreach(Su) {
				printf("%d ", *it);
			}
			printf("\n");

			foreach(Sd) {
				printf("%d ", *it);
			}
		}
*/		
		memset(s1, 0, sizeof s1);
		memset(s2, 0, sizeof s2);    

        foreach_r(Su) {
			if(it != Su.rbegin()) {
				set <int> :: reverse_iterator it1 = it;
				--it1;
				s1[*it] = s1[*it1] + Cnt[*it1];
			}
		}

		foreach(Sd) {
			if(it != Su.begin()) {
				set <int> :: iterator it1 = it;
				--it1;
				s2[*it] = s2[*it1] + Cnt[*it1];
			}
		}

		int solm = MAX_N;
		for(int j = 1; j <= Nx; ++j)
			if(s1[j] + s2[j] + Cnt[j] < solm) {
				solm = s1[j] + s2[j] + Cnt[j];
			}

		Sol = max(Sol, solm);	

		foreach(G[i]) {
			Su.erase(*it);
		}
	}

	fout << Sol;
}

int main() {
	citire();
	norm();
	solve();
}