二分+叉积判断方向 poj 2318 2398
// 题意:问你每个区域有多少个点
// 思路:数据小可以直接暴力
// 也可以二分区间 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <stdlib.h>
#include <cmath>
using namespace std;
typedef long long LL;
const LL inf = 1e18;
const int N = ; struct Point{
int x,y;
Point(){}
Point(int _x,int _y){
x=_x;y=_y;
}
Point operator -(const Point &b)const{
return Point(x-b.x,y-b.y);
}
int operator *(const Point &b)const{
return x*b.x+y*b.y;
}
int operator ^(const Point &b)const{
return x*b.y-y*b.x;
}
}; struct Line{
Point s,e;
Line(){}
Line(Point _s,Point _e){
s=_s,e=_e;
}
}; int xmult(Point p0,Point p1,Point p2){
return (p1-p0)^(p2-p0);
} Line line[N];
int ans[N];
int main(){
int n,m,x1,y1,x2,y2;
bool first = true;
while(~scanf("%d",&n)&&n){
if(first) first=false;
else printf("\n");
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
for(int i=;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
line[i]=Line(Point(x,y1),Point(y,y2));
}
line[n]=Line(Point(x2,y1),Point(x2,y2));
int x,y;
Point p;
memset(ans,,sizeof(ans));
int tem;
while(m--){
scanf("%d%d",&x,&y);
p = Point(x,y);
int l=,r=n,mid;
while(l<=r){
mid=(l+r)>>;
if(xmult(p,line[mid].s,line[mid].e)<){
tem=mid;
r=mid-;
}
else l=mid+;
}
ans[tem]++;
}
for(int i=;i<=n;i++) printf("%d: %d\n",i,ans[i]);
}
return ;
}
// POJ 2398和2318差不多 多了排序和统计输出 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <stdlib.h>
#include <cmath>
using namespace std;
typedef long long LL;
const LL inf = 1e18;
const int N = ; struct Point{
int x,y;
Point(){}
Point(int _x,int _y){
x=_x;y=_y;
}
Point operator -(const Point &b)const{
return Point(x-b.x,y-b.y);
}
int operator *(const Point &b)const{
return x*b.x+y*b.y;
}
int operator ^(const Point &b)const{
return x*b.y-y*b.x;
}
}; struct Line{
Point s,e;
Line(){}
Line(Point _s,Point _e){
s=_s,e=_e;
}
}; int xmult(Point p0,Point p1,Point p2){
return (p1-p0)^(p2-p0);
} bool cmp(Line a,Line b){
return a.s.x<b.s.x;
} Line line[N];
int ans[N];
int num[N];
int main(){
int n,m,x1,y1,x2,y2;
while(~scanf("%d",&n)&&n){
memset(num,,sizeof(num));
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
for(int i=;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
line[i]=Line(Point(x,y1),Point(y,y2));
}
line[n]=Line(Point(x2,y1),Point(x2,y2));
sort(line,line+n+,cmp);
int x,y;
Point p;
memset(ans,,sizeof(ans));
int tem;
while(m--){
scanf("%d%d",&x,&y);
p = Point(x,y);
int l=,r=n,mid;
while(l<=r){
mid=(l+r)>>;
if(xmult(p,line[mid].s,line[mid].e)<){
tem=mid;
r=mid-;
}
else l=mid+;
}
ans[tem]++;
}
for(int i=;i<=n;i++){
num[ans[i]]++;
}
printf("Box\n");
for(int i=;i<=n;i++) {
if(num[i]>)
printf("%d: %d\n",i,num[i]);
}
}
return ;
}
二分+叉积判断方向 poj 2318 2398的更多相关文章
- POJ 2318/2398 叉积性质
2318 2398 题意:给出n条线将一块区域分成n+1块空间,再给出m个点,询问这些点在哪个空间里. 思路:由于只要求相对位置关系,而对具体位置不关心,那么易使用叉积性质得到相对位置关系(左侧/右侧 ...
- POJ 2318--TOYS(二分找点,叉积判断方向)
TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17974 Accepted: 8539 Description ...
- TOYS - POJ 2318(计算几何,叉积判断)
题目大意:给你一个矩形的左上角和右下角的坐标,然后这个矩形有 N 个隔板分割成 N+1 个区域,下面有 M 组坐标,求出来每个区域包含的坐标数. 分析:做的第一道计算几何题目....使用叉积判断方 ...
- 向量的叉积 POJ 2318 TOYS & POJ 2398 Toy Storage
POJ 2318: 题目大意:给定一个盒子的左上角和右下角坐标,然后给n条线,可以将盒子分成n+1个部分,再给m个点,问每个区域内有多少各点 这个题用到关键的一步就是向量的叉积,假设一个点m在 由ab ...
- poj 2318 叉积+二分
TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13262 Accepted: 6412 Description ...
- POJ 2318 TOYS(叉积+二分)
题目传送门:POJ 2318 TOYS Description Calculate the number of toys that land in each bin of a partitioned ...
- poj 2318 TOYS & poj 2398 Toy Storage (叉积)
链接:poj 2318 题意:有一个矩形盒子,盒子里有一些木块线段.而且这些线段坐标是依照顺序给出的. 有n条线段,把盒子分层了n+1个区域,然后有m个玩具.这m个玩具的坐标是已知的,问最后每一个区域 ...
- poj 2318(叉积判断点在线段的哪一侧)
TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13120 Accepted: 6334 Description ...
- POJ 2318 TOYS【叉积+二分】
今天开始学习计算几何,百度了两篇文章,与君共勉! 计算几何入门题推荐 计算几何基础知识 题意:有一个盒子,被n块木板分成n+1个区域,每个木板从左到右出现,并且不交叉. 有m个玩具(可以看成点)放在这 ...
随机推荐
- go语言入门
Go语言最主要的特性: 自动垃圾回收 更丰富的内置类型 函数多返回值 错误处理 匿名函数和闭包 类型和接口 并发编程 反射 语言交互性 1.2.4 错误处理Go语言引入了3个关键字用 ...
- C# 常用对象的的修饰符
class(类) 1.internal 表示类只能在当然程序集中访问,类默认修饰符 2.public 表示所有地方都可以访问,与internal是互斥的 3.abstract 抽象类,不能被实例化,只 ...
- NSArray 初始化
//NSArray长度不可变所以初始化的时候就赋值,并且最后以nil结尾 //此外需要注意NSArray不能存放C语言的基础类型 NSObject *obj=[[NSObject alloc]init ...
- 机器学习 —— 概率图模型(Homework: MCMC)
除了精确推理之外,我们还有非精确推理的手段来对概率图单个变量的分布进行求解.在很多情况下,概率图无法简化成团树,或者简化成团树后单个团中随机变量数目较多,会导致团树标定的效率低下.以图像分割为例,如果 ...
- JVM学习笔记(二)------Java代码编译和执行的整个过程
Java代码编译是由Java源码编译器来完成,流程图如下所示: Java字节码的执行是由JVM执行引擎来完成,流程图如下所示: Java代码编译和执行的整个过程包含了以下三个重要的机制: Java源码 ...
- LTDFZ
开关稳压器
- lightOJ 1326 Race(第二类Stirling数)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1326 题意:有n匹马赛跑.问有多少种不同的排名结果.可以有多匹马的排名相同. 思路:排 ...
- [Codeforces673A]Bear and Game(水题,思路)
题目链接:http://codeforces.com/contest/673/problem/A 题意:一个人看一个90分钟的节目,然后告诉你一些有趣的时刻.这个人假如在15分钟内还没有看到有趣的时刻 ...
- oracle索引,索引的建立、修改、删除
索引,索引的建立.修改.删除 2007-10-05 13:29 来源: 作者: 网友评论 0 条 浏览次数 2986 索引索引是关系数据库中用于存放每一条记录的一种对象,主要目的是加快数据的读取速度和 ...
- UVa 10780 (质因数分解) Again Prime? No Time.
求mk整除n!,求k的最大值. 现将m分解质因数,比如对于素数p1分解出来的指数为k1,那么n!中能分解出多少个p1出来呢? 考虑10!中2的个数c:1~10中有10/2个数是2的倍数,c += 5: ...