TOYS--POJ2318
http://poj.org/problem?id=2318
这是我写的第一道计算几何的题 然后竟然一A了 心情超级激动啊 !!!!
我就只看了课件上说的叉积 然后就想到要这样写 我看学长的代码 太深奥 不行 还是自己写吧 然后就哇哈哈哈哈
题目大意: 给你一个长方形盒子 然后给你n个挡板把他分成n+1个小区域 有m个玩具 给你盒子的坐标 和每个挡板的坐标 还有每个玩具的坐标
然后让你求每个小区域内有几个玩具 是不是很简单
分析:
我想的是我把每个挡板用向量表示出来 然后给出每一个玩具的坐标看他是在挡板的那边
这到题用二分搜索 如果直接遍历会超时吧 应该 反正我看他们都用二分 我也用的二分就过了
二分的递归 好像第一次写这么好
#include <iostream> #include <cstring> #include <algorithm> #include <queue> #include <cstdio> #include <cstdlib> #include <cctype> #include <math.h> #include <ctype.h> using namespace std; #define memset(a,b) memset(a,b,sizeof(a)) #define N 5500 typedef long long ll; struct node { int x, y, v; }p[N]; int y2; int Find(int nx,int ny,int l,int r) { if(l==r-1) return l; int mid=(l+r)/2; node d; d.x=nx-p[mid].v; d.y=ny-y2; if((d.x*p[mid].y)-(d.y*p[mid].x)>0)///如果d点在右边 { l=mid; r=r; return Find(nx,ny,l,r); } else if((d.x*p[mid].y)-(d.y*p[mid].x)<0)///如果d点在左边 { l=l; r=mid; return Find(nx,ny,l,r); } return 0; } int main() { int n,m,x1,x2,y1,a[N]; while(scanf("%d",&n),n) { memset(a,0); int u,v; scanf("%d %d %d %d %d",&m,&x1,&y1,&x2,&y2); p[0].x=x1; p[0].y=y2; p[0].v=x1; for(int i=1;i<=n;i++) { scanf("%d %d",&u,&v); p[i].x=u-v; p[i].y=y1-y2; p[i].v=v; } p[n+1].x=x2; p[n+1].y=y1; p[n+1].v=x2; for(int i=0;i<m;i++) { scanf("%d %d",&u,&v); int aa=Find(u,v,0,n+1); a[aa]++; } for(int i=0;i<=n;i++) { printf("%d: %d\n",i,a[i]); } printf("\n"); } return 0; }