POJ 2318 TOYS (叉乘判断)
<题目链接>
题目大意:
给出矩形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 (叉乘判断)的更多相关文章
- POJ 2318 TOYS 利用叉积判断点在线段的那一侧
题意:给定n(<=5000)条线段,把一个矩阵分成了n+1分了,有m个玩具,放在为位置是(x,y).现在要问第几个位置上有多少个玩具. 思路:叉积,线段p1p2,记玩具为p0,那么如果(p1p2 ...
- POJ 2318 TOYS(叉积+二分)
题目传送门:POJ 2318 TOYS Description Calculate the number of toys that land in each bin of a partitioned ...
- poj 2318 TOYS (二分+叉积)
http://poj.org/problem?id=2318 TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 101 ...
- 简单几何(点与线段的位置) 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 & 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个玩具的坐标是已知的,问最后每一个区域 ...
- TOYS POJ 2318 计算几何 叉乘的应用
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 15060 Accepted: 7270 Description Calc ...
- POJ 2318 TOYS (计算几何,叉积判断)
TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8661 Accepted: 4114 Description ...
随机推荐
- Pytorch中的torch.cat()函数
cat是concatnate的意思:拼接,联系在一起. 先说cat( )的普通用法 如果我们有两个tensor是A和B,想把他们拼接在一起,需要如下操作: C = torch.cat( (A,B),0 ...
- Linux下创建C函数库
http://blog.163.com/hitperson@126/blog/static/130245975201151552938133 http://blog.sina.com.cn/s/blo ...
- proxysql 系列~审核功能
一 简介:今天我们来探讨下具体的审核功能 二 平台审计功能 一 proxysql 设置 set mysql-eventslog_filename = '/data/ProxySQL/log/sql. ...
- joomla安装
最开始我以为是我电脑反映慢.傻傻的等了很久.因为我在sae上面初始化成功了.只是差两张表而已.等了很久很久.也试了好几次.反正就是卡在创建数据表那里.突然我想到在sae初始化数据库的时候有两种模式In ...
- maven插件的使用
maven插件官网: https://maven.apache.org/plugins/index.html 1.JDK插件的使用 <build> <plugins> < ...
- Jetson tk1 hash sum mismatch
sudo apt-get update遭遇Hash Sum Mismatch 修改DNS服务器地址: sudo gedit /etc/resolv.conf 解决办法: 在装有goagent的情况下: ...
- ubuntu 14.04界面美化
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABVYAAAMACAIAAABAXKuVAAAAA3NCSVQICAjb4U/gAAAgAElEQVR4Xu
- Oracle11g的database 和client的区别是什么?
由于工作需要,刚开始接触oracle数据库,完全小白,下载的时候看到有database和client两种类型可供下载,一时不知如何是好,于是网上询问得知其中区别,在此记录一下自己的无知. “datab ...
- svn使用openldap验证apache访问方式
启用svn服务器的sasl验证机制 1.安装cyrus-sasl认证包 # yum install -y *sasl* # rpm -qa|grep sasl cyrus-sasl-2.1.23-15 ...
- FreeSWITCH Git版本管理
由于测试FreeSWITCH不同版本的需要,研究了下Git的使用,通过Git来管理所有的版本,方便了测试.以下就总结下具体的使用方法: 其中:git clone ..是现在git仓库:git tag ...