2318 TOYS

2398 Toy Storage

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

思路 : 两个题基本差不多,只不过2398排一下序,然后再找个数组标记一下就行。

这个题我一开始没想到用二分,判断了点在四边形内但是没写下去,然后看了网上的二分区间,利用叉积判断点在左边还是右边。

2318代码:

 #include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream> using namespace std ; struct point
{
int x,y ;
}p ;
struct line
{
point a,b ;
} eline[] ; int s[] ; int xmult(point p1,point p2,point p0)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y) ;
} void binary_searc(point p,int a)
{
int l = , r = a- ,mid ;
while(l < r)
{
mid = (l + r) / ;
if(xmult(p,eline[mid].a,eline[mid].b) > ) l = mid+ ;
else r = mid ;
}
if(xmult(p,eline[l].a,eline[l].b) < ) s[l] ++ ;
else s[l+] ++ ;
}
int main()
{
int m,n,x1,x2,y1,y2 ;
while(scanf("%d",&n) != EOF)
{
if(n == ) break ;
scanf("%d %d %d %d %d",&m,&x1,&y1,&x2,&y2) ;
memset(s,,sizeof(s)) ;
for(int i = ; i < n ; i++)
{
scanf("%d %d",&eline[i].a.x,&eline[i].b.x) ;
eline[i].a.y = y1 ;
eline[i].b.y = y2 ;
}
for(int i = ; i < m ; i++)
{
scanf("%d %d",&p.x,&p.y) ;
binary_searc(p,n) ;
}
for(int i = ; i <= n ; i++)
printf("%d: %d\n",i,s[i]) ;
printf("\n") ;
}
return ;
}

2398代码 :

 #include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm> using namespace std ; struct point
{
int x,y ;
}p ;
struct line
{
point a,b ;
} eline[] ; int s[],s1[] ; int xmult(point p1,point p2,point p0)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y) ;
} int cmp(const line &aa,const line &bb)
{
if (min(aa.a.x, aa.b.x) == min(bb.a.x, aa.b.x))
return max(aa.a.x, aa.b.x) < max(bb.a.x, bb.b.x);
return min(aa.a.x, aa.b.x) < min(bb.a.x, aa.b.x);
}
void binary_searc(point p,int a)
{
int l = , r = a- ,mid ;
while(l < r)
{
mid = (l + r) / ;
if(xmult(p,eline[mid].a,eline[mid].b) > ) l = mid+ ;
else r = mid ;
}
if(xmult(p,eline[l].a,eline[l].b) < ) s[l] ++ ;
else s[l+] ++ ;
}
int main()
{
int m,n,x1,x2,y1,y2 ;
while(scanf("%d",&n) != EOF)
{
if(n == ) break ;
scanf("%d %d %d %d %d",&m,&x1,&y1,&x2,&y2) ;
memset(s,,sizeof(s)) ;
memset(s1,,sizeof(s1)) ;
for(int i = ; i < n ; i++)
{
scanf("%d %d",&eline[i].a.x,&eline[i].b.x) ;
eline[i].a.y = y1 ;
eline[i].b.y = y2 ;
}
sort(eline,eline+n,cmp) ;
for(int i = ; i < m ; i++)
{
scanf("%d %d",&p.x,&p.y) ;
binary_searc(p,n) ;
}
for(int i = ; i <= n ; i++)
s1[s[i]] ++ ;
printf("Box\n") ;
for(int i = ; i <= m ; i++)
{
if(s1[i] != )
printf("%d: %d\n",i,s1[i]) ;
}
// for(int i = 0 ; i <= n ; i++)
// printf("%d: %d\n",i,s[i]) ;
// printf("\n") ;
}
return ;
}

POJ 2318 TOYS && POJ 2398 Toy Storage(几何)的更多相关文章

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

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

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

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

  3. POJ 2318 TOYS/POJ 2398 Toy Storage

    计算几何终于开坑了... 叉积+二分. #include<iostream> #include<cstdio> #include<cstring> #include ...

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

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

  5. POJ 2318 TOYS(叉积+二分)

    题目传送门:POJ 2318 TOYS Description Calculate the number of toys that land in each bin of a partitioned ...

  6. poj 2318 TOYS &amp; poj 2398 Toy Storage (叉积)

    链接:poj 2318 题意:有一个矩形盒子,盒子里有一些木块线段.而且这些线段坐标是依照顺序给出的. 有n条线段,把盒子分层了n+1个区域,然后有m个玩具.这m个玩具的坐标是已知的,问最后每一个区域 ...

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

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

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

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

  9. POJ 2398 - Toy Storage - [计算几何基础题][同POJ2318]

    题目链接:http://poj.org/problem?id=2398 Time Limit: 1000MS Memory Limit: 65536K Description Mom and dad ...

随机推荐

  1. Oracle + Entity Framework 更新没有设置主键的表

    最近用Entity Framework 开发的时候,发现一个问题,在默认情况下,EF不能对一个没有主键的表进行更新.插入和删除的动作. 那么,应该怎么处理没有主键的表呢? 我们打开这个表的edmx文件 ...

  2. (转)使用CruiseControl+SVN+ANT实现持续集成之二

    1. 环境搭建 1.1. 下载及目录介绍 从官方站点http://cruisecontrol.sourceforge.net/download.html下载一份最新的 CC 压缩包,最新的版本号为2. ...

  3. 操作Excel导入的问题(转)

    当Excel导入成为需要时,之前的导出Excel为html方式的方法就受阻了,于是,需要开始新的百度与google来解决问题. 前提为OLEDB+Excel. 根据需求,多数是对于表的数据的导入.于是 ...

  4. Linux下安装和配置java开发环境(jdk/eclipse/tomcat)

    第一步 安装jdk 1.进入usr目录 cd /usr 2.在usr目录下建立java安装目录 mkdir java 3.将jdk-6u24-linux-i586.bin拷贝到java目录下 cp j ...

  5. 问题解决:两台虚拟机不能互相ping通的原因

    要是两台虚拟机能够PING通下列要求缺一不可:1.你所设置的虚拟网络的网络号不能跟外面你正在使用的真实的网络号一样2.防火墙必须关闭3.你设置的那俩台虚拟机必须在同一网段内4.两台虚拟机的主机名不能相 ...

  6. mybatis like 查询

    SELECT * FROM user WHERE name like CONCAT('%',#{name},'%')

  7. windows系统下在dos命令行kill掉被占用的pid

    备忘 1.开始-->运行-->cmd 2.命令行输入: netstat -ano I findstr 端口(被占用的端口号) 3.输入: tasklist | findstr 端口(获取步 ...

  8. open_clientfd(char* hostname,int port)和open_listenfd(int port)

    #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h&g ...

  9. JS的IE和FF兼容性问题汇总

    转自:蓝色理想 以下以 IE 代替 Internet Explorer,以 MF 代替 Mozilla FF 一.函数和方法差异 1. getYear()方法 [分析说明]先看一下以下代码: var ...

  10. SSO单点登陆

    一句话,就是能让各个不同的域名带回相同的认证信息即可.实现方法,就是把其中一个登陆后,把认证的信息分别保存在不同域名下的 cookie,当在验证是否登陆时,验证 cookie,如果是子域名,这个则直接 ...