标签:
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
通过结果的正负判断两矢量之间的顺逆时针关系
若 a x b > 0表示a在b的顺时针方向上
若 a x b < 0表示a在b的逆时针方向上
若 a x b == 0表示a在b共线,但不确定方向是否相同
记玩具在点p0,某块板的上边点是p1,下边点是p2,p2p1(向量)×p2p0>0表示p0在p1p2的左面,<0表示在右面。接下来就是用二分法找出每个点所在的分区。
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<vector> #include<string> #include<algorithm> #define LL long long #define inf 0x3f3f3f3f using namespace std; int n,m,xx,yy,x2,y2; struct Line { int u,l; }line[5010]; int toy[5010]; bool isplace(int x,int y,int u,int l) { if((x-l)*(yy-y2)-(y-y2)*(u-l)<0) return true;//左 return false; } int binarysearch(int x,int y) { int l=0,r=n; while(l<r) { int mid=(l+r)/2; if(isplace(x,y,line[mid].u,line[mid].l)) r=mid; else l=mid+1; } return l; } int main() { bool flag=0; while(cin>>n) { if(n==0) return 0; if(flag) cout<<endl; else flag=1; scanf("%d%d%d%d%d",&m,&xx,&yy,&x2,&y2); for(int i=0;i<=n-1;i++) scanf("%d%d",&line[i].u,&line[i].l); memset(toy,0,sizeof(toy)); for(int i=0;i<=m-1;i++) { int a,b; scanf("%d%d",&a,&b); toy[binarysearch(a,b)]++; } for(int i=0;i<=n;i++) cout<<i<<": "<<toy[i]<<endl; } return 0; }
标签:
原文地址:http://blog.csdn.net/winycg/article/details/51340837