叉积(POJ - 2318 )
题目链接:https://cn.vjudge.net/contest/276358#problem/A
题目大意:给你一个矩阵的左上角和右下角,然后n个竖杠,这n个竖杠将这个矩阵分成n+1个方块,给你m个点的坐标,问你每个区域的点的个数。
具体思路:叉积,如果说叉积是小于等于0的,就证明这个点在这个竖杠的左边,就把这个点归入到这个竖杠左边的区域就可以了。
AC代码:
1 #include<iostream> 2 #include<cmath> 3 #include<stack> 4 #include<queue> 5 #include<stdio.h> 6 #include<string> 7 #include<cstring> 8 #include<algorithm> 9 using namespace std; 10 # define inf 0x3f3f3f3f 11 # define ll long long 12 const int maxn = 2e4+100; 13 struct node 14 { 15 int xtop,xbot; 16 } q[maxn]; 17 int ans[maxn]; 18 int cal(int x2,int y2,int x1,int y1) 19 { 20 return x1*y2-x2*y1; 21 } 22 int main() 23 { 24 int n,m,x1,y1,x2,y2; 25 while(~scanf("%d",&n)&&n) 26 { 27 memset(ans,0,sizeof(ans)); 28 scanf("%d %d %d %d %d",&m,&x1,&y1,&x2,&y2); 29 for(int i=0; i<n; i++) 30 { 31 scanf("%d %d",&q[i].xtop,&q[i].xbot); 32 } 33 int x,y; 34 for(int i=1; i<=m; i++) 35 { 36 scanf("%d %d",&x,&y); 37 int j; 38 for( j=0; j<n; j++) 39 { 40 if(cal(q[j].xtop-q[j].xbot,y1-y2,x-q[j].xbot,y-y2)<=0) 41 break; 42 } 43 ans[j]++; 44 } 45 for(int i=0; i<=n; i++) 46 { 47 printf("%d: %d\n",i,ans[i]); 48 } 49 printf("\n"); 50 } 51 return 0; 52 }