题目链接:https://vjudge.net/problem/POJ-2318

题意:有n条线将矩形分成n+1块,m个点落在矩形内,求每一块点的个数。

思路:

  最近开始肝计算几何,之前的几何题基本处于挂机状态,但听别人说几何题不会太难,所以打算把几何给过了。

  先引入叉积的一个重要性质,O为原点:

    OP^OQ>0 : P在Q的顺时针方向。

    OP^OQ<0 : P在Q的逆时针方向。

    OP^OQ=0 : O,P,Q共线。

  那么我们就可以利用该性质判断一个点P在直线AB的左侧当且仅当:PA^PB<0。

  再发现可以用二分查找第一条满足点在直线左侧的直线即可,其单调性显然可知。

AC code:

#include<cstdio>
#include<algorithm>
using namespace std; const int maxn=;
int n,m,x1,y1,x2,y2,ans[maxn],flag=; struct Point{
int x,y;
Point(){}
Point(int xx,int yy):x(xx),y(yy){}
Point operator + (const Point& b)const{
return Point(x+b.x,y+b.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-b.x*y;
}
}; struct Line{
Point s,e;
Line(){};
Line(Point ss,Point ee){
s=ss,e=ee;
}
}line[maxn]; int check(int x,int y,int m){
Point pt=Point(x,y);
return (line[m].s-pt)^(line[m].e-pt);
} int main(){
while(scanf("%d",&n),n){
if(flag) flag=;
else printf("\n");
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
for(int i=;i<=n;++i)
ans[i]=;
for(int i=;i<n;++i){
int u,l;
scanf("%d%d",&u,&l);
line[i]=Line(Point(u,y1),Point(l,y2));
}
line[n]=Line(Point(x2,y1),Point(x2,y2));
while(m--){
int x,y;
scanf("%d%d",&x,&y);
Point pt=Point(x,y);
int l=,r=n,mid;
while(l<=r){
mid=(l+r)>>;
if(check(x,y,mid)<=) r=mid-;
else l=mid+;
}
++ans[l];
}
for(int i=;i<=n;++i)
printf("%d: %d\n",i,ans[i]);
}
}

poj2318(叉积判断点在直线左右+二分)的更多相关文章

  1. POJ2318 TOYS(叉积判断点与直线的关系+二分)

    Calculate the number of toys that land in each bin of a partitioned toy box. Mom and dad have a prob ...

  2. POJ2318TOYS(叉积判断点与直线位置)

    题目链接 题意:一个矩形被分成了n + 1块,然后给出m个点,求每个点会落在哪一块中,输出每块的点的个数 就是判断 点与直线的位置,点在直线的逆时针方向叉积 < 0,点在直线的顺时针方向叉积 & ...

  3. POJ2318:TOYS(叉积判断点和线段的关系+二分)&&POJ2398Toy Storage

    题目:http://poj.org/problem?id=2318 题意: 给定一个如上的长方形箱子,中间有n条线段,将其分为n+1个区域,给定m个玩具的坐标,统计每个区域中的玩具个数.(其中这些线段 ...

  4. POJ2318【判断点在直线哪一侧+二分查找区间】

    题目大意:给定一个矩形和一些线段,线段将矩形分割为从左至右的若干部分,之后给出一些玩具的坐标,求每个部分中玩具的数量 #include<cstdio> #include<cstdli ...

  5. POJ 2318 叉积判断点与直线位置

    TOYS   Description Calculate the number of toys that land in each bin of a partitioned toy box. Mom ...

  6. TOYS - POJ 2318(计算几何,叉积判断)

    题目大意:给你一个矩形的左上角和右下角的坐标,然后这个矩形有 N 个隔板分割成 N+1 个区域,下面有 M 组坐标,求出来每个区域包含的坐标数.   分析:做的第一道计算几何题目....使用叉积判断方 ...

  7. POJ 2398 Toy Storage (叉积判断点和线段的关系)

    题目链接 Toy Storage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4104   Accepted: 2433 ...

  8. 判断两条直线的位置关系 POJ 1269 Intersecting Lines

    两条直线可能有三种关系:1.共线     2.平行(不包括共线)    3.相交. 那给定两条直线怎么判断他们的位置关系呢.还是用到向量的叉积 例题:POJ 1269 题意:这道题是给定四个点p1, ...

  9. POJ1269:Intersecting Lines(判断两条直线的关系)

    题目:POJ1269 题意:给你两条直线的坐标,判断两条直线是否共线.平行.相交,若相交,求出交点. 思路:直线相交判断.如果相交求交点. 首先先判断是否共线,之后判断是否平行,如果都不是就直接求交点 ...

随机推荐

  1. 02 | 日志系统:一条SQL更新语句是如何执行的?

    前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块.相信你还记得,一条查询语句的执行过程一般是经过连接器.分析器.优化器.执行器等功能模块,最后到达存储引擎. 那么,一条更新语 ...

  2. 51nod 1412

    考虑到只与深度和点的个数有关$f[n][d]$ 表示 $n$ 个点,深度为 $d$ 的 $AVL$ 树有多少种 枚举左子树大小为 $i$, 进行转移并且深度为 $logn$ 级别 $f[n][d] = ...

  3. Linux之创建多个子进程

    /*** fork_test.c ***/ #include<stdio.h> #include<stdlib.h> #include<unistd.h> int ...

  4. lodop打印设计

    <template> <div class="dashboard-container"> <form id="form1"> ...

  5. c++ 判断是元音还是辅音

    #include <iostream> using namespace std; int main() { char c; int isLowercaseVowel, isUppercas ...

  6. 消息中间件MQ

    消息中间件MQ:为方便预览,将思维导图上传至印象笔记,博客园直接上传图片受限于图片大小 https://app.yinxiang.com/shard/s24/nl/27262531/c3e137a5- ...

  7. AtomicInteger原理

    AtomicInteger的原理 java的并发原子包里面提供了很多可以进行原子操作的类,比如: AtomicInteger AtomicBoolean AtomicLong AtomicRefere ...

  8. JS -- Unexpected trailing comma

    Unexpected trailing comma 后面多了一个逗号

  9. Async and Await (Stephen Cleary)

    https://blog.stephencleary.com/2012/02/async-and-await.html Most people have already heard about the ...

  10. 免费版CloudFlare CDN基本设置参考

    CDN有很多,网上都有介绍,用户比较多的CloudFlare CDN大家都知道,配置起来也比较简单,合理的配置,才能提升网站的速度和网站安全.不同的网站需求配置不一样,以下是我的配置情况,仅供参考. ...