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 上面有详细的使用说明 ...
随机推荐
- JavaScript 十行原生代码实现复制内容到剪贴板
十行原生代码,不引入任何 JS 库,目前大部分浏览器与移动平台都可兼容. function copyToClipboard(value, callback) { var textarea = docu ...
- 触发ionic弹窗区域外的方法
最近项目需要在页面弹窗的时候需要点击弹窗区域外的地方,其实也就是点击页面HTML就可以关闭弹窗, 首先在controller通过js获取到html的dom节点,然后绑定点击事件,话不多说上代码: ...
- Smartforms 设置纸张打印格式
在sap做一个打印报表,要先设置一个纸张打印格式,下面以工厂中常用来打印的针孔纸为例,在sap设置该纸张的打印格式,以用于报表: 1.运行事务代码SPAD:选择工具栏上的[完全管理]按钮——>选 ...
- 使用select2 宽度自适应
加一个CSS属性:style = "width : 100%"
- php+MySQL(存储过程) +yii2完整的增删改查
1在MySQL中创建存储过程 a 我将添加和修改 作为 一起 ), ), ), )) BEGIN FROM t_boss_role WHERE id = _id) THEN UPDATE t_boss ...
- Ubuntu下配置LAMP + PhpStorm
本文仅作为一个记录,以下配置在Ubuntu 14.10 64-bit上验证通过. 安装Apache 2:sudo apt-get install apache2 安装成功能够后,通过浏览器访问loca ...
- 19,Ubuntu安装之python开发
什么??公司要用Ubuntu(乌班图)?不会用??怎么进行python开发??? 乌班图操作系统下载地址:http://releases.ubuntu.com/18.04/ubuntu-18.04 ...
- C# Dictionary的遍历理解
C# Dictionary容器类的理解 本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/det ...
- ST-LINK JLINK JTAG SWD接线图
- ListView getChildCount 以及getChildAt 坑 误区指南
今天调试的时候,才知道. 原来listview 的 getChildCount 取得是当前可先的list item 的个数,而不是整个listview 的count. 整个listview 的数量应该 ...