Cod sursa(job #467267)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 28 iunie 2010 13:41:09
Problema Cadrane Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 2 Marime 1.57 kb
#include <stdio.h>
#include <algorithm>
#define NMAX 100005
using namespace std;
int n,rez=0;
struct pct
{
	int x,y;
};
pct A[NMAX],B[NMAX];
inline int min(int x,int y)
{
	return x<y ? x : y;
}
inline int max(int x,int y)
{
	return x>y ? x : y;
}
void read()
{
	scanf("%d",&n);
	int i;
	scanf("%d%d",&A[1].x,&A[1].y);
	B[1].x=A[1].x; B[1].y=A[1].y;
	for (i=2; i<=n; i++)
	{
		scanf("%d%d",&A[i].x,&A[i].y);
		B[i].x=A[i].x; B[i].y=A[i].y;
	}
}
bool comp(pct a,pct b)
{
	if (a.y<b.y)
		return 1;
	if (a.y>b.y)
		return 0;
	return 0;
}
bool comp2(pct a,pct b)
{
	if (a.x<b.x)
		return 1;
	if (a.x>b.x)
		return 0;
	return 0;
}
void solve1()
{
	int i,j,axa_y,act,axa_x,poz,count,nr,nr2;
	for (i=1; i<=n; i++)
	{
		if (i==1 || A[i].y!=A[i-1].y)
		{
			axa_y=A[i].y;
			axa_x=B[1].x; poz=0; count=0; nr=0;
			while (B[poz+1].x==axa_x && poz+1<=n)
			{
				poz++;
				if (B[poz].y>axa_y)
					nr++;
			}
			count=poz;
			for (j=poz+1; j<=n; j++)
				if (B[j].y>=axa_y)
					count++;
			act=count;
			while (poz+1<=n)
			{
				axa_x=A[poz+1].x;
				count-=nr; 
				nr=0; nr2=0;
				while (A[poz+1].x==axa_x && poz+1<=n)
				{
					poz++; 
					if (A[poz].y<axa_y)
						nr2++;
					if (A[poz].y>axa_y)
						nr++;
				}
				count+=nr2;
				act=min(act,count);
			}
			rez=max(rez,act);
		}
	}
}
int main()
{
	freopen("cadrane.in","r",stdin);
	freopen("cadrane.out","w",stdout);
	read();
	sort(A+1,A+n+1,comp);
	sort(B+1,B+n+1,comp2);
	if (n<=10000)
	{
		solve1();
		printf("%d\n",rez);
		return 0;
	}
	return 0;
}