POJ 2318
来源:互联网 发布:非法经营期货软件投诉 编辑:程序博客网 时间:2024/06/04 17:42
这是一道计算几何题,题意大概是:在一个大矩形里有n条分割线把矩形分割成n+1部分、再给出一些玩具的坐标、要求统计每个部分内有多少个玩具、思路:利用二分N个区域来,然后利用叉乘来判断是不是在其区域类!这里要利用叉乘的一个性质:(1)P*Q>0,P在Q的顺时针 (2)P*Q==0 ,P和Q共线 (3)P*Q<0, P在Q的逆时针代码如下:#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>using namespace std;const int maxn=5010;int num[maxn];int n,m;struct node{ int x; int y;} low[maxn],high[maxn];int pp(node aa,node bb,node cc)//这里就是利用叉乘来判断是不是在其区域{ return (cc.x-aa.x)*(bb.y-aa.y)-(cc.y-aa.y)*(bb.x-aa.x);}int slove(node cc)//这里利用二分来找{ int l=0; int r=n, ans; while(l<r) { int mid=(l+r)>>1; if(pp(low[mid],high[mid],cc)>0) { l=mid+1; } else { r=mid; } } return l;}int main(){ //int n,m; node a,b; while(scanf("%d",&n),n) { scanf("%d%d%d%d%d",&m,&a.x,&a.y,&b.x,&b.y); for(int i=0; i<n; i++) { scanf("%d%d",&high[i].x,&low[i].x); high[i].y=a.y; low[i].y=b.y; } low[n].x=b.x;//这里有一个巧妙之处就是把n加入进去了 low[n].y=b.y; high[n].x=b.x; high[n].y=a.y; node temp; memset(num,0,sizeof(num)); for(int i=0; i<m; i++) { scanf("%d%d",&temp.x,&temp.y); int q; q=slove(temp); num[q]++; } for(int i=0; i<=n; i++) { printf("%d: %d\n",i,num[i]); } printf("\n"); } return 0;}在这个程序中利用上面的二分可以这样写,无论输出l还是r结果都对但是如果二分是这样写:int slove(node cc){ int l=0; int r=n; while(l<r) { int mid=(l+r)>>1; if(pp(low[mid],high[mid],cc)>0) { l=mid+1; } else { r=mid-1; } } return l;}好像只能return l,return r的话就会出错误!