poj 2318 TOYS (二分+叉积)
http://poj.org/problem?id=2318
| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 10178 | Accepted: 4880 |
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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <ctype.h>
#define eps 1e-6
#define MAX 5010 using namespace std; typedef struct
{
double x,y;
}point;
typedef struct
{
point a,b;
}line; line li[MAX];
point p[MAX];
int str[MAX]; bool dy(double x,double y){ return x>y+eps; }
bool xy(double x,double y){ return x<y-eps; }
bool dyd(double x,double y){ return x>y-eps; }
bool xyd(double x,double y){ return x<y+eps; }
bool dd(double x,double y){ return fabs(x-y)<eps; } double crossProduct(point a,point b,point c)
{
return (c.x-a.x)*(b.y-a.y)-(c.y-a.y)*(b.x-a.x);
} void BSearch(point a,int n)
{
int l=,r=n-;
while(l<r)
{
int mid=(l+r)/;
if(crossProduct(li[mid].a,a,li[mid].b)>) l=mid+;
else r=mid;
}
if(crossProduct(li[l].a,a,li[l].b)<)str[l]++;
else str[l+]++;
} int main()
{
int n,m,x1,x2,y1,y2;
int i,j;
int part1,part2; point tmp;
while(scanf("%d",&n)!=EOF&&n)
{
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
memset(str,,sizeof(str));
for(i=;i<n;i++)
{
scanf("%d%d",&part1,&part2);
li[i].a.x=part1;
li[i].a.y=y1;
li[i].b.x=part2;
li[i].b.y=y2;
}
for(i=;i<m;i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
BSearch(p[i],n);
}
for(i=;i<=n;i++)
{
printf("%d: %d\n",i,str[i]);
}
printf("\n");
}
return ;
}
这个暴力的不超时……
#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int MAX = ;
struct SEG{
int x1,y1,x2,y2;
};
SEG s[MAX];
struct point{
int x,y;
};
point toy[MAX];
int sum[MAX];
int crossProduct(point a,point b,point c)//向量 ac 在 ab 的方向
{
return (c.x - a.x)*(b.y - a.y) - (b.x - a.x)*(c.y - a.y);
}
bool inBox(point t,SEG ls,SEG rs)
{
point a,b,c,d;
a.x = ls.x1; a.y = ls.y1;
b.x = ls.x2; b.y = ls.y2;
c.x = rs.x2; c.y = rs.y2;
d.x = rs.x1; d.y = rs.y1;
if( crossProduct(b,t,c) >= && crossProduct(c,t,d) >=
&& crossProduct(d,t,a) >= && crossProduct(a,t,b) >= )
return true;
return false;
}
int main()
{
int n,m,x1,y1,x2,y2,a,b;
while( ~scanf("%d",&n) && n )
{
memset(sum,,sizeof(sum));
scanf("%d %d %d %d %d",&m,&x1,&y1,&x2,&y2);
s[].x1 = x1; s[].y1 = y1;
s[].x2 = x1; s[].y2 = y2;
for(int i=; i<=n; i++)
{
scanf("%d %d",&a,&b);
s[i].x1 = a; s[i].y1 = y1;
s[i].x2 = b; s[i].y2 = y2;
}
n++;
s[n].x1 = x2; s[n].y1 = y1;
s[n].x2 = x2; s[n].y2 = y2;
for(int i=; i<m; i++)
scanf("%d %d",&toy[i].x,&toy[i].y);
for(int i=; i<m; i++)
for(int k=; k<n; k++)
if( inBox(toy[i],s[k],s[k+]) )
{
sum[k]++;
break;
}
for(int i=; i<n; i++)
printf("%d: %d/n",i,sum[i]);
printf("/n");
}
return ;
}
poj 2318 TOYS (二分+叉积)的更多相关文章
- 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个玩具(可以看成点)放在这 ...
- POJ 2318 TOYS 利用叉积判断点在线段的那一侧
题意:给定n(<=5000)条线段,把一个矩阵分成了n+1分了,有m个玩具,放在为位置是(x,y).现在要问第几个位置上有多少个玩具. 思路:叉积,线段p1p2,记玩具为p0,那么如果(p1p2 ...
- POJ 2318 TOYS | 二分+判断点在多边形内
题意: 给一个矩形的区域(左上角为(x1,y1) 右下角为(x2,y2)),给出n对(u,v)表示(u,y1) 和 (v,y2)构成线段将矩形切割 这样构成了n+1个多边形,再给出m个点,问每个多边形 ...
- 向量的叉积 POJ 2318 TOYS & POJ 2398 Toy Storage
POJ 2318: 题目大意:给定一个盒子的左上角和右下角坐标,然后给n条线,可以将盒子分成n+1个部分,再给m个点,问每个区域内有多少各点 这个题用到关键的一步就是向量的叉积,假设一个点m在 由ab ...
- poj 2318 TOYS & poj 2398 Toy Storage (叉积)
链接:poj 2318 题意:有一个矩形盒子,盒子里有一些木块线段.而且这些线段坐标是依照顺序给出的. 有n条线段,把盒子分层了n+1个区域,然后有m个玩具.这m个玩具的坐标是已知的,问最后每一个区域 ...
- 简单几何(点与线段的位置) POJ 2318 TOYS && POJ 2398 Toy Storage
题目传送门 题意:POJ 2318 有一个长方形,用线段划分若干区域,给若干个点,问每个区域点的分布情况 分析:点和线段的位置判断可以用叉积判断.给的线段是排好序的,但是点是无序的,所以可以用二分优化 ...
- POJ 2318 TOYS && POJ 2398 Toy Storage(几何)
2318 TOYS 2398 Toy Storage 题意 : 给你n块板的坐标,m个玩具的具体坐标,2318中板是有序的,而2398无序需要自己排序,2318要求输出的是每个区间内的玩具数,而231 ...
- POJ 2318 TOYS (叉积+二分)
题目: Description Calculate the number of toys that land in each bin of a partitioned toy box. Mom and ...
随机推荐
- android 学习随笔六(网络要求及配置)
android在4.0之后已经不允许在主线程执行http请求了. 主线程阻塞,应用会停止刷新界面,停止响应用户任何操作,耗时操作不要写在主线程 只有主线程才能修改UI ANR异常:Applicat ...
- linux设备驱动归纳总结(三):7.异步通知fasync【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-62725.html linux设备驱动归纳总结(三):7.异步通知fasync xxxxxxxxxxx ...
- mmap DMA【转】
转自:http://blog.csdn.net/lihaoweiv/article/details/6275241 第 13 章 mmap 和 DMA 本章将深入探讨 Linux 内存管理部分,并强 ...
- C# 控制连接超时
首先连接超时分为三种,TCP Connection to SQL Server -> SqlConnection.Open -> SqlCommand.Execute先说第二种超时,sql ...
- 如何为github上的项目添加gif效果图
一.制作gif图片 如何制作可以参考: http://www.jianshu.com/p/27ec6375b8ab?utm_campaign=maleskine&utm_content=not ...
- CodeIgniter配置之config
配置说明 $config['language']:指定项目语言包.需要注意的时Codeigniter自带的类库错误提示语言包位于/system/language/english/目录下,当这里配置非e ...
- poj2888 Magic Bracelet
给你一个正n(<10^9)边形和m(<10)种色料,要求给正n边形顶点染色并且规定k组颜色对不能相邻, 输入保证n与mod互质,计数染色总方案数(绕图形中心旋转后相同的方案算一种)对mod ...
- Unity-Animator深入系列---StateMachineBehaviour初始化时间测试
回到 Animator深入系列总目录 结果和想的有点出入 测试结果: 1.SMB初始化会被调用多次,次数不可控,当Animator组件重复开关则重复初始化. 2.SMB支持构造函数 MyClass p ...
- JAVA基础知识之网络编程——-基于AIO的异步Socket通信
异步IO 下面摘子李刚的<疯狂JAVA讲义> 按照POSIX标准来划分IO,分为同步IO和异步IO.对于IO操作分为两步,1)程序发出IO请求. 2)完成实际的IO操作. 阻塞IO和非阻塞 ...
- 自用java字符串工具类
不断封装一些常用的字符串操作加到这个工具类里,不断积累: package com.netease.lede.qa.util; import java.text.ParseException; impo ...