poj 2398 Toy Storage(计算几何)
题目传送门:poj 2398 Toy Storage
题目大意:一个长方形的箱子,里面有一些隔板,每一个隔板都可以纵切这个箱子。隔板将这个箱子分成了一些隔间。向其中扔一些玩具,每个玩具有一个坐标,求有\(t\)个玩具的隔间数(对\(t>0\)都要输出)。
题目分析:涉及到计算几何的知识是求点在线的哪一侧。可以利用叉积来做。取点\(A\)到隔板的上端点\(B\)的向量\(\vec{AB}\)叉乘点\(A\)到隔板的下端点\(C\)的向量\(\vec{AC}\)。叉积的公式\(\vec a\times \vec b=|\vec a||\vec b|sin(\vec a,\vec b)\)里是有一个\(sin(\vec a,\vec b)\)的。可见若点\(A\)在\(BC\)的左侧,\((\vec{AB},\vec{AC})>\pi\)(右手法则的角度),故\(sin(\vec{AB},\vec{AC})<0\),\(\vec{AB}\times \vec{AC}<0\)。反之,点\(A\)在\(BC\)右侧,\(\vec{AB}\times \vec{AC}>0\)。这样就可以二分求每个玩具在哪个隔间里。
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include <algorithm>
typedef long long LL;
const int maxn = 1000; using namespace std; struct tPoint
{
int x, y;
}; struct tCard
{
tPoint a, b;
bool operator<(const tCard& y) const
{
if(a.x==y.a.x)
return b.x<y.b.x;
return a.x<y.a.x;
}
};
tCard card[maxn+10]; int Multi(tPoint p1, tPoint p2, tPoint p0)
{
return (p1.x-p0.x) * (p2.y-p0.y) - (p2.x-p0.x) * (p1.y-p0.y);
} int bSearch(tPoint p, int n)
{
int l=1, r=n;
while(l<=r)
{
int mid = (l+r)/2;
if(Multi(card[mid].a, card[mid].b, p)>0)
l = mid+1;
else
r = mid-1;
}
return l;
} int num[maxn+10];//partition[i]含的玩具数
int parti[maxn+10];//含i个玩具的partition数 int main()
{
int n, m, x1, y1, x2, y2;
while(scanf("%d", &n), n)
{
scanf("%d%d%d%d%d", &m, &x1, &y1, &x2, &y2);
for(int i=1,u,l; i<=n; i++)
{
scanf("%d%d", &u, &l);
card[i] = (tCard){(tPoint){u,y1},(tPoint){l,y2}};
}
card[n+1] = (tCard){(tPoint){x1,y1},(tPoint){x1,y2}};
card[n+2] = (tCard){(tPoint){x2,y1},(tPoint){x2,y2}};
sort(card+1, card+1+n+2); memset(num, 0, sizeof(num));
for(int i=1; i<=m; i++)
{
tPoint p;
scanf("%d%d", &p.x, &p.y);
int part = bSearch(p, n+2) - 1;
num[part]++;
} memset(parti, 0, sizeof(parti));
for(int i=1; i<=n+1; i++)
parti[num[i]]++; printf("Box\n");
for(int i=1; i<=maxn; i++)
{
if(parti[i])
printf("%d: %d\n", i, parti[i]);
}
}
return 0;
}
poj 2398 Toy Storage(计算几何)的更多相关文章
- poj 2398 Toy Storage(计算几何 点线关系)
Toy Storage Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4588 Accepted: 2718 Descr ...
- POJ 2398 Toy Storage(计算几何)
题意:给定一个如上的长方形箱子,中间有n条线段,将其分为n+1个区域,给定m个玩具的坐标,统计每个区域中的玩具个数. 题解:通过斜率判断一个点是否在两条线段之间. /** 通过斜率比较点是否在两线段之 ...
- 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 ...
随机推荐
- SpringBoot 源码解析 (九)----- Spring Boot的核心能力 - 整合Mybatis
本篇我们在SpringBoot中整合Mybatis这个orm框架,毕竟分析一下其自动配置的源码,我们先来回顾一下以前Spring中是如何整合Mybatis的,大家可以看看我这篇文章Mybaits 源码 ...
- GeoServer 查询sql视图
说明: 最近项目中遇到一个需求,需要统计管网的长度,但管网数据量非常大,前端用openlayers接口统计直接就奔溃了. 后尝试使用调后台接口查数据库的方式,虽然可行但是又要多一层与后台交互的工作. ...
- 作业要求20191107-6 beta week 2/2 Scrum立会报告+燃尽图 05
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9958 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩 ...
- 关于Java运行机制
目录 编译型语言与解释型语言的区别 编译型语言 解释型语言 细数两者之差别 Java的奇怪之处 Java的编译 Java的解释 具体机制 Java既是编译型语言,也是解释型语言. 首先先查找关于两种语 ...
- tar文件归档
tar是UNIX和类UNIX系统上的压缩,备份工具, 名字来源于Tape archive--磁盘归档,最初的时候是用来将数据储存,备份到磁带上的.而今最简单的备份方法是添加新的磁盘或者在云端存储,但即 ...
- 【黑客基础】Windows PowerShell 脚本学习(上)
视频地址:[黑客基础]Windows PowerShell 脚本学习 2019.12.05 学习笔记 1.$PSVersionTable :查看PowerShell的版本信息. 2.PowerShel ...
- 修改json源码支持datetime序列化
修改json源码支持datetime序列化 import json import datetime now = datetime.datetime.today() json.dumps(now) 抛出 ...
- 系统目录结构、ls命令、文件类型、alias命令 使用介绍
1周第5次课(3月23日) 课程内容: 2.1/2.2 系统目录结构2.3 ls命令2.4 文件类型2.5 alias命令 Linux系统目录结构 在Linux系统里面也是同样存在很多文件和文件夹,而 ...
- Qt事件分发机制源码分析之QApplication对象构建过程
我们在新建一个Qt GUI项目时,main函数里会生成类似下面的代码: int main(int argc, char *argv[]) { QApplication application(argc ...
- vue使用tips
1. native修饰符可以用来绑定原生事件 2. destroyed在列表重渲染时,销毁的列表项会调用. 3. 并不是所有的数据都适合放入vuex 4. 子组件mounted先于父组件发生. 5. ...