POJ 2318 TOYS【叉积+二分】

今天开始学习计算几何,百度了两篇文章,与君共勉!

计算几何入门题推荐

计算几何基础知识

题意:有一个盒子,被n块木板分成n+1个区域,每个木板从左到右出现,并且不交叉。 有m个玩具(可以看成点)放在这个盒子里,问每个区域分别有多少个玩具。

思路:首先,用叉积判断玩具是否在木板的左边,再用二分找到符合的最右边的木板,该木板答案加一。

#include<stdio.h>
#include<string.h>
struct point{
    int x,y;
    point(){}
    point(int x_,int y_){
        x=x_,y=y_;
    }
    point operator -(const point &b)const{
        return point(x-b.x,y-b.y);
    }
    int operator *(const point &b)const{//点积
        return x*b.x+y*b.y;
    }
    int operator ^(const point &b)const{//叉积
        return x*b.y-y*b.x;
    }
};
int cal(point p0,point p1,point p2){//小于0表示在p1处左折,大于0右折,等于0同线
    return (p1-p0)^(p2-p0);
}
const int N=5555;
point s[N],e[N];
int ans[N];
int main(){
    int n,m,x1,x2,y1,y2;
    int x3,x4,i,f=0;
    while(~scanf("%d",&n)&&n){
        scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
        if(!f)    f=1;
        else    puts("");
        memset(ans,0,sizeof(ans));
        for(i=0;i<n;i++){
            scanf("%d%d",&x3,&x4);
            s[i]=point(x3,y1);
            e[i]=point(x4,y2);
        }
        s[n]=point(x2,y1);
        e[n]=point(x2,y2);
        while(m--){
            int l=0,r=n,mid,x,y,tmp;
            scanf("%d%d",&x,&y);
            point p=point(x,y);
            while(l<=r){
                mid=(l+r)>>1;
                if(cal(p,s[mid],e[mid])<0){
                    tmp=mid;
                    r=mid-1;
                }
                else
                    l=mid+1;
            }
            ans[tmp]++;
        }
        for(i=0;i<=n;i++){
            printf("%d: %d\n",i,ans[i]);
        }
    }
    return 0;
}
时间: 2024-11-05 18:35:28

POJ 2318 TOYS【叉积+二分】的相关文章

POJ 2318 TOYS 叉积的应用

A - TOYS Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2318 Appoint description:  lijunle  (2011-07-18)System Crawler  (2016-05-08) Description Calculate the number of toys that land in each b

POJ 2318 TOYS 叉积应用

点击打开链接 TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11078   Accepted: 5312 Description Calculate the number of toys that land in each bin of a partitioned toy box. Mom and dad have a problem - their child John never puts his toys

POJ 2318 TOYS 叉积

题意: 给出一个矩形范围,给出n条线段,这n条线段一定与矩形上下边界相交且互不相交,将矩形分成n+1个划分.给出m个玩具的坐标.求每个划分放的玩具数,玩具保证不会在线段和左右边界上. 分析: 判断点是否在两条直线中间,利用叉积,如果在两条直线间,必定会有两个叉积一个小于0,一个大于0(不能把相乘小于0作为判断条件) #include <iostream> #include <cstdio> #include <cstring> using namespace std;

POJ 2318 TOYS(叉积+二分or暴力)

题目链接:POJ 2318 TOYS [写在前面]前几天跟队友分了方向,学渣开始进行计算几何的专题了,真是脑壳有点痛啊.但是我想做多了就没这么坑爹了 [题意]大体意思就是给你一个矩形,有被若干直线分成N个格子,给出M个点的坐标,问你每个点位于哪个格子中. [思路]其实就是点在凸四边形内的判断,然后就可以利用叉积的性质,当然可以用暴力枚举也可以过,但是时间复杂度有点高,最好是用二分求解.(一直觉得二分真是牛逼啊) 下面贴AC代码,用二分219MS就过了: 1 /* 2 ** POJ 2318 TO

【POJ】2318 TOYS ——计算几何+二分

TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10281   Accepted: 4924 Description Calculate the number of toys that land in each bin of a partitioned toy box. Mom and dad have a problem - their child John never puts his toys away w

poj 2318 TOYS &amp; poj 2398 Toy Storage (叉积)

链接:poj 2318 题意:有一个矩形盒子,盒子里有一些木块线段,并且这些线段坐标是按照顺序给出的, 有n条线段,把盒子分层了n+1个区域,然后有m个玩具,这m个玩具的坐标是已知的,问最后每个区域有多少个玩具 分析:从左往右,直到判断玩具是否在线段的逆时针方向为止,这个就需要用到叉积,当然可以用二分查找优化. 叉积:已知向量a(x1,y1),向量b(x2,y2),axb=x1*y2-x2*y1, 若axb>0,a在b的逆时针方向,若axb<0,则a在b的顺时针方向 注:每组数据后要多空一行

POJ 2318/2398 叉积性质

2318 2398 题意:给出n条线将一块区域分成n+1块空间,再给出m个点,询问这些点在哪个空间里. 思路:由于只要求相对位置关系,而对具体位置不关心,那么易使用叉积性质得到相对位置关系(左侧/右侧),再因为是简单几何线段不相较,即有序分布,那么在求在哪个区间时可以先对所有线段根据x坐标排序,使用二分减少复杂度. /** @Date : 2017-07-11 11:05:59 * @FileName: POJ 2318 叉积性质.cpp * @Platform: Windows * @Auth

POJ 2318 TOYS/POJ 2398 Toy Storage

计算几何终于开坑了... 叉积+二分. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 5050 using namespace std; struct point { int x,y; point (int x,int y):x(x),y(y) {} point () {} friend point operator-(point

POJ 2318 TOYS(点与直线的关系 叉积&amp;&amp;二分)

题目链接 题意: 给定一个矩形,n个线段将矩形分成n+1个区间,m个点,问这些点的分布. 题解: 思路就是叉积加二分,利用叉积判断点与直线的距离,二分搜索区间. 代码: 最近整理了STL的一些模板,发现真是好用啊orz,为啥以前没发现呢,可能是比较懒吧-.- #include <stdio.h> #include <string.h> #include <cmath> #include <iostream> #include <queue> #i