POJ 2318 TOYS | 二分+判断点在多边形内
题意:
给一个矩形的区域(左上角为(x1,y1) 右下角为(x2,y2)),给出n对(u,v)表示(u,y1) 和 (v,y2)构成线段将矩形切割
这样构成了n+1个多边形,再给出m个点,问每个多边形内有多少个点.
读入为n,m,x1,y1,x2,y2
n个数对(u,v),m个数对(x,y) (n,m<=5000)
题解:
很暴力的想法是对于每个点,枚举每个多边形进行检查.
但是多组数据就很江
考虑一下判断点在多边形内的射线法可知
枚举一个多边形的时候就可以知道点在多边形的左边还是右边
这样我们对每个点二分一下他属于那个多边形,依靠上述性质就可以在nlogn时间内做完
#include<cstdio>
#include<algorithm>
#include<cstring>
typedef long long ll;
#define N 5010
using namespace std;
int n,m,x1,x2,y1,y2,up[N],down[N],cnt[N],t;
struct point
{
int x,y;
point (){} ;
point (int _x,int _y) :
x(_x),y(_y) {};
bool operator < (const point &rhs) const
{
if (x==rhs.x) return y<rhs.y;
return x<rhs.x;
}
inline int operator * (const point &rhs) const
{
return x*rhs.y-y*rhs.x;
}
inline point operator - (const point &rhs) const
{
return point(x-rhs.x,y-rhs.y);
}
friend inline int dot (const point &lhs,const point &rhs)
{
return lhs.x*rhs.x+lhs.y*rhs.y;
}
}toy[N];
bool isinline (const point &p1,const point &p2,const point &p3)
{
int det=(p1-p3)*(p2-p3);
if (det!=0) return 0;
int Dot=dot(p1-p3,p2-p3);
return Dot<=0;
}
struct polygon
{
point p[10];
int inner (const point &pp)
{
int cnt=0;
for (int i=1;i<=4;i++)
{
if (isinline(p[i],p[i+1],pp)) return 1;
int d1=p[i].y-pp.y,d2=p[i+1].y-pp.y;
int del=(p[i]-pp)*(p[i+1]-pp);
if ( (del>=0 && d1>=0 && d2<0) ||
(del<=0 && d1<0 && d2>=0) ) cnt++;
}
return cnt;
}
}pol[N];
void solve()
{
sort(toy+1,toy+1+m);
memset(cnt,0,sizeof(cnt));
for (int i=0;i<=n;i++)
{
pol[i].p[1]=pol[i].p[5]=point(up[i],y1);
pol[i].p[4]=point(down[i],y2);
pol[i].p[3]=point(down[i+1],y2);
pol[i].p[2]=point(up[i+1],y1);
}
for (int i=1;i<=m;i++)
{
int l=0,r=n,mid;
while (l<=r)
{
mid=l+r>>1;
int res=pol[mid].inner(toy[i]);
if (res&1)
{
cnt[mid]++;
break;
}
if (res>0) l=mid+1;
else r=mid;
}
}
}
int main()
{
while (scanf("%d",&n),n)
{
if (++t!=1) puts("");
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
for (int i=1;i<=n;i++)
scanf("%d%d",&up[i],&down[i]);
for (int i=1,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
toy[i]=point(x,y);
}
up[0]=down[0]=x1,up[n+1]=down[n+1]=x2;
solve();
for (int i=0;i<=n;i++)
printf("%d: %d\n",i,cnt[i]);
}
return 0;
}
POJ 2318 TOYS | 二分+判断点在多边形内的更多相关文章
- poj 2318 TOYS (二分+叉积)
http://poj.org/problem?id=2318 TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 101 ...
- POJ 2318 TOYS(叉积+二分)
题目传送门:POJ 2318 TOYS Description Calculate the number of toys that land in each bin of a partitioned ...
- poj 2318 叉积+二分
TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13262 Accepted: 6412 Description ...
- zoj 1081 判断点在多边形内
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=81Points Within Time Limit: 2 Second ...
- 判断点在多边形内算法的C++实现
目录 1. 算法思路 2. 具体实现 3. 改进空间 1. 算法思路 判断平面内点是否在多边形内有多种算法,其中射线法是其中比较好理解的一种,而且能够支持凹多边形的情况.该算法的思路很简单,就是从目标 ...
- hdu 1756:Cupid's Arrow(计算几何,判断点在多边形内)
Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- php之判断点在多边形内的api
1.判断点在多边形内的数学思想:以那个点为顶点,作任意单向射线,如果它与多边形交点个数为奇数个,那么那个点在多边形内,相关公式: <?php class AreaApi{ //$area是一个多 ...
- ZOJ 1081 Points Within | 判断点在多边形内
题目: 给个n个点的多边形,n个点按顺序给出,给个点m,判断m在不在多边形内部 题解: 网上有两种方法,这里写一种:射线法 大体的思想是:以这个点为端点,做一条平行与x轴的射线(代码中射线指向x轴正方 ...
- R树判断点在多边形内-Java版本
1.什么是RTree 待补充 2.RTree java依赖 rtree的java开源版本在GitHub上:https://github.com/davidmoten/rtree 上面有详细的使用说明 ...
随机推荐
- JS-输入数字输出大写中文
function(n) { var fraction = ['角', '分']; var digit = [ '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', ...
- 在ubuntu中docker的简单使用(一)
>>docker version 当运行docker version 命令出现Cannot connect to Docker daemon. Is the docker daemon r ...
- Java删除文件或目录及目录下所有文件
一直在做C++相关开发的工作.突然某一天一时兴起,想学习下Java开发.然后再网上找到一本Java简明教程,入门是够用了.看到文件IO这一章,想起之前用C++做的删除文件或目录的练习,于是打算用Jav ...
- django+xadmin在线教育平台(十一)
6-1 首页和登录页面的配置 用户访问我们的根目录,我们需要把html文件返回给用户.因此我们第一步把html文件放入template目录. mark 在html中找到首页的html.拷贝到我们的 ...
- Docker自学纪实(三)Docker容器数据持久化
谈起数据卷 我一直觉得是个枯燥无聊的话题 但是通过今天的实操和阅读 我发现其实并不是 其实就像走夜路 没有光明,第一次都是恐惧 但是如果走的次数多了 或者静下心来去克制恐惧 也许就会驾轻就熟或者等到黎 ...
- xml解析之stax
博文引自:http://zangweiren.iteye.com/blog/647334 Java 6.0对XML支持的新特性有许多方面.比如StAX.针对XML-Web服务的Java架构(JAX-W ...
- Eloquent: 修改器
感觉好长时间没写东西了,一方面主要是自己的角色发生了变化,每天要面对各种各样的事情和突发事件,不能再有一个完整的长时间让自己静下来写代码,或者写文章. 另一方面现在公司技术栈不再停留在只有 Larav ...
- Element-ui组件--pagination分页
一般写后台系统都会有很多的列表,有列表就相应的要用到分页,根据项目中写的几个分页写一下我对分页的理解,就当是学习笔记了. 这是Element-ui提供的完整的例子 <template> ...
- python语法练习题之九九乘法表
九九乘法表 for...in方法实现 # 方法一 for i in range(1, 10): for j in range(1, i+1): print('{}*{}={:<4}'.forma ...
- Python 编码格式的使用
编码史 ASCII > Unicode > UTF-8 Unicode支持多语言,UTF-8自动转换长短细节节省空间 在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传 ...