题意:给定一个如上的长方形箱子,中间有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;
}
}
}
}

 

 

Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

Submit Status

Description

Mom and dad have a problem: their child, Reza, never puts his toys away when he is finished playing with them. They gave Reza a rectangular box to put his toys in. Unfortunately, Reza is rebellious and obeys his parents by simply throwing his toys into the box. All the toys get mixed up, and it is impossible for Reza to find his favorite toys anymore. 
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

The input consists of a number of cases. The first line consists of six integers n, m, x1, y1, x2, y2. The number of cardboards to form the partitions is n (0 < n <= 1000) and the number of toys is given in m (0 < m <= 1000). The coordinates of the upper-left corner and the lower-right corner of the box are (x1, y1) and (x2, y2), respectively. The following n lines each consists of two integers Ui Li, indicating that the ends of the ith cardboard is at the coordinates (Ui, y1) and (Li, y2). You may assume that the cardboards do not intersect with each other. The next m lines each consists of two integers Xi Yi specifying where the ith toy has landed in the box. You may assume that no toy will land on a cardboard.

A line consisting of a single 0 terminates the input.

Output

For each box, first provide a header stating "Box" on a line of its own. After that, there will be one line of output per count (t > 0) of toys in a partition. The value t will be followed by a colon and a space, followed the number of partitions containing t toys. Output will be sorted in ascending order of t for each box.

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(计算几何)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 向量的叉积 POJ 2318 TOYS & POJ 2398 Toy Storage

    POJ 2318: 题目大意:给定一个盒子的左上角和右下角坐标,然后给n条线,可以将盒子分成n+1个部分,再给m个点,问每个区域内有多少各点 这个题用到关键的一步就是向量的叉积,假设一个点m在 由ab ...

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

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

随机推荐

  1. NET Core-学习笔记(一)

    .net core最近园子讨论频率很高的话题,从不久前发布正式版本后,也是开始从netcore官网一步一步走向学习之路:.net跨平台的设计让人很是兴奋起来,因为做了多年的互联网研发者,见识了很多一流 ...

  2. C++服务器开发之基于对象的编程风格

    Thread.h #ifndef _THREAD_H_ #define _THREAD_H_ #include <pthread.h> #include <boost/functio ...

  3. 读书笔记--SQL必知必会10--分组数据

    10.1 数据分组 使用分组可以将数据分为多个逻辑组,对每个组进行聚集计算. 10.2 创建分组 使用SELECT语句的GROUP BY子句建立分组. GROUP BY子句必须出现在WHERE之后,O ...

  4. 一点做用户画像的人生经验(一):ID强打通

    1. 背景 在构建精准用户画像时,面临着这样一个问题:日志采集不能成功地收集用户的所有ID,且每条业务线有各自定义的UID用来标识用户,从而造成了用户ID的零碎化.因此,为了做用户标签的整合,用户ID ...

  5. WebAPI接收JSON参数注意事项

    运行环境:ASP.NET 4.5.2. 当我们向GlobalConfiguration.Configuration.MessageHandlers添加一个DelegatingHandler派生类后,很 ...

  6. 【Asp.Net Core】二、添加控制器和视图

    控制器Controller 在添加控制器前,我们先看下它为我们自动生成的一些Controller,我们看下AccountController.cs 来看下登录验证方法Login async这个应该是异 ...

  7. java中的switch case

    switch-case语句格式如下 switch(变量){ case 变量值1: //; break; case 变量值2: //...; break; ... case default: //... ...

  8. 开源物联网框架ServerSuperIO 3.0正式发布(C#),跨平台:Win&Win10 Iot&Ubuntu&Ubuntu Mate,一套设备驱动跨平台挂载,附:开发套件和教程。

    3.0版本主要更新内容: 1.增加跨平台能力:Win&Win10 Iot&Ubuntu&Ubuntu Mate 2.统一设备驱动接口:可以一套设备驱动,跨平台挂载运行,降低人力 ...

  9. mysql中,sleep进程过多,如何解决?

    睡眠连接过多,会对mysql服务器造成什么影响? 严重消耗mysql服务器资源(主要是cpu, 内存),并可能导致mysql崩溃. 造成睡眠连接过多的原因? 1. 使用了太多持久连接(个人觉得,在高并 ...

  10. ES6(let 和 const)

    一项新技术的出现肯定是为了解决一些问题,那么ES6的出现主要是解决了哪些问题?它的出现给我们带来了什么便利?当它没有出现的时候,某些问题怎么处理?ES6的方法和以前的方法比较又有什么不同呢?根据提出的 ...