poj2318(叉积判断点在直线左右+二分)
题目链接: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(叉积判断点在直线左右+二分)的更多相关文章
- POJ2318 TOYS(叉积判断点与直线的关系+二分)
Calculate the number of toys that land in each bin of a partitioned toy box. Mom and dad have a prob ...
- POJ2318TOYS(叉积判断点与直线位置)
题目链接 题意:一个矩形被分成了n + 1块,然后给出m个点,求每个点会落在哪一块中,输出每块的点的个数 就是判断 点与直线的位置,点在直线的逆时针方向叉积 < 0,点在直线的顺时针方向叉积 & ...
- POJ2318:TOYS(叉积判断点和线段的关系+二分)&&POJ2398Toy Storage
题目:http://poj.org/problem?id=2318 题意: 给定一个如上的长方形箱子,中间有n条线段,将其分为n+1个区域,给定m个玩具的坐标,统计每个区域中的玩具个数.(其中这些线段 ...
- POJ2318【判断点在直线哪一侧+二分查找区间】
题目大意:给定一个矩形和一些线段,线段将矩形分割为从左至右的若干部分,之后给出一些玩具的坐标,求每个部分中玩具的数量 #include<cstdio> #include<cstdli ...
- POJ 2318 叉积判断点与直线位置
TOYS Description Calculate the number of toys that land in each bin of a partitioned toy box. Mom ...
- TOYS - POJ 2318(计算几何,叉积判断)
题目大意:给你一个矩形的左上角和右下角的坐标,然后这个矩形有 N 个隔板分割成 N+1 个区域,下面有 M 组坐标,求出来每个区域包含的坐标数. 分析:做的第一道计算几何题目....使用叉积判断方 ...
- POJ 2398 Toy Storage (叉积判断点和线段的关系)
题目链接 Toy Storage Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4104 Accepted: 2433 ...
- 判断两条直线的位置关系 POJ 1269 Intersecting Lines
两条直线可能有三种关系:1.共线 2.平行(不包括共线) 3.相交. 那给定两条直线怎么判断他们的位置关系呢.还是用到向量的叉积 例题:POJ 1269 题意:这道题是给定四个点p1, ...
- POJ1269:Intersecting Lines(判断两条直线的关系)
题目:POJ1269 题意:给你两条直线的坐标,判断两条直线是否共线.平行.相交,若相交,求出交点. 思路:直线相交判断.如果相交求交点. 首先先判断是否共线,之后判断是否平行,如果都不是就直接求交点 ...
随机推荐
- STS工具各版本下载网址
官网网址:https://spring.io/tools3/sts/legacy
- [Luogu] 校园网Network of Schools
https://www.luogu.org/problemnew/show/2746 Tarjan 缩点 判断入度为0的点的个数与出度为0的点的个数的关系 注意全缩为一个点的情况 #include & ...
- 求ascii 然后做运算
介绍 ABC 返回每个字符的ascii A->65 B->66 C->77 组成656667 把所有的7替换成1 然后变成 656667 和 656661 每个数值做加法 然后做减法 ...
- Linux上命令行检出、提交和更新操作
1.创建工作区目录 列:我创建两个工作目录,用来模拟两个开发人员,命令如下:(工作路径可以按照自己需要随意改变) mkdir -p /root/workspace/harry mkdir -p /ro ...
- Qt 线程基础(QThread、QtConcurrent等) 2
使用线程 基本上有种使用线程的场合: 通过利用处理器的多个核使处理速度更快. 为保持GUI线程或其他高实时性线程的响应,将耗时的操作或阻塞的调用移到其他线程. 何时使用其他技术替代线程 开发人员使用线 ...
- git 新建仓库第一次提交
1 . git init //初始化仓库,在初始化的目录中会出现.git的文件夹 2. git add .(文件name) //添加文件到本地仓 3. git commit -m "fi ...
- 使用 pip wheel 实现 Python 依赖包的离线安装
pip python 依赖 安装 有时候, 需要部署 Python 应用的服务器没有网络连接, 这时候, 你就要把整个 Python 应用做成离线安装包. 借助 wheel, 很容易就可以实现. 首先 ...
- git 优雅的撤销中间某次提交
环境git : 2+ 前言最近两天,公司的git合并代码时,出现了严重的问题,浪费很多时间: 现在记录下: 情况是这样的,一个同事自己的本地分支(远程没有),不知怎么的,有了别人开发分支的代码,而他自 ...
- JAVA踩坑录
以前踩了很多坑,大多忘了.现在踩了坑,想起了一定记下来. 1. 字符串分割,这种工具类,首次使用一定要先看一眼,不然跳坑 commons-lang StringUtils.split分割时会去掉空串: ...
- Python - social-auth-app-django 模块 - 商城项目 第三方方式登录 - 微博
开发准备 开通微博开发者权限 点击这里 进入 微博开放平台 开通后权限后创建应用 创建网页应用, 此处不需要进行审核即可使用测试环境 开发环境信息 此处一些信息是很重要的东西, 比如 App_key ...