zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    2
    作业5
    实验十
    作业 5 指针应用
    九九乘法表
    实验七(课堂练习)
    实验六 数组 (2)
    实验六 数组
    课堂实验5(求从m到n之间(包括m和n)所有素数的和)
    课堂实验5-2
  • 原文地址:https://www.cnblogs.com/harden/p/6284220.html
Copyright © 2011-2022 走看看