POJ 2318--TOYS(二分找点,叉积判断方向)
| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 17974 | Accepted: 8539 |
Description
Mom and dad have a problem - their child John never puts his toys away when he is finished playing with them. They gave John a rectangular box to put his toys in, but John 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 John to find his favorite toys.
John's parents came up with the following idea. They put cardboard partitions into the box. Even if John keeps throwing his toys into the box, at least toys that get thrown into different bins stay separated. The following diagram shows a top view of an example toy box.
For this problem, you are asked to determine how many toys fall into each partition as John throws them into the toy box.
Input
Output
Sample Input
5 6 0 10 60 0
3 1
4 3
6 8
10 10
15 30
1 5
2 1
2 8
5 5
40 10
7 9
4 10 0 10 100 0
20 20
40 40
60 60
80 80
5 10
15 10
25 10
35 10
45 10
55 10
65 10
75 10
85 10
95 10
0
Sample Output
0: 2
1: 1
2: 1
3: 1
4: 0
5: 1 0: 2
1: 2
2: 2
3: 2
4: 2
Hint
Source
- 题意:给n条边,划分成n+1个区域,再给定m个点坐标,点不会落在边界上和区域外,问每个区域中各自存在多少个点
- 代码如下
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
const int MAX = ; typedef struct point {
int x;
int y;
}point;
typedef struct value {
point start;
point end;
}v;
v edge[MAX];
int sum[MAX];
int n, m, x1, y11, x2, y2, flag = ;
point tp;
int Xj, Yj;
int multi(point p1, point p2, point p0) { //判断p1p0和p2p0的关系,<0,p1p0在p2p0的逆时针方向
return (p1.x - p0.x)*(p2.y - p0.y) - (p2.x - p0.x)*(p1.y - p0.y);
}
void inset(point p) {
int low = , high = n;
while (low <= high) {
int mid = (high + low) / ;
if (multi(p, edge[mid].start, edge[mid].end) < ) /*点p1在边的左侧*/
high = mid - ;
else //点p在边的右侧
low = mid + ;
}
if (multi(p, edge[low-].start, edge[low-].end) < )
sum[low-]++;
else
sum[low]++;
}
int main() {
while (~scanf("%d", &n) && n) {
memset(sum, , sizeof(sum));
if (flag == )flag++;
else printf("\n");
scanf("%d%d%d%d%d", &m, &x1, &y11, &x2, &y2);
int Ui, Li;
for (int i = ; i < n; i++) {
scanf("%d%d", &Ui, &Li);
edge[i].start.x = Ui;
edge[i].start.y = y11;
edge[i].end.x = Li;
edge[i].end.y = y2;
}
edge[n].start.x = x2;
edge[n].start.y = y11;
edge[n].end.x = x2;
edge[n].end.y = y2;
for (int j = ; j < m; j++) {
scanf("%d%d", &Xj, &Yj);
tp.x = Xj;
tp.y = Yj;
inset(tp);
}
for (int i = ; i <= n; i++)
printf("%d: %d\n", i, sum[i]);
}
return ;
} Experience: 前面点的构造写成
edge[i].start = { Ui,y11 };
edge[i].end = { Li,y2 };当发现这个错误的时候,我自己都被自己蠢哭了,Wa了2页,一直以为是叉积方向搞错了,原来不是ORZ
- 这个是我真正意义上第一道计算几何,mark一下。
POJ 2318--TOYS(二分找点,叉积判断方向)的更多相关文章
- POJ 2318 TOYS (计算几何,叉积判断)
TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8661 Accepted: 4114 Description ...
- poj 2318 TOYS (二分+叉积)
http://poj.org/problem?id=2318 TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 101 ...
- POJ 2318 TOYS | 二分+判断点在多边形内
题意: 给一个矩形的区域(左上角为(x1,y1) 右下角为(x2,y2)),给出n对(u,v)表示(u,y1) 和 (v,y2)构成线段将矩形切割 这样构成了n+1个多边形,再给出m个点,问每个多边形 ...
- POJ 2318 TOYS(叉积+二分)
题目传送门:POJ 2318 TOYS Description Calculate the number of toys that land in each bin of a partitioned ...
- POJ 2318 TOYS(点与直线的关系 叉积&&二分)
题目链接 题意: 给定一个矩形,n个线段将矩形分成n+1个区间,m个点,问这些点的分布. 题解: 思路就是叉积加二分,利用叉积判断点与直线的距离,二分搜索区间. 代码: 最近整理了STL的一些模板,发 ...
- POJ 2318 TOYS (叉积+二分)
题目: Description Calculate the number of toys that land in each bin of a partitioned toy box. Mom and ...
- POJ 2318 TOYS【叉积+二分】
今天开始学习计算几何,百度了两篇文章,与君共勉! 计算几何入门题推荐 计算几何基础知识 题意:有一个盒子,被n块木板分成n+1个区域,每个木板从左到右出现,并且不交叉. 有m个玩具(可以看成点)放在这 ...
- POJ 2318 TOYS 利用叉积判断点在线段的那一侧
题意:给定n(<=5000)条线段,把一个矩阵分成了n+1分了,有m个玩具,放在为位置是(x,y).现在要问第几个位置上有多少个玩具. 思路:叉积,线段p1p2,记玩具为p0,那么如果(p1p2 ...
- 向量的叉积 POJ 2318 TOYS & POJ 2398 Toy Storage
POJ 2318: 题目大意:给定一个盒子的左上角和右下角坐标,然后给n条线,可以将盒子分成n+1个部分,再给m个点,问每个区域内有多少各点 这个题用到关键的一步就是向量的叉积,假设一个点m在 由ab ...
- 2018.07.03 POJ 2318 TOYS(二分+简单计算几何)
TOYS Time Limit: 2000MS Memory Limit: 65536K Description Calculate the number of toys that land in e ...
随机推荐
- echarts环形图点击旋转并高亮
通过计算某个扇形区域的值占整个圆的百分比来得到这个扇形的角度,从而根据startAngle这个属性来设定图形的开始渲染的角度,使点击某个扇形时圆环旋转使之始终对准某个点. 期间考虑到某扇形区域太小点击 ...
- mysql三:表操作
一.存储引擎介绍 存储引擎即表类型,mysql根据不同的表类型会有不同的处理机制. 详见:点击查看 二.表的介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标 ...
- SharePoint 2013 - Workflow Manager
1. Workflow Manager可以与SharePoint 安装在同一台机器上,只是不建议这么做:由于Workflow Manager 需要使用数据库,我个人将其安装在 SQL Server机器 ...
- Android XMPP 例子(Openfire+asmack+spark) 出现登陆连接错误
Android XMPP 例子(Openfire+asmack+spark) 运行出来没问题,但是登陆的时候出现如下错误: 出现错误: 09-17 15:24:16.388: E/AndroidRun ...
- android,Exoplayer实现视频播放器
bundle配置: implementation 'com.google.android.exoplayer:exoplayer-core:2.8.1'implementation 'com.goog ...
- ContentProvider启动浅析
一.自己的理解 对于content provide的启动我是这样认为的,要用ContentResolver去获得一个contentProvider,在这的获得的过程中, 1.如果本应用之前有conte ...
- 用AutoHotkey一键完成Xmind里的几个功能
F5一键添加超链接(类型为主题),常规步骤:Ctrl_h打开窗口,点击[主题],激活光标到输入框. Ctrl-i一键添加截取的图片,常规步骤是:打开画图→粘贴→保存图片为文件→Xmind里Ctrl-i ...
- webpack前言:前端模块系统的演进
前端开发和其他开发工作的主要区别,首先是前端是基于多语言.多层次的编码和组织工作,其次前端产品的交付是基于浏览器,这些资源是通过增量加载的方式运行到浏览器端,如何在开发环境组织好这些碎片化的代码和资源 ...
- 原生JavaScript实现JSON合并(递归深度合并)
// 遇到相同元素级属性,以(minor)为准 // 不返还新Object,而是main改变 function mergeJSON(minor, main) { for(var key in mino ...
- python入门20 导入模块(引包)
1 引包: import module 或 import module.module1 或 from module import module1,module2...等 2 import xx ...