题目大意:给出一个长方形盒子的左上点,右下点坐标。给出n个隔板的坐标,和m个玩具的坐标,求每个区间内有多少个玩具。
题目思路:利用叉积判断玩具在隔板的左方或右方,并用二分优化查找过程。
#include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<stdio.h> #include<stdlib.h> #include<queue> #include<math.h> #include<map> #define INF 0x3f3f3f3f #define MAX 100005 #define Temp 1000000000 #define MOD 1000000007 using namespace std; int up[MAX],down[MAX],x[MAX],y[MAX],ans[MAX],n,m,X1,Y1,X2,Y2; void Init() { memset(ans,0,sizeof(ans)); memset(up,0,sizeof(up)); memset(down,0,sizeof(down)); } int check(int pos,int x1,int y1)//叉积 { int x3=up[pos],x2=down[pos],y2=Y1,y3=Y2; return (x1-x3)*(y3-y2)-(x3-x2)*(y1-y3); } void Find(int pos)//二分查找隔板 { int x1=x[pos],y1=y[pos],L=0,R=n-1; while(L < R) { int Mid=(L+R)/2; if(check(Mid,x1,y1) < 0) L=Mid+1; else R=Mid; } if(check(L,x1,y1)>0) ans[L]++; else ans[L+1]++; } int main() { while(scanf("%d",&n),n) { Init(); scanf("%d%d%d%d%d",&m,&X1,&Y1,&X2,&Y2); for(int i=0;i<n;i++) scanf("%d%d",&down[i],&up[i]); for(int i=0;i<m;i++) scanf("%d%d",&x[i],&y[i]); for(int i=0;i<m;i++) { Find(i); } for(int i=0;i<=n;i++) { printf("%d: %d ",i,ans[i]); } printf(" "); } return 0; }