POJ 2398 Toy Storage(计算几何)
题意:给定一个如上的长方形箱子,中间有n条线段,将其分为n+1个区域,给定m个玩具的坐标,统计每个区域中的玩具个数。
题解:通过斜率判断一个点是否在两条线段之间。
/**
通过斜率比较点是否在两线段之间
*/ #include"iostream"
#include"cstdio"
#include"algorithm"
#include"cstring"
using namespace std;
const int N=1005; struct edgeP //边上的一个点
{
int x1,x2;
}e[N]; struct point
{
int x,y;
}p[N]; int cmp(edgeP a,edgeP b)
{
return a.x1<=b.x1;
} int x1,y1,x2,y2; bool is_z(point e1,point e2) // /型斜线
{
if((e1.y-e2.y)*(e1.x-e2.x)>=0)
return true;
else
return false;
} bool is_f(point e1,point e2) // \型斜线
{
if((e1.y-e2.y)*(e1.x-e2.x)<=0)
return true;
else
return false;
} bool is_inzr(point e1,point e2,point p) // 在/型斜线的右边
{
if((e1.y-e2.y)*(e1.x-e2.x)>=0)
{
if((p.x-e2.x>0)&&(e1.y-e2.y)*(p.x-e2.x)>(p.y-e2.y)*(e1.x-e2.x))
return true;
}
return false;
} bool is_infl(point e1,point e2,point p) // 在\型斜线的左边
{
if((e1.y-e2.y)*(e1.x-e2.x)<=0)
{
if((p.x-e2.x<0)&&(e1.y-e2.y)*(p.x-e2.x)<(p.y-e2.y)*(e1.x-e2.x))
return true;
}
return false;
} bool is_in(point e1,point e2,point e3,point e4,point p) // 点是否在两线内
{
if((is_z(e1,e2)&&is_inzr(e1,e2,p))&&(is_f(e3,e4)&&is_infl(e3,e4,p))) // 点在/.\型两线间
return true;
if((is_z(e1,e2)&&is_inzr(e1,e2,p))&&(is_z(e3,e4)&&!is_inzr(e3,e4,p))) // 点在/./型两线间
return true;
if((is_f(e1,e2)&&!is_infl(e1,e2,p))&&(is_f(e3,e4)&&is_infl(e3,e4,p))) //点在\.\型两线间
return true;
if((is_f(e1,e2)&&!is_infl(e1,e2,p))&&(is_z(e3,e4)&&!is_inzr(e3,e4,p))) //点在\./型两线间
return true;
return false;
} int main()
{
int n,m;
while(cin>>n)
{
if(n==0)
return 0;
e[0].x1=0,e[0].x2=0;
cin>>m>>x1>>y1>>x2>>y2;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&e[i].x1,&e[i].x2);
}
for(int i=0;i<m;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
}
e[n+1].x1=x2,e[n+1].x2=x2;
sort(e,e+n+2,cmp);
int cnt[N];
memset(cnt,0,sizeof(cnt));
for(int i=0;i<=n;i++)
{
for(int j=0;j<m;j++)
{ point e1,e2;
e1.x=e[i].x1,e1.y=y1;
e2.x=e[i].x2,e2.y=y2;
point e3,e4;
e3.x=e[i+1].x1,e3.y=y1;
e4.x=e[i+1].x2,e4.y=y2;
/*{
cout<<'('<<e1.x<<','<<e1.y<<')'<<" "<<'('<<e2.x<<','<<e2.y<<')'<<endl;
cout<<'('<<e3.x<<','<<e3.y<<')'<<" "<<'('<<e4.x<<','<<e4.y<<')'<<endl;
cout<<'('<<p[j].x<<','<<p[j].y<<')'<<endl;
}*/
if(is_in(e1,e2,e3,e4,p[j]))
{
cnt[i]++;
//cout<<"cnt"<<i<<"++++++++++++++++++++++"<<endl;
}
}
//cout<<"-------------------------------------------"<<endl;
}
/*for(int i=0;i<=n;i++)
{
cout<<cnt[i]<<' ';
}*/
sort(cnt,cnt+n+1);
puts("Box");
int j=cnt[0],count=1;
cnt[n+1]=-10;
for(int i=1;i<=n+1;i++)
{
if(cnt[i]==j)
{
count++;
}
else
{
if(j!=0)
printf("%d: %d\n",j,count);
j=cnt[i];
count=1;
}
}
}
}
Description
Reza's parents came up with the following idea. They put cardboard partitions into the box. Even if Reza keeps throwing his toys into the box, at least toys that get thrown into different partitions stay separate. The box looks like this from the top:
We want for each positive integer t, such that there exists a partition with t toys, determine how many partitions have t, toys.
Input
A line consisting of a single 0 terminates the input.
Output
Sample Input
4 10 0 10 100 0
20 20
80 80
60 60
40 40
5 10
15 10
95 10
25 10
65 10
75 10
35 10
45 10
55 10
85 10
5 6 0 10 60 0
4 3
15 30
3 1
6 8
10 10
2 1
2 8
1 5
5 5
40 10
7 9
0
Sample Output
Box
2: 5
Box
1: 4
2: 1
POJ 2398 Toy Storage(计算几何)的更多相关文章
- poj 2398 Toy Storage(计算几何)
题目传送门:poj 2398 Toy Storage 题目大意:一个长方形的箱子,里面有一些隔板,每一个隔板都可以纵切这个箱子.隔板将这个箱子分成了一些隔间.向其中扔一些玩具,每个玩具有一个坐标,求有 ...
- poj 2398 Toy Storage(计算几何 点线关系)
Toy Storage Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4588 Accepted: 2718 Descr ...
- POJ 2318 TOYS && POJ 2398 Toy Storage(几何)
2318 TOYS 2398 Toy Storage 题意 : 给你n块板的坐标,m个玩具的具体坐标,2318中板是有序的,而2398无序需要自己排序,2318要求输出的是每个区间内的玩具数,而231 ...
- POJ 2398 Toy Storage(计算几何,叉积判断点和线段的关系)
Toy Storage Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3146 Accepted: 1798 Descr ...
- 2018.07.04 POJ 2398 Toy Storage(二分+简单计算几何)
Toy Storage Time Limit: 1000MS Memory Limit: 65536K Description Mom and dad have a problem: their ch ...
- POJ 2398 - Toy Storage 点与直线位置关系
Toy Storage Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5439 Accepted: 3234 Descr ...
- 简单几何(点与线段的位置) POJ 2318 TOYS && POJ 2398 Toy Storage
题目传送门 题意:POJ 2318 有一个长方形,用线段划分若干区域,给若干个点,问每个区域点的分布情况 分析:点和线段的位置判断可以用叉积判断.给的线段是排好序的,但是点是无序的,所以可以用二分优化 ...
- 向量的叉积 POJ 2318 TOYS & POJ 2398 Toy Storage
POJ 2318: 题目大意:给定一个盒子的左上角和右下角坐标,然后给n条线,可以将盒子分成n+1个部分,再给m个点,问每个区域内有多少各点 这个题用到关键的一步就是向量的叉积,假设一个点m在 由ab ...
- POJ 2398 Toy Storage (叉积判断点和线段的关系)
题目链接 Toy Storage Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4104 Accepted: 2433 ...
随机推荐
- LATEX数学公式基本语法
TEX 是Donald E. Knuth 编写的一个以排版文章及数学公式为目标的计算机程序.TEX的版本号不断趋近于π,现在为3.141592.由Pascal 语言写成,特点: 免费.输出质量高.擅长 ...
- 初探AngularJS
一.前言 早已听说AngularJS的大名,并在很久前也编写过些小demo,但是都没有系统学习过.由于,在下个版本项目中用到了AngularJS,so,那就一起再来研究研究呗. 说到,这个Angula ...
- Java多线程系列--“JUC锁”04之 公平锁(二)
概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...
- 如何重新注册VMware Update Manager(VUM)至vCenter Server中
在VMware的vSphere化境中,VUM的角色相当于Windows 环境中的WSUS(Windows 更新服务器),可以批量,自动化的完成所管辖ESXi主机的大版本迁移,小版本升级的任务,深受管理 ...
- WebGIS中基于控制点库进行SHP数据坐标转换的一种查询优化策略
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 目前项目中基于控制点库进行SHP数据的坐标转换,流程大致为:遍 ...
- ASP.NET MVC 登录验证
好久没写随笔了,这段时间没 什么事情,领导 一直没安排任务,索性 一直在研究代码,说实在的,这个登录都 搞得我云里雾里的,所以这次我可能也讲得不是 特别清楚,但是 我尽力把我知道的讲出来,顺便也对自 ...
- c#编程基础之枚举
枚举的意义就在于限制变量取值范围. 当可以确定的几种取值时才可以用. 如果输入一个字符串需要进行判断是否是我们需要的字符串时,则一般需要这样写: using System; using System. ...
- Windows Phone 8.1又有什么新花样
今年微软新任CEO提出了“Mobile First and Cloud First”的发展战略,随着微软Mobile First战略的实行,开发者是时候重视Windows Phone了.你可能不相信, ...
- 【Asp.Net Core】一、Visual Studio 2015 和 .NET Core 安装
安装 Visual Studio 和 .NET Core 1.安装 Visual Studio Community 2015,选择 Community 下载并执行默认安装.Visual Studio ...
- iOS-多线程介绍
一.前言部分 最近在面试,重新温习了一遍多线程,希望加深一遍对于多线程的理解. 1.什么是进程? 1).要了解线程我们必须先了解进程,通俗来讲进程就是在系统中运行的一个应用程序. 2).每个线程之间是 ...