题意:就是给了m个点,落在n+1个区域中,问各个区域有多少个点。
/* 对于每个玩具,二分其所在的区间,然后用叉积判断。 但是我觉得枚举好像时间复杂度也可以。 */ #include<cstdio> #include<iostream> #include<cstring> #define N 5010 using namespace std; int n,m,cnt[N]; struct Point{ int x,y; }; struct Line{ Point a,b; }line[N]; int crs(Point p1,Point p2,Point p0){ return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); } void search(Point p){ int l=1,r=n; while(l<r){ int mid=l+r>>1; if(crs(p,line[mid].a,line[mid].b)<0) r=mid; else l=mid+1; } if(crs(p,line[l].a,line[l].b)<0) cnt[l]++; else cnt[l+1]++; } int main(){ int x1,y1,x2,y2; while(scanf("%d",&n)&&n){ memset(cnt,0,sizeof(cnt)); scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2); for(int i=1;i<=n;i++){ int t1,t2;scanf("%d%d",&t1,&t2); line[i].a.x=t1; line[i].a.y=y1; line[i].b.x=t2; line[i].b.y=y2; } for(int i=1;i<=m;i++){ Point p; scanf("%d%d",&p.x,&p.y); search(p); } for(int i=1;i<=n+1;i++) printf("%d: %d ",i-1,cnt[i]); printf(" "); } return 0; }