The locations of Farmer John‘s N cows (1 <= N <= 500) are described by distinct points in the 2D plane. The cows belong to two different breeds: Holsteins and Guernseys. Farmer John wants to build a rectangular fence with sides parallel to the coordinate axes enclosing only Holsteins, with no Guernseys (a cow counts as enclosed even if it is on the boundary of the fence). Among all such fences, Farmer John wants to build a fence enclosing the maximum number of Holsteins. And among all these fences, Farmer John wants to build a fence of minimum possible area. Please determine this area. A fence of zero width or height is allowable.
The first line of input contains N. Each of the next N lines describes a cow, and contains two integers and a character. The integers indicate a point (x,y) (0 <= x, y <= 1000) at which the cow
is located. The character is H or G, indicating the cow‘s breed. No two cows are located at the same point, and there is always at least one Holstein.
Print two integers. The first line should contain the maximum number of Holsteins that can be enclosed by a fence containing no Guernseys, and second line should contain the minimum area enclosed by such a fence.
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#define rep(i,m,n) for(i=m;i<=n;i++)
#define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define vi vector<int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
#define pii pair<int,int>
#define Lson L, mid, rt<<1
#define Rson mid+1, R, rt<<1|1
const int maxn=1e3+10;
const int dis[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
using namespace std;
ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}
int n,m,k,t,y[maxn],ans[2];
struct node
{
int x,y,z;
bool operator<(const node&p)const
{
if(x==p.x)return z<p.z;
else return x<p.x;
}
}a[maxn];
char b[10];
int main()
{
int i,j;
scanf("%d",&n);
rep(i,0,n-1){
scanf("%d%d%s",&a[i].x,&a[i].y,b);
if(b[0]==‘H‘)a[i].z=1,y[m++]=a[i].y;;
}
sort(a,a+n);
sort(y,y+m);
int num=unique(y,y+m)-y;
rep(i,0,num-1)rep(j,i,num-1)
{
int l=0,r,now=0,flag=-1;
rep(k,0,n-1)
{
if(a[k].y>=y[i]&&a[k].y<=y[j])
{
if(!a[k].z)
{
flag=a[k].z;
if(now>ans[0]||(now==ans[0]&&(r-l)*(y[j]-y[i])<ans[1]))
{
ans[0]=now;
ans[1]=(r-l)*(y[j]-y[i]);
}
now=0,l=0;
}
else
{
if(a[k].x==flag)continue;
now++;
if(l)r=a[k].x;
else l=a[k].x,r=a[k].x;
}
}
}
if(now>ans[0]||(now==ans[0]&&(r-l)*(y[j]-y[i])<ans[1]))
{
ans[0]=now;
ans[1]=(r-l)*(y[j]-y[i]);
}
}
printf("%d\n%d\n",ans[0],ans[1]);
//system("Pause");
return 0;
}