POJ2318:TOYS(叉积判断点和线段的关系+二分)&&POJ2398Toy Storage
题目:http://poj.org/problem?id=2318
题意:

给定一个如上的长方形箱子,中间有n条线段,将其分为n+1个区域,给定m个玩具的坐标,统计每个区域中的玩具个数。(其中这些线段有序且不相交)
解答:
因为线段是有序给出,所以不用排序,判断某个点在哪个区域,采用二分法,将某个点和线段的叉积来判断这个点是在线的左边或者右边,根据这个来二分找出区域。
这是第一道计算几何的题目,怎么说呢,对于二分的边界问题还有点搞不清楚,这次是对线段二分,感觉二分真的很有用处。
开阔思维!!!具体请看代码。
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <queue>
#define inf 0x3f3f3f3f
#define eps 1e-9
typedef long long ll;
using namespace std;
int n,m,x,y,x2,y2,temp;
int a[][],point[][],sum[]; void er(int l,int r,int keyx,int keyy)
{
ll X1,Y1,X2,Y2;
int mid;
while(l<r)
{
mid=l+(r-l)/;
X1=a[mid][]-keyx;
Y1=y-keyy;
X2=a[mid][]-keyx;
Y2=y2-keyy;
if(X1*Y2-X2*Y1<=)
r=mid;
else l=mid+;
}
sum[l]++;
}
int main()
{
while(scanf("%d",&n)!=EOF&&n!=)
{
scanf("%d%d%d%d%d",&m,&x,&y,&x2,&y2);
for(int i=; i<n; i++)
scanf("%d%d",&a[i][],&a[i][]);
a[n][]=a[n][]=x2;//保证所有点都能找到叉积<=0的线段
for(int i=; i<m; i++)
{
scanf("%d%d",&point[i][],&point[i][]);
}
memset(sum,,sizeof(sum));
for(int i=; i<m; i++)
{
er(,n,point[i][],point[i][]);
}
for(int i=; i<=n; i++)
{
printf("%d: %d\n",i,sum[i]);
}
cout<<endl;
}
return ;
}
大神写的规范代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; struct Point {
int x, y;
}; struct Line {
Point a, b;
} line[]; int cnt[]; int Multi(Point p1, Point p2, Point p0) {
return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);
} void BSearch(Point a, int n) {
int l, r, mid; l = ; r = n-;
while (l < r) {
mid = (l + r) >> ;
if (Multi(a, line[mid].a, line[mid].b) > ) l = mid + ;
else r = mid;
}
if (Multi(a, line[l].a, line[l].b) < ) cnt[l]++;
else cnt[l+]++;
} int main()
{
int n, m, x1, y1, x2, y2;
int i, t1, t2;
Point a; while (scanf ("%d", &n) && n) {
scanf ("%d%d%d%d%d", &m, &x1, &y1, &x2, &y2);
for (i = ; i < n; i++) {
scanf ("%d%d", &t1, &t2);
line[i].a.x = t1;
line[i].a.y = y1;
line[i].b.x = t2;
line[i].b.y = y2;
}
memset(cnt, , sizeof (cnt));
for (i = ; i < m; i++) {
scanf ("%d%d", &a.x, &a.y);
BSearch(a, n);
}
for (i = ; i <= n; i++)
printf ("%d: %d\n", i, cnt[i]);
printf("\n");
}
return ;
}
POJ2398:
本题和poj2318 TOYS大致一样,但有一些不同。
1:输入是无序的,需要自己排序。
2:输出是输出拥有相同玩具数的区块有几个。 (区块里的玩具数:相同玩具数的区块个数)
知道题意就很好做了。
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <queue>
#define inf 0x3f3f3f3f
#define eps 1e-9
typedef long long ll;
using namespace std;
int n,m,x,y,x2,y2,temp;
int point[][],sum[];
struct node
{
int a1,a2;
} a[];
int cmp(const void *a,const void *b)
{
struct node *aa=(struct node *)a;
struct node *bb=(struct node *)b;
return aa->a1-bb->a1;
}
void er(int l,int r,int keyx,int keyy)
{
ll X1,Y1,X2,Y2;
int mid;
while(l<r)
{
mid=l+(r-l)/;
X1=a[mid].a1-keyx;
Y1=y-keyy;
X2=a[mid].a2-keyx;
Y2=y2-keyy;
if(X1*Y2-X2*Y1<=)
r=mid;
else l=mid+;
}
sum[l]++;
}
int main()
{
while(scanf("%d",&n)!=EOF&&n!=)
{
scanf("%d%d%d%d%d",&m,&x,&y,&x2,&y2);
for(int i=; i<n; i++)
scanf("%d%d",&a[i].a1,&a[i].a2);
a[n].a1=a[n].a2=x2;
qsort(a,n+,sizeof(a[]),cmp);
for(int i=; i<m; i++)
{
scanf("%d%d",&point[i][],&point[i][]);
}
memset(sum,,sizeof(sum));
for(int i=; i<m; i++)
{
er(,n,point[i][],point[i][]);
}
printf("Box\n");
int ha[];
memset(ha,,sizeof(ha));
for(int i=; i<=m; i++)
{
if(sum[i])
ha[sum[i]]++;
}
for(int i=; i<=; i++)
{
if(ha[i]) printf("%d: %d\n",i,ha[i]);
}
}
return ;
}
POJ2318:TOYS(叉积判断点和线段的关系+二分)&&POJ2398Toy Storage的更多相关文章
- POJ 2398 Toy Storage (叉积判断点和线段的关系)
题目链接 Toy Storage Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4104 Accepted: 2433 ...
- POJ 2398 Toy Storage(计算几何,叉积判断点和线段的关系)
Toy Storage Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3146 Accepted: 1798 Descr ...
- POJ2318 TOYS(叉积判断点与直线的关系+二分)
Calculate the number of toys that land in each bin of a partitioned toy box. Mom and dad have a prob ...
- poj2318(叉积判断点在直线左右+二分)
题目链接:https://vjudge.net/problem/POJ-2318 题意:有n条线将矩形分成n+1块,m个点落在矩形内,求每一块点的个数. 思路: 最近开始肝计算几何,之前的几何题基本处 ...
- POJ2318 TOYS[叉积 二分]
TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14433 Accepted: 6998 Description ...
- [poj2318]TOYS(直线与点的位置关系)
解题关键:计算几何入门题,通过叉积判断. 两个向量的关系: P*Q>0,Q在P的逆时针方向: P*Q<0,Q在P的顺时针方向: P*Q==0,Q与P共线. 实际就是用右手定则判断的. #i ...
- POJ-2318 TOYS 计算几何 判断点在线段的位置
题目链接:https://cn.vjudge.net/problem/POJ-2318 题意 在一个矩形内,给出n-1条线段,把矩形分成n快四边形 问某些点在那个四边形内 思路 二分+判断点与位置关系 ...
- TOYS - POJ 2318(计算几何,叉积判断)
题目大意:给你一个矩形的左上角和右下角的坐标,然后这个矩形有 N 个隔板分割成 N+1 个区域,下面有 M 组坐标,求出来每个区域包含的坐标数. 分析:做的第一道计算几何题目....使用叉积判断方 ...
- poj 2318(叉积判断点在线段的哪一侧)
TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13120 Accepted: 6334 Description ...
随机推荐
- eclipse启动无响应,老是加载不了revert resources,或停留在Loading workbench状态
做开发的同学们或多或少的都会遇到eclipse启动到一定程度时,就进入灰色无响应状态再也不动了.启动画面始终停留在Loading workbench状态.反复重启,状态依旧. 多数情况下,应该是非正常 ...
- sql 使用整理
今天使用视图查询东西,为了方便直接select * 查出来的都行全部都错乱了,看来sql 超过20个以上的字段为了效率和安全,禁止用select * -------------查一个表的所有字段的-- ...
- MRF能量优化
一个外国博客,写的比较清晰 http://nghiaho.com/?page_id=1366 MRF优化牛人 重庆大学的教授 1 http://qianjiye.de/2015/09/reparame ...
- 【BZOJ】1093: [ZJOI2007]最大半连通子图(tarjan+拓扑序)
http://www.lydsy.com/JudgeOnline/problem.php?id=1093 两个条件综合起来加上求最大的节点数,那么很明显如果是环一定要缩点. 然后再仔细思考下就是求da ...
- Maven项目POM.xml详解
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- U盘重装Windows系统
1.制作一个U盘老毛桃或者大白菜 2.进入BIOS 3.Secure Boot-Disabled,作用是关闭微软的Secure BOOT,这个功能开启会导致不能识别U盘启动系统的安装 4.Lauch ...
- sql中IN的含义
in后面可以是查询集合,也可以是诸如('1','2','3','4') 例: UPDATE CC_PROBLEM_INFO SET Z_STATUS = 1 WHERE CONTENT_ID IN ( ...
- Objective-C代码学习大纲(4)
2011-05-11 14:06 佚名 otierney 字号:T | T 本文为台湾出版的<Objective-C学习大纲>的翻译文档,系统介绍了Objective-C代码,很多名词为台 ...
- 安卓EmojiTextView 和EmojiEditText
https://github.com/rockerhieu/emojicon 用法和TextView一样. 发送的时候用UTF-8 String enCodedStatusCode = "& ...
- 加载CDN加速服务地址
Jquery是个非常流行的JS前端框架,在很多网站都能看到它的身影.很多网站都喜欢采用一些Jquery CDN加速服务,这样网站加载jquery会更快.之前火端网络的一些网站都是使用Google的jq ...