标签:
Description
Input
Output
Sample Input
5 6 0 10 60 0 3 1 4 3 6 8 10 10 15 30 1 5 2 1 2 8 5 5 40 10 7 9 4 10 0 10 100 0 20 20 40 40 60 60 80 80 5 10 15 10 25 10 35 10 45 10 55 10 65 10 75 10 85 10 95 10 0
Sample Output
0: 2 1: 1 2: 1 3: 1 4: 0 5: 1 0: 2 1: 2 2: 2 3: 2 4: 2
Hint
题意:有一个大箱子,由n个板分为n+1块,标号为0~n已知盒子左上角和右下角的坐标及每个板上下
两端的横坐标(板不会交错,且按顺序给出)然后给出玩具的坐标,统计每块空间内玩具个数
(保证玩具一定落在空间内)。
题解:用二分法和叉积判断该点的位置。叉积:如果x1y2-x2y1等于0则线段12共线,如果差大于0,那么线段1在2的右边,
否则在左边。用数组保存一下输出即可。
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; struct point{ int x,y; }; struct Line{ point a,b; }line[5005]; int cnt[5005]; int Multi(point p1,point p2,point p0) { return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); } void s(point a,int n) { int l=0,r=n-1,mid; while(l<r) { mid=(l+r)>>1; if(Multi(a,line[mid].a,line[mid].b)>0) l=mid+1; else r=mid; } if(Multi(a,line[l].a,line[l].b)<0) cnt[l]++; else cnt[l+1]++; } int main() { int n,m,x1,y1,x2,y2; int i,t1,t2; point a; while(cin>>n&&n) { cin>>m>>x1>>y1>>x2>>y2; for(int i=0;i<n;i++) { cin>>t1>>t2; line[i].a.x=t1; line[i].a.y=y1; line[i].b.x=t2; line[i].b.y=y2; } memset(cnt,0,sizeof(cnt)); for(int i=0;i<m;i++) { cin>>a.x>>a.y; s(a,n); } for(int i=0;i<=n;i++) cout<<i<<": "<<cnt[i]<<endl; cout<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/Ritchie/p/5491749.html