<题目链接>

题目大意:

给出矩形4个点和n个挡板俩顶点的位置,这n个挡板将该矩形分成 n+1块区域,再给你m个点的坐标,然你输出每个区域内有几个点。

解题思路:

用叉乘即可简单判断点与直线的位置关系,对每一个点,遍历挡板,直到找到符合的区间为止。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std; const int maxn=+;
int map[maxn+];
int n,m; struct Point
{
int x,y;
Point(int a=,int b=):x(a),y(b){}
Point operator - (const Point&b)const
{
return Point(x-b.x,y-b.y);
} int operator ^(const Point&b)const //重载叉乘符号
{
return x*b.y-y*b.x; //两向量叉乘公式
}
}; struct Line
{
Point a,b;
Line(){}
Line(Point m,Point n):a(m),b(n){}
};
Line arr[maxn+];
Point brr[maxn+];
// 求叉积
int Mulcross(Point p0,Point p1,Point p2)
{
return (p1-p0)^(p2-p0); //计算
} //不一定是这个顺序计算,只要保证两个向量有共同的顶点,和下面的>0判断相应改变即可,你可以以p0或p2为顶点 void juge(Point goal)
{
// 从第一条线向后遍历,如果点在该线左面,则该下标total++
for(int i=;i<n;i++)
{
//这里根据叉乘判断点与直线的方向,主要的依据就是两个向量叉乘的右手定则,若朝平面下,则<0,若朝平面上则>0,然后自己画图理解一下
if(Mulcross(arr[i].b,goal,arr[i].a)>)continue; // 如果点在挡板的右边,则继续看下一个区间是否符合
else
{
map[i]+=; //如果点在挡板的左边,那么当前区间点的个数+1
return;
}
}
// 找到最后都没找到,就是在最后一个区域
map[n]+=;
} int main()
{
int ncase=;
while(scanf("%d",&n)!=EOF,n)
{
memset(map,,sizeof(map));
int marx1,mary1,marx2,mary2;
scanf("%d%d%d%d%d",&m,&marx1,&mary1,&marx2,&mary2);
for(int i=;i<n;i++) //挡板的坐标
{
int x1,x2;
scanf("%d %d",&x1,&x2);
arr[i].a.x=x1;arr[i].a.y=mary1;
arr[i].b.x=x2;arr[i].b.y=mary2;
} for(int i=;i<m;i++) //点的坐标
{
int a,b;
scanf("%d %d",&a,&b);
juge(Point(a,b)); //找到点的区间
} for(int i=;i<=n;i++)
{
printf("%d: %d\n",i,map[i]);
}
printf("\n");
}
return ;
}

二分查找的方法

<转载于>

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>
#include <set>
#include <string>
#include <math.h> using namespace std;
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) //计算p0p1 X p0p2
{
return (p1-p0)^(p2-p0);
} const int MAXN = ;
Line line[MAXN];
int ans[MAXN]; 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);
int Ui,Li;
for(int i = ;i < n;i++)
{
scanf("%d%d",&Ui,&Li);
line[i] = Line(Point(Ui,y1),Point(Li,y2));
}
line[n] = Line(Point(x2,y1),Point(x2,y2));
int x,y;
Point p;
memset(ans,,sizeof(ans));
while( m-- )
{
scanf("%d%d",&x,&y);
p = Point(x,y);
int l = ,r = n;
int tmp;
while( l <= r)
{
int mid = (l + r)/;
if(xMult(p,line[mid].s,line[mid].e) < )
{
tmp = mid;
r = mid - ;
}
else l = mid + ;
}
ans[tmp]++;
}
for(int i = ; i <= n;i++)
printf("%d: %d\n",i,ans[i]);
}
return ;
}

2018-08-01

POJ 2318 TOYS (叉乘判断)的更多相关文章

  1. POJ 2318 TOYS 利用叉积判断点在线段的那一侧

    题意:给定n(<=5000)条线段,把一个矩阵分成了n+1分了,有m个玩具,放在为位置是(x,y).现在要问第几个位置上有多少个玩具. 思路:叉积,线段p1p2,记玩具为p0,那么如果(p1p2 ...

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

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

  3. poj 2318 TOYS (二分+叉积)

    http://poj.org/problem?id=2318 TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 101 ...

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

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

  5. POJ 2318 TOYS && POJ 2398 Toy Storage(几何)

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

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

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

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

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

  8. TOYS POJ 2318 计算几何 叉乘的应用

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15060   Accepted: 7270 Description Calc ...

  9. POJ 2318 TOYS (计算几何,叉积判断)

    TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8661   Accepted: 4114 Description ...

随机推荐

  1. 一个DOS攻击木马的详细分析过程

    一个DOS攻击木马的详细分析过程 0×01 起因 网路流量里发现了大量的的1.exe的文件,而且一直在持续,第一感觉就像是一个木马程序,而且每个1.exe的MD5都不一样,对比发现只有几个字节不一样( ...

  2. SpringBoot启动方式讲解和部署war项目到tomcat9

    1.SpringBoot启动方式讲解和部署war项目到tomcat9简介:SpringBoot常见启动方式讲解和部署war项目Tomcat 1.ide启动 2.jar包方式启动 maven插件: &l ...

  3. Mybatis进阶学习笔记——动态代理方式开发Dao接口、Dao层(推荐第二种)

    1.原始方法开发Dao Dao接口 package cn.sm1234.dao; import java.util.List; import cn.sm1234.domain.Customer; pu ...

  4. Pytorch 入门之Siamese网络

    首次体验Pytorch,本文参考于:github and PyTorch 中文网人脸相似度对比 本文主要熟悉Pytorch大致流程,修改了读取数据部分.没有采用原作者的ImageFolder方法:   ...

  5. Linux内核调试方法【转】

    转自:http://www.cnblogs.com/shineshqw/articles/2359114.html kdb:只能在汇编代码级进行调试: 优点是不需要两台机器进行调试. gdb:在调试模 ...

  6. SharePoint 2010:“&”作为SharePoint账号密码引起的错误

    一朋友修改了SharePoint 2010系统账号密码,导致无法登陆.他的环境如下: 两台服务器:AD+SharePoint 2010 ,Sql Server 2008 r2 目标站点开启了Form登 ...

  7. Go语言规格说明书 之 变量声明(Variable/Short variable declarations)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...

  8. es6 属性及常用新属性汇总

    一.includes的作用: includes:判断isNotShowProIdArray数组里是否包含this.item.productid元素 ,若包含true !!: !!(a)的作用是将a强制 ...

  9. 彻底理解this指向-----实例分析

    this的指向在函数创建的时候是决定不了的,在调用的时候才能决定,谁调用的就指向谁,一定要搞清楚这个. 情况1:如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是wind ...

  10. 来自工程师的8项Web性能提升建议

    在互联网盛行的今天,越来越多的在线用户希望得到安全可靠并且快速的访问体验.针对Web网页过于膨胀以及第三脚本蚕食流量等问题,Radware向网站运营人员提出以下改进建议,帮助他们为用户提供最快最优质的 ...