poj 2318 向量的叉积二分查找
| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 9350 | Accepted: 4451 |
Description
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
分析:做题目比看题目容易多了,这JB英文真抽象,判断点在哪一块区域,根据向量的叉积,顺着第一个向量v看,如果w在左边,那么v和w的叉积大于0,否则小于0。
#include <iostream>
#include <cstdio>
#include <vector>
#include <string.h>
using namespace std; struct Point
{
int x,y;
Point(){}
Point(int x,int y):x(x),y(y) {}
}; typedef Point Vector;
Vector operator -(Point A,Point B){return Vector(A.x-B.x,A.y-B.y);}
int Cross(Vector A,Vector B){ return A.x*B.y-A.y*B.x;} struct Line
{
Point A,B;
}; vector<Line> v;
int num[5005]; int BinarySearch(Point P,int L,int R)
{
int mid=(L+R)>>1;
if(R-L==1) mid++;
Vector v1=v[mid].B-v[mid].A,v2=P-v[mid].A,v3;
if(Cross(v1,v2) < 0)
{
v3=v[mid-1].B-v[mid-1].A;
v2=P-v[mid-1].A;
if(Cross(v3,v2) > 0)
return mid-1;
else
return BinarySearch(P,L,mid);
}
else
return BinarySearch(P,mid,R);
} int main()
{
int i,n,m,x1,y1,x2,y2;
Line LL;
Point P;
int flag=0;
while(scanf("%d",&n),n)
{
if(flag) printf("\n");
flag=1;
v.clear();
memset(num,0,sizeof(num));
scanf("%d %d %d %d %d",&m,&x1,&y1,&x2,&y2);
LL.A.x=x1;LL.A.y=y1;LL.B.x=x1;LL.B.y=y2;
v.push_back(LL);
for(i=0;i<n;i++)
{
scanf("%d %d",&LL.A.x,&LL.B.x);
v.push_back(LL);
}
LL.A.x=x2;LL.B.x=x2;
v.push_back(LL);
for(i=0;i<m;i++)
{
scanf("%d %d",&P.x,&P.y);
num[BinarySearch(P,0,n+1)]++;
}
for(i=0;i<=n;i++) printf("%d: %d\n",i,num[i]);
}
return 0;
}
poj 2318 向量的叉积二分查找的更多相关文章
- 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 1064 Cable master(二分查找+精度)(神坑题)
POJ 1064 Cable master 一开始把 int C(double x) 里面写成了 int C(int x) ,莫名奇妙竟然过了样例,交了以后直接就wa. 后来发现又把二分查找的判断条 ...
- POJ 2318 TOYS 利用叉积判断点在线段的那一侧
题意:给定n(<=5000)条线段,把一个矩阵分成了n+1分了,有m个玩具,放在为位置是(x,y).现在要问第几个位置上有多少个玩具. 思路:叉积,线段p1p2,记玩具为p0,那么如果(p1p2 ...
- POJ 1019:Number Sequence 二分查找
Number Sequence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 36013 Accepted: 10409 ...
- 【POJ 2318】TOYS 叉积
用叉积判断左右 快速读入写错了卡了3小时hhh #include<cmath> #include<cstdio> #include<cstring> #includ ...
- [ACM] poj 2456 Aggressive cows (二分查找)
Aggressive cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5436 Accepted: 2720 D ...
- [ACM] poj 1064 Cable master (二分查找)
Cable master Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21071 Accepted: 4542 Des ...
- POJ 3258 River Hopscotch(二分查找答案)
一个不错的二分,注释在代码里 #include <stdio.h> #include <cstring> #include <algorithm> #include ...
随机推荐
- 如何在ABAP里用函数式编程思想打印出非波拉契Fibonacci(数列)
在JavaScript里可以用ES6提供的FunctionGenerator这种黑科技来打印非波拉契数列,具体细节参考我这篇文章. 在ABAP里也有很多种方式实现这个需求. 下面这个report分别用 ...
- kvc to nsdata
[NSKeyedArchiver archivedDataWithRootObject:arr]; [NSKeyedUnarchiver unarchiveObjectWithData: ...
- Asp.Net Core 入门(六)—— 路由
Asp.Net Core MVC的路由在Startup.cs文件中的Configure方法中进行配置,使其加入到Http请求管道中,如果不配置,那么我们所发送的请求无法得到象应. 那么该怎么配置Asp ...
- EF关于报错Self referencing loop detected with type的原因以及解决办法
1)具体报错 { "Message": "出现错误.", "ExceptionMessage": "“ObjectContent` ...
- 玩转ApplicationContextAware
当一个类实现了这个接口之后,这个类就可以方便地获得 ApplicationContext 中的所有bean.换句话说,就是这个类可以直接获取Spring配置文件中,所有有引用到的bean对象.结合工厂 ...
- (43)zabbix报警媒介介绍
zabbix触发器到了要发送通知的情况下,需要一个中间介质来接收并传递它的消息给运维们,以往用nagios,通常用脚本发送邮件或者发送飞信来达到报警.这个脚本实际上就是一个媒介了. zabbix有如下 ...
- C++实现简易单向链表
#include <iostream> #include <stdlib.h> #include <stdbool.h> using namespace std; ...
- 解决windows管理员已阻止你运行此应用问题
按WIN+R键,打开“运行”,然后输入“gpedit.msc",就是打开组策略,这个在控制面板中也可以打开. 在组策略里找到“计算机配置”-“Windows设置”-“安全设置”-“本地策略” ...
- Spring中线程池的使用
<bean id="threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent ...
- LeetCode(121) Best Time to Buy and Sell Stock
题目 Say you have an array for which the ith element is the price of a given stock on day i. If you we ...