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 上面有详细的使用说明 ...
随机推荐
- 【模板时间】◆模板·II◆ 树链剖分
[模板·II]树链剖分 学长给我讲树链剖分,然而我并没有听懂,还是自学有用……另外感谢一篇Blog +by 自为风月马前卒+ 一.算法简述 树链剖分可以将一棵普通的多叉树转为线段树计算,不但可以实现对 ...
- 搭建私有maven库发布及使用流程
一:背景 Apache Maven是当Java技术栈前最流行的项目管理工具,它提供了一系列方便快捷的命令帮助程序员们进行Java工程的开发工作.Maven服务器位于美国,由于出国带宽和众多因素,在国内 ...
- 再次写给VC++ Windows开发者
距离我的上一篇文章--写给VC++ Windows开发的初学者已经4年多时间过去了,感慨于时光如梭之余,更感慨于这么多年来(从1998年我初学VC 算起吧)到如今其实我仍然还只是个初学者而已.看看之前 ...
- 用js控制单选框或者多选框问题
出现如图问题时,这时不能用attr方法添加checked属性了,改用$( "input" ).prop( "checked", true ),完美解决.
- iOS常用控件-UITableViewCell
一. 封装cell: 1.加载xib文件的两种方式 <方式1> (NewsCell是xib文件的名称) NSArray *objects = [[NSBundle mainBundle] ...
- 创建控制器view的几种方式
1. 根据storyboard的描述创建 2. 通过xib的描述创建 3. 通过代码创建控制器的view self.window = [[UIWindow alloc] initWithFrame:[ ...
- 裸机——210SD卡启动
1.通过阅读iROM_Application_note可以获取关于启动的全部信息 2.记录下代码 制作SD卡启动的代码,即添加校验和的 #include <strings.h> #incl ...
- url_maneger.py
coding=UTF-8 # url管理器 class urlManeger: def __init__(self): self.new_urls = set() self.old_urls = se ...
- Idea搭建spring framework源码环境
spring的源码目前放在github上,https://github.com/spring-projects/spring-framework 一.安装Git 二.安装Gradle gradle为解 ...
- tools.jar seem to ....
android stadio 运行不起来,可以在java_home原来的路径下加一个\, 然后就可以运行起来了.