首页 > 代码库 > POJ 2398

POJ 2398

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int Max=1050;struct e{	int x1,x2;}edge[Max];struct c{	int x,y;}cal[4];int n,m;int X1,Y1,X2,Y2;int ans[Max],co[Max];int u,v;bool cmp(struct e A,struct e B){	if(A.x1<B.x1) return true;	return false;}void init(){	for(int i=0;i<=n;i++){		ans[i]=0; co[i]=0;	}}bool in(){	if(u>=X1&&u<=X2&&v>=Y2&&v<=Y1)	return true;	return false;}__int64 multi(int i){	int j=i+1;	if(j==4) j=0;	return (__int64)(u-cal[i].x)*(__int64)(cal[j].y-cal[i].y)-(__int64)(v-cal[i].y)*(__int64)(cal[j].x-cal[i].x);}bool judge(int mid){	__int64 pre,now;	cal[0].x=edge[mid].x1; cal[0].y=Y1;	cal[1].x=X2; cal[1].y=Y1;	cal[2].x=X2; cal[2].y=Y2;	cal[3].x=edge[mid].x2; cal[3].y=Y2;	for(int i=0;i<4;i++){		now=multi(i);		if(i>0){			if(pre*now<0)			return false;		}		pre=now;	}	return true;}void slove(){	int low=0,high=n;	int anst;	while(low<=high){		int mid=(low+high)/2;		if(judge(mid)){			anst=mid; low=mid+1;		}		else high=mid-1;	}	int k=ans[anst];	co[k]--;	ans[anst]++;	co[k+1]++;}int main(){	while(scanf("%d",&n)!=EOF){		if(n==0) break;		scanf("%d%d%d%d%d",&m,&X1,&Y1,&X2,&Y2);		init();		co[0]=m;		edge[0].x1=X1,edge[0].x2=X1;		for(int i=1;i<=n;i++){			scanf("%d%d",&edge[i].x1,&edge[i].x2);		}		sort(edge,edge+n+1,cmp);		for(int i=0;i<m;i++){			scanf("%d%d",&u,&v);			if(in())				slove();		}		printf("Box\n");		for(int i=1;i<=m;i++){			if(co[i]){				printf("%d: %d\n",i,co[i]);			}		}	}	return 0;}