TOYS(poj 2318)

题意:就是给了m个点,落在n+1个区域中,问各个区域有多少个点。

/*
  对于每个玩具,二分其所在的区间,然后用叉积判断。
  但是我觉得枚举好像时间复杂度也可以。
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 5010
using namespace std;
int n,m,cnt[N];
struct Point{
    int x,y;
};
struct Line{
    Point a,b;
}line[N];
int crs(Point p1,Point p2,Point p0){
    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
void search(Point p){
    int l=1,r=n;
    while(l<r){
        int mid=l+r>>1;
        if(crs(p,line[mid].a,line[mid].b)<0) r=mid;
        else l=mid+1;
    }
    if(crs(p,line[l].a,line[l].b)<0) cnt[l]++;
    else cnt[l+1]++;
}
int main(){
    int x1,y1,x2,y2;
    while(scanf("%d",&n)&&n){
        memset(cnt,0,sizeof(cnt));
        scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
        for(int i=1;i<=n;i++){
            int t1,t2;scanf("%d%d",&t1,&t2);
            line[i].a.x=t1;
            line[i].a.y=y1;
            line[i].b.x=t2;
            line[i].b.y=y2;
        }
        for(int i=1;i<=m;i++){
            Point p;
            scanf("%d%d",&p.x,&p.y);
            search(p);
        }
        for(int i=1;i<=n+1;i++)
            printf("%d: %d
",i-1,cnt[i]);
        printf("
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/harden/p/6284220.html