题意:给一个矩形,从左到右划分为一系列区域,这些区域的分界线不一定是垂直的,分界线不会交叉。然后给一些点,让你统计每一个区域内点出现的次数。
思路:利用叉积的性质,判断点(另一个向量)出现在向量的哪一边。
我的第一道计算几何就那么轻松地水过去了~在查找的时候,应用二分法能优化,但是这道题数据量不大,简单从左到右扫描即可。
#include <iostream> #include <stdio.h> #include <cmath> #include <algorithm> #include <iomanip> #include <cstdlib> #include <string> #include <memory.h> #include <vector> #include <queue> #include <stack> #include <ctype.h> using namespace std; int U[5010]; int L[5010]; int tx[5010]; int ty[5010]; int ans[5010]; int cp(int x1,int y1,int x2,int y2){ return x1*y2-x2*y1; } int main(){ int n,m,x1,y1,x2,y2; while(~scanf("%d",&n)){ if(!n)break; scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2); memset(ans,0,sizeof(ans)); for(int i=1;i<=n;i++){ scanf("%d%d",&U[i],&L[i]); } for(int i=1;i<=m;i++){ scanf("%d%d",&tx[i],&ty[i]); } for(int i=1;i<=m;i++){//玩具 for(int j=1;j<=n;j++){//挡板 if(cp( U[j]-L[j] , y1-y2 , tx[i]-L[j] , ty[i]-y2 )>0){ ans[j-1]++; break; }else if(j==n){ ans[j]++; } } } for(int i=0;i<=n;i++){ printf("%d: %d\n",i,ans[i]); } printf("\n"); } return 0; }