题目大意:和 TOY题意一样,但是需要对隔板从左到右进行排序,要求输出的是升序排列的含有i个玩具的方格数,以及i值。
题目思路:判断叉积,二分遍历
#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; struct node1 { int ans;//ans记录方格内玩具数 }a[MAX]; struct node2 { int up,down;//up为上方x坐标,down为下方x坐标 }b[MAX]; int x[MAX],y[MAX],n,m,X1,Y1,X2,Y2,num[MAX];//num记录内有i个玩具的方格数 int cmp(struct node2 A,struct node2 B) { if(A.up!=B.up) return A.up < B.up; return A.down < B.down; } void Init() { for(int i=0;i<=n;i++) { a[i].ans=0; } memset(num,0,sizeof(num)); } int check(int pos,int x1,int y1)//叉积 { int x3=b[pos].up,x2=b[pos].down,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) a[L].ans++; else a[L+1].ans++; } int main() { int maxn; while(scanf("%d",&n),n) { Init(); maxn=0; scanf("%d%d%d%d%d",&m,&X1,&Y1,&X2,&Y2); for(int i=0;i<n;i++) scanf("%d%d",&b[i].down,&b[i].up); sort(b,b+n,cmp); for(int i=0;i<m;i++) scanf("%d%d",&x[i],&y[i]); for(int i=0;i<m;i++)//二分查找 { Find(i); } printf("Box "); for(int i=0;i<=n;i++) { num[a[i].ans]++; maxn=max(maxn,num[a[i].ans]); } for(int i=1;i<=maxn;i++) if(num[i]!=0) printf("%d: %d ",i,num[i]); } return 0; }