题目链接:点击打开链接
题目分析:poj 2398和poj 2318一致
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; struct point { int x,y; point(int a=0,int b=0) { x=a; y=b; } } part[2220],u_left,l_right,node[1010]; struct info { int x1,x2; }data[1010]; int ans[1010]; int cmp(point a,point b) { return a.x<b.x; } int cmp2(info a,info b) { return min(a.x1,a.x2)<min(b.x1,b.x2); } int cross(point p0,point p1,point p2) { return ((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y)); } int n,m; void solve() { int j=0; for(int i=0; i<m; i++) { for(j=0; j<=2*n;) { if(cross(part[j+1],node[i],part[j])>0&&cross(part[j+3],part[j+2],node[i])>0) { ans[j/2]++; break; } else j+=2; } } } int xmp(int x,int y) { return x<y; } int main() { while(~scanf("%d%d%d%d%d%d",&n,&m,&u_left.x,&u_left.y,&(l_right.x),&(l_right.y))&&n) { int u,l; part[0].x=u_left.x, part[0].y=u_left.y; part[1].x=u_left.x, part[1].y=l_right.y; for(int j=0;j<n;j++) { scanf("%d %d",&data[j].x1,&data[j].x2); } sort(data,data+n,cmp2); for(int i=2; i<=2*n; i+=2) { part[i].x=data[i/2-1].x1 , part[i].y=u_left.y; part[i+1].x=data[i/2-1].x2 , part[i+1].y=l_right.y; } part[2*n+2].x=l_right.x , part[2*n+2].y=u_left.y; part[2*n+3].x=l_right.x , part[2*n+3].x=l_right.x; for(int j=0; j<m; j++) { scanf("%d %d",&node[j].x,&node[j].y); } sort(node,node+m,cmp); memset(ans,0,sizeof(ans)); solve(); sort(ans,ans+n+1,xmp); int t=ans[0],count=0; printf("Box\n"); for(int i=0;i<=n;i++) { if(ans[i]==0) {t=ans[i+1];continue;} else if(ans[i]==t) {t=ans[i+1];count++;} if(ans[i]!=t||i==n) { printf("%d: %d\n",ans[i],count); count=0; } } } return 0; }