首页 > 代码库 > 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;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。