题目连接: http://poj.org/problem?id=2318     http://poj.org/problem?id=2398

两题类似的题目,2398是2318的升级版。

题目大概是说,有一个矩形的柜子,中间有一些隔板。告诉你每个隔板的坐标,还有一些玩具的坐标,统计玩具在哪个格子里。

这题的思路很简单,如果玩具在某个隔板的左边和右边叉乘的正负是不同的。如图:

图中点P在线段CD的左边,则向量PC和向量PD叉乘结果小于0。反之P在AB的左边,向量PA叉乘PB大于0。

因此利用这个性质以及排序好的线段列表,通过二分思想,可以快速知道点在哪个格子内。

代码:

 #include<stdio.h>
#include<math.h>
#define PI 3.14159265358979323846
#define MAX(x,y) ((x)>(y)?(x):(y))
#define MIN(x,y) ((x)<(y)?(x):(y))
#define ABS(x) (((x)>0)?(x):(-(x)))
#define SIGN(x) (((x)<0)?-1:1)
#define EPS 0.000001/*精度控制*/
#define N 5005
/*坐标的定义*/
typedef double coo;/*int*/
/*点、向量*/
typedef struct POINT
{
coo x,y;
}point,vector;
/*线段*/
typedef struct SEGMENT
{
point p1,p2;/*p[2];*/
}segment;
/*判相等*/
int is_equel(double a,double b)
{
double c=ABS(a-b);
if(c<=EPS) return ;/*相等*/
else return ;/*不相等*/
}
/*向量的减法p1-p2*/
vector vector_minus(vector p1,vector p2)
{
vector p;
p.x=p1.x-p2.x;
p.y=p1.y-p2.y;
return p;
}
/*向量叉乘*/
double cross_product(vector p1,vector p2)
{/*x1y2-x2y1*/
return p1.x*p2.y-p1.y*p2.x;
}
int bijiao(segment s1,segment s2)/*比较两个线段的位置< */
{
if(s1.p1.x<s2.p1.x) return ;
if(s1.p1.x==s2.p1.x&&s1.p2.x<s2.p2.x) return ;
return ;
}
int Partition(segment r[],int low,int high)/*升序*/
/*返回支点最终位置*/
{
segment x;/*类型具体*/
if(low>high) return ;
if(low==high) return low;
x=r[low];
while(low<high)
{
while(low<high&&bijiao(x,r[high])) high--; /*<*/
if(low<high){r[low]=r[high];low++;}
while(low<high&&bijiao(r[low],x)) low++; /*>*/
if(low<high){r[high]=r[low];high--;}
}
r[low]=x;
return low;
}
void Quick_sort(segment r[],int m,int n) /*排序从r[m]到r[n]*/
{
int i;
if(m>=n) return;
i=Partition(r,m,n);
Quick_sort(r,m,i-);
Quick_sort(r,i+,n);
} int BinSearch(segment a[],int n,point k)/*在有序的数组a[0]~a[n-1]中查找k元素*/
{
int low=,high=n-,mid;
while(low<=high)
{
mid=low+((high-low)/);
if(cross_product(vector_minus(a[mid].p1,k),vector_minus(a[mid].p2,k))<) high=mid-;/*线段在右边*/
else low=mid+;
}
if(low>high) return high;
}
int main()
{
int n,m,i,a[N],b[N];
double x1,x2,y1,y2;
point p;
segment s[N];
while()
{
scanf("%d",&n);
if(n==) break;
scanf("%d%lf%lf%lf%lf",&m,&x1,&y1,&x2,&y2);
s[].p1.x=x1;
s[].p1.y=y1;
s[].p2.x=x1;
s[].p2.y=y2;
for(i=;i<=n;i++)
{
scanf("%lf%lf",&s[i].p1.x,&s[i].p2.x);
s[i].p1.y=y1;
s[i].p2.y=y2;
}
s[i].p1.x=x2;
s[i].p1.y=y1;
s[i].p2.x=x2;
s[i].p2.y=y2;
Quick_sort(s,,n+);
for(i=;i<N;i++) a[i]=;
for(i=;i<m;i++)
{
scanf("%lf%lf",&p.x,&p.y);
a[BinSearch(s,n+,p)]++;
}
for(i=;i<N;i++) b[i]=;
for(i=;i<N;i++) b[a[i]]++;
printf("Box\n");
for(i=;i<N;i++) if(b[i]) printf("%d: %d\n",i,b[i]);
}
return ;
}

PKU 2398

【解题报告】PKU 2318 TOYS AND PKU 2398 Toy Storage的更多相关文章

  1. poj 2318 TOYS &amp; poj 2398 Toy Storage (叉积)

    链接:poj 2318 题意:有一个矩形盒子,盒子里有一些木块线段.而且这些线段坐标是依照顺序给出的. 有n条线段,把盒子分层了n+1个区域,然后有m个玩具.这m个玩具的坐标是已知的,问最后每一个区域 ...

  2. POJ 2318 TOYS && POJ 2398 Toy Storage(几何)

    2318 TOYS 2398 Toy Storage 题意 : 给你n块板的坐标,m个玩具的具体坐标,2318中板是有序的,而2398无序需要自己排序,2318要求输出的是每个区间内的玩具数,而231 ...

  3. poj 2398 Toy Storage(计算几何)

    题目传送门:poj 2398 Toy Storage 题目大意:一个长方形的箱子,里面有一些隔板,每一个隔板都可以纵切这个箱子.隔板将这个箱子分成了一些隔间.向其中扔一些玩具,每个玩具有一个坐标,求有 ...

  4. POJ 2398 - Toy Storage 点与直线位置关系

    Toy Storage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5439   Accepted: 3234 Descr ...

  5. POJ 2398 Toy Storage(计算几何,叉积判断点和线段的关系)

    Toy Storage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3146   Accepted: 1798 Descr ...

  6. poj 2398 Toy Storage(计算几何 点线关系)

    Toy Storage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4588   Accepted: 2718 Descr ...

  7. 2018.07.04 POJ 2398 Toy Storage(二分+简单计算几何)

    Toy Storage Time Limit: 1000MS Memory Limit: 65536K Description Mom and dad have a problem: their ch ...

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

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

  9. 简单几何(点与线段的位置) POJ 2318 TOYS && POJ 2398 Toy Storage

    题目传送门 题意:POJ 2318 有一个长方形,用线段划分若干区域,给若干个点,问每个区域点的分布情况 分析:点和线段的位置判断可以用叉积判断.给的线段是排好序的,但是点是无序的,所以可以用二分优化 ...

随机推荐

  1. 与Wii控制手柄通信的托管代码库(转)

    2009-01-16 翻译 HID Human Input Device     人工输入设备 Wii Fit Balance Board       平衡板 IR                   ...

  2. 【android原生应用】之闹钟应用搭起篇

    由于工作原因接触android开发一段时间了,对于开发有了一些了解,于是萌生了搭起android原生应用进行分析和学习的想法.先从闹钟应用开始吧. 1.首先要下载原生应用,原生应用在原生系统里面(当然 ...

  3. 安卓四大组件之--service

    服务:长期后台运行的没有界面的activity,程序写法和activity类似. 安卓系统进程管理是按照一定规则的: 1.默认情况下,关闭掉一个应用程序,清空了这个应用程序的任务栈,应用程序的进程还会 ...

  4. libevent简单介绍

    http://blog.csdn.net/mafuli007/article/details/7476014 1      简介 主页:http://www.monkey.org/~provos/li ...

  5. photoshop菜单显示不全的解决方法

    photoshop菜单显示不全? 解决方法,选择菜单 编辑->菜单,下拉菜单选择photoshop默认值

  6. 让浏览器屏蔽js

    有时候为了测试js是否做到了渐进增强,需要屏蔽下js 做法: Internet选项>>安全>>自定义级别 禁用java小程序脚本和活动脚本 有的浏览器调试器直接就有这个功能

  7. iOS xcode缓存问题

    Question: When I try to build my app in Xcode, I get this error message:PCH file built from a differ ...

  8. Activity Recognition行为识别

    暑假听了computer vision的一个Summer School,里面Jason J. Corso讲了他们运用Low-Mid-High层次结构进行Video Understanding 和 Ac ...

  9. SQL Server 数据库初始化准备脚本

    通常我们在项目部署前都会写一份数据库初始化脚本.由于数据库外键的限制,我们需要按照数据引用顺序添加初始记录,这个整理过程相当麻烦. 因此写了以下脚本,原理是先去掉所有外键,然后执行一次清空,然后添加数 ...

  10. 使用C#开发ActiveX控件(新) 转 http://www.cnblogs.com/yilin/p/csharp-activex.html

    前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力.通常ActiveX控件都是 ...