TOYS-POJ2318
本题主要是确定给定的点在那块区域。原题给出n条直线,将长方形分为n+1快区域。我们可以对每个给定的点来判断它在那块区域,判段方法可以根据点与直线的位置关系,具体如下,对于点(x0,y0)和直线ax+by+c=0(a>0):
1)若a*x0+b*y0+c=0,则点在直线上。
2)若a*x0+b*y0+c>0,则点在直线右侧。
3)若a*x0+b*y0+c<0,则点在直线左侧。
顺序查找点的位置必然会耗费大量的时间。所以采用二分方法,找到点所在的区间,然后累计起来。下面代码将ax+by+c=0化简为x+(b/a)y+(c/a)=0,默认x的系数为1.
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<string>
#include<queue>
#include<cmath>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;
const int MAXN = 5001;
struct Line{
double b, c; //x+b*y+c=0
};
Line L[MAXN];
int Count[MAXN];
int BinFind(int x,int y,int n);
int main(){
int x1, y1, x2, y2,s,t,n,m,i,x,y,id,c=1;
while (scanf("%d", &n)&&n){
if (c != 1) //控制下格式
cout << endl;
c++;
scanf("%d%d%d%d%d", &m, &x1, &y1, &x2, &y2);
memset(Count, 0, sizeof(Count));
L[0].b = 0, L[0].c = 0 - x1; //第一条直线应该是矩形左边的一条边
for (i = 0; i < n; i++){
scanf("%d%d", &s, &t);
L[i+1].b = (t - s)*1.0/(y1 - y2);
L[i+1].c = (y2*s - t*y1)*1.0 / (y1 - y2);
}
L[n + 1].b = 0, L[n + 1].c = 0 - x2; //最后一条直线应该是矩形右边那条边
for (i = 0; i < m; i++){
scanf("%d%d", &x, &y);
id = BinFind(x, y, n);
Count[id]++;
}
for (i = 0; i <= n; i++)
cout << i << ": " << Count[i] << endl;
}
return 0;
}
int BinFind(int x, int y,int n){
int left = 0, right = n+1;
while (left < right-1){ //找到的点在区间(L[left],L[rigth])之间
int mid = (left + right) >> 1;
if (x + L[mid].b*y + L[mid].c>0) //点在直线右边
left = mid;
else
right = mid;
}
return left;
}
TOYS-POJ2318的更多相关文章
- POJ2318 TOYS[叉积 二分]
TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14433 Accepted: 6998 Description ...
- POJ2318:TOYS(叉积判断点和线段的关系+二分)&&POJ2398Toy Storage
题目:http://poj.org/problem?id=2318 题意: 给定一个如上的长方形箱子,中间有n条线段,将其分为n+1个区域,给定m个玩具的坐标,统计每个区域中的玩具个数.(其中这些线段 ...
- POJ2318 TOYS(叉积判断点与直线的关系+二分)
Calculate the number of toys that land in each bin of a partitioned toy box. Mom and dad have a prob ...
- POJ-2318 TOYS,暴力+叉积判断!
TOYS 2页的提交记录终于搞明白了. 题意:一个盒子由n块挡板分成n+1块区 ...
- POJ-2318 TOYS 计算几何 判断点在线段的位置
题目链接:https://cn.vjudge.net/problem/POJ-2318 题意 在一个矩形内,给出n-1条线段,把矩形分成n快四边形 问某些点在那个四边形内 思路 二分+判断点与位置关系 ...
- POJ2318 TOYS
嘟嘟嘟 题面:先告诉你一个矩形抽屉的坐标,然后\(n\)个隔板将抽屉分成了\(n + 1\)格(格子从\(0\)到\(n - 1\)标号),接下来随机输入\(m\)个玩具的坐标.问最后每一个格子里有多 ...
- POJ2318:TOYS——题解
http://poj.org/problem?id=2318 题目大意:给一个大矩形,分成n+1份,求落在每一份的点的数量. —————————————————— 首先叉积可以判断一个点在边界的左边还 ...
- [poj2318]TOYS(直线与点的位置关系)
解题关键:计算几何入门题,通过叉积判断. 两个向量的关系: P*Q>0,Q在P的逆时针方向: P*Q<0,Q在P的顺时针方向: P*Q==0,Q与P共线. 实际就是用右手定则判断的. #i ...
- B - Toy Storage(POJ - 2398) 计算几何基础题,比TOYS多了个线段排序
Mom and dad have a problem: their child, Reza, never puts his toys away when he is finished playing ...
- 【POJ】2318 TOYS(计算几何基础+暴力)
http://poj.org/problem?id=2318 第一次完全是$O(n^2)$的暴力为什么被卡了-QAQ(一定是常数太大了...) 后来排序了下点然后单调搞了搞..(然而还是可以随便造出让 ...
随机推荐
- 57、android 应用内全局通知的实现方法
1.后台运行一个服务 间隔5s从服务器获取一次数据,根据业务需要,当需要提醒给用户时,从右侧自动划出 类似效果如下:在任何界面都会有通知弹窗 2.实现过程 ①android的根布局叫dector( ...
- IOS开发学习笔记023-UIToolBar的使用
这里使用代码实现 大概过程: 1.创建工具条 2.创建插入条 3.添加头像.标签.删除按钮 4.点击头像获取标签信息 做一个简单的联系人列表,可以添加删除联系人,现在还没有添加头像和文字,接下来慢慢添 ...
- Xmanager用法(export DISPLAY=客户端IP:0.0)
1.在用户的目录下找到文件.bash_profile或profile,用vi对其进行编辑.加入下列命令行: DISPLAY=192.168.88.71:0.0;export DISPLAY 2.如果只 ...
- python 使用 vscode 调试
vscode安装python扩展,在vscode扩展管理器中搜索pyhon, 排名第一的就是我们需要下载的包—python.点击安装后重载窗体 点击调试–打开launch.json的按钮(那个小齿轮的 ...
- Leetcode 576.出界的路劲数
出界的路径数 给定一个 m × n 的网格和一个球.球的起始坐标为 (i,j) ,你可以将球移到相邻的单元格内,或者往上.下.左.右四个方向上移动使球穿过网格边界.但是,你最多可以移动 N 次.找出可 ...
- pb8.0 mssqlserver 新建数据库连接问题
将ntwdblib.DLL复制到Sybase\Shared\PowerBuilder目录下 unable to load the requested database interface,无法创建数据 ...
- 求解Catalan数,(大数相乘,大数相除,大数相加)
Catalan数 卡塔兰数是组合数学中一个常在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰(1814–1894)命名.历史上,清代数学家明安图(1692年-1763年)在其<割圜 ...
- nyoj 题目12 喷水装置(二)
喷水装置(二) 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的 ...
- Mybatis通过接口实现一对一及一对多的查询
实现一对一是采用association方法: <resultMap type="testId" id="users"> <associatio ...
- 5-Dalvik垃圾收集机制Cocurrent GC
Dalivik垃圾回收收机制Cocurrent GC简介和学习计划 导语: 在C/C++中,开发者需要手动地管理在堆中分配的内存,但是这往往导致很多问题. 1. 内存分配之后忘记释放,造成内存泄漏. ...