POJ 2318 TOYS 叉积

题目大意:给出一个长方形盒子的左上点,右下点坐标。给出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;
}
View Code
原文地址:https://www.cnblogs.com/alan-W/p/5973059.html