简单几何(点与线段的位置) POJ 2318 TOYS && POJ 2398 Toy Storage
题意:POJ 2318 有一个长方形,用线段划分若干区域,给若干个点,问每个区域点的分布情况
分析:点和线段的位置判断可以用叉积判断。给的线段是排好序的,但是点是无序的,所以可以用二分优化。用到了叉积
- /************************************************
- * Author :Running_Time
- * Created Time :2015/10/23 星期五 11:38:18
- * File Name :POJ_2318.cpp
- ************************************************/
- #include <cstdio>
- #include <algorithm>
- #include <iostream>
- #include <sstream>
- #include <cstring>
- #include <cmath>
- #include <string>
- #include <vector>
- #include <queue>
- #include <deque>
- #include <stack>
- #include <list>
- #include <map>
- #include <set>
- #include <bitset>
- #include <cstdlib>
- #include <ctime>
- using namespace std;
- #define lson l, mid, rt << 1
- #define rson mid + 1, r, rt << 1 | 1
- typedef long long ll;
- const int N = 5e3 + 10;
- const int INF = 0x3f3f3f3f;
- const int MOD = 1e9 + 7;
- const double EPS = 1e-10;
- struct Point { //点的定义
- double x, y;
- Point (double x=0, double y=0) : x (x), y (y) {}
- };
- typedef Point Vector; //向量的定义
- Point read_point(void) { //点的读入
- double x, y;
- scanf ("%lf%lf", &x, &y);
- return Point (x, y);
- }
- double polar_angle(Vector A) { //向量极角
- return atan2 (A.y, A.x);
- }
- double dot(Vector A, Vector B) { //向量点积
- return A.x * B.x + A.y * B.y;
- }
- double cross(Vector A, Vector B) { //向量叉积
- return A.x * B.y - A.y * B.x;
- }
- int dcmp(double x) { //三态函数,减少精度问题
- if (fabs (x) < EPS) return 0;
- else return x < 0 ? -1 : 1;
- }
- Vector operator + (Vector A, Vector B) { //向量加法
- return Vector (A.x + B.x, A.y + B.y);
- }
- Vector operator - (Vector A, Vector B) { //向量减法
- return Vector (A.x - B.x, A.y - B.y);
- }
- Vector operator * (Vector A, double p) { //向量乘以标量
- return Vector (A.x * p, A.y * p);
- }
- Vector operator / (Vector A, double p) { //向量除以标量
- return Vector (A.x / p, A.y / p);
- }
- bool operator < (const Point &a, const Point &b) { //点的坐标排序
- return a.x < b.x || (a.x == b.x && a.y < b.y);
- }
- bool operator == (const Point &a, const Point &b) { //判断同一个点
- return dcmp (a.x - b.x) == 0 && dcmp (a.y - b.y) == 0;
- }
- double length(Vector A) { //向量长度,点积
- return sqrt (dot (A, A));
- }
- double angle(Vector A, Vector B) { //向量转角,逆时针,点积
- return acos (dot (A, B) / length (A) / length (B));
- }
- double area_triangle(Point a, Point b, Point c) { //三角形面积,叉积
- return fabs (cross (b - a, c - a)) / 2.0;
- }
- Vector rotate(Vector A, double rad) { //向量旋转,逆时针
- return Vector (A.x * cos (rad) - A.y * sin (rad), A.x * sin (rad) + A.y * cos (rad));
- }
- Vector nomal(Vector A) { //向量的单位法向量
- double len = length (A);
- return Vector (-A.y / len, A.x / len);
- }
- Point point_inter(Point p, Vector V, Point q, Vector W) { //两直线交点,参数方程
- Vector U = p - q;
- double t = cross (W, U) / cross (V, W);
- return p + V * t;
- }
- double dis_to_line(Point p, Point a, Point b) { //点到直线的距离,两点式
- Vector V1 = b - a, V2 = p - a;
- return fabs (cross (V1, V2)) / length (V1);
- }
- double dis_to_seg(Point p, Point a, Point b) { //点到线段的距离,两点式
- if (a == b) return length (p - a);
- Vector V1 = b - a, V2 = p - a, V3 = p - b;
- if (dcmp (dot (V1, V2)) < 0) return length (V2);
- else if (dcmp (dot (V1, V3)) > 0) return length (V3);
- else return fabs (cross (V1, V2)) / length (V1);
- }
- Point point_proj(Point p, Point a, Point b) { //点在直线上的投影,两点式
- Vector V = b - a;
- return a + V * (dot (V, p - a) / dot (V, V));
- }
- bool inter(Point a1, Point a2, Point b1, Point b2) { //判断线段相交,两点式
- double c1 = cross (a2 - a1, b1 - a1), c2 = cross (a2 - a1, b2 - a1),
- c3 = cross (b2 - b1, a1 - b1), c4 = cross (b2 - b1, a2 - b1);
- return dcmp (c1) * dcmp (c2) < 0 && dcmp (c3) * dcmp (c4) < 0;
- }
- bool on_seg(Point p, Point a1, Point a2) { //判断点在线段上,两点式
- return dcmp (cross (a1 - p, a2 - p)) == 0 && dcmp (dot (a1 - p, a2 - p)) < 0;
- }
- double area_poly(Point *p, int n) { //多边形面积
- double ret = 0;
- for (int i=1; i<n-1; ++i) {
- ret += fabs (cross (p[i] - p[0], p[i+1] - p[0]));
- }
- return ret / 2;
- }
- struct Line {
- Point s, e;
- Line () {}
- Line (Point s, Point e) : s (s), e (e) {}
- };
- Line board[N];
- Point toy[N];
- Point b, e;
- int ans[N];
- int main(void) {
- int n, m;
- bool fir = true;
- while(scanf ("%d", &n) == 1) {
- if (!n) break;
- if (fir) fir = false;
- else puts ("");
- scanf ("%d", &m);
- b = read_point ();
- e = read_point ();
- double U, L;
- for (int i=0; i<n; ++i) {
- scanf ("%lf%lf", &U, &L);
- board[i] = Line (Point (U, b.y), Point (L, e.y));
- }
- board[n] = Line (Point (e.x, b.y), Point (e.x, e.y));
- for (int i=0; i<m; ++i) {
- toy[i] = read_point ();
- }
- memset (ans, 0, sizeof (ans));
- for (int i=0; i<m; ++i) {
- if (toy[i].x < b.x || toy[i].x > e.x || toy[i].y > b.y || toy[i].y < e.y) continue;
- int l = 0, r = n, mid, tmp = 0;
- while (l <= r) {
- mid = (l + r) >> 1;
- if (cross (board[mid].s - toy[i], board[mid].e - toy[i]) < 0) {
- tmp = mid;
- r = mid - 1;
- }
- else l = mid + 1;
- }
- ans[tmp]++;
- }
- for (int i=0; i<=n; ++i) {
- printf ("%d: %d\n", i, ans[i]);
- }
- }
- return 0;
- }
题意:POJ 2398 和上面那题没什么区别,回答的问题不同,线段无序先排序。
- /************************************************
- * Author :Running_Time
- * Created Time :2015/10/23 星期五 11:38:18
- * File Name :POJ_2398.cpp
- ************************************************/
- #include <cstdio>
- #include <algorithm>
- #include <iostream>
- #include <sstream>
- #include <cstring>
- #include <cmath>
- #include <string>
- #include <vector>
- #include <queue>
- #include <deque>
- #include <stack>
- #include <list>
- #include <map>
- #include <set>
- #include <bitset>
- #include <cstdlib>
- #include <ctime>
- using namespace std;
- #define lson l, mid, rt << 1
- #define rson mid + 1, r, rt << 1 | 1
- typedef long long ll;
- const int N = 1e3 + 10;
- const int INF = 0x3f3f3f3f;
- const int MOD = 1e9 + 7;
- const double EPS = 1e-10;
- struct Point { //点的定义
- double x, y;
- Point (double x=0, double y=0) : x (x), y (y) {}
- };
- typedef Point Vector; //向量的定义
- Point read_point(void) { //点的读入
- double x, y;
- scanf ("%lf%lf", &x, &y);
- return Point (x, y);
- }
- double polar_angle(Vector A) { //向量极角
- return atan2 (A.y, A.x);
- }
- double dot(Vector A, Vector B) { //向量点积
- return A.x * B.x + A.y * B.y;
- }
- double cross(Vector A, Vector B) { //向量叉积
- return A.x * B.y - A.y * B.x;
- }
- int dcmp(double x) { //三态函数,减少精度问题
- if (fabs (x) < EPS) return 0;
- else return x < 0 ? -1 : 1;
- }
- Vector operator + (Vector A, Vector B) { //向量加法
- return Vector (A.x + B.x, A.y + B.y);
- }
- Vector operator - (Vector A, Vector B) { //向量减法
- return Vector (A.x - B.x, A.y - B.y);
- }
- Vector operator * (Vector A, double p) { //向量乘以标量
- return Vector (A.x * p, A.y * p);
- }
- Vector operator / (Vector A, double p) { //向量除以标量
- return Vector (A.x / p, A.y / p);
- }
- bool operator < (const Point &a, const Point &b) { //点的坐标排序
- return a.x < b.x || (a.x == b.x && a.y < b.y);
- }
- bool operator == (const Point &a, const Point &b) { //判断同一个点
- return dcmp (a.x - b.x) == 0 && dcmp (a.y - b.y) == 0;
- }
- double length(Vector A) { //向量长度,点积
- return sqrt (dot (A, A));
- }
- double angle(Vector A, Vector B) { //向量转角,逆时针,点积
- return acos (dot (A, B) / length (A) / length (B));
- }
- double area_triangle(Point a, Point b, Point c) { //三角形面积,叉积
- return fabs (cross (b - a, c - a)) / 2.0;
- }
- Vector rotate(Vector A, double rad) { //向量旋转,逆时针
- return Vector (A.x * cos (rad) - A.y * sin (rad), A.x * sin (rad) + A.y * cos (rad));
- }
- Vector nomal(Vector A) { //向量的单位法向量
- double len = length (A);
- return Vector (-A.y / len, A.x / len);
- }
- Point point_inter(Point p, Vector V, Point q, Vector W) { //两直线交点,参数方程
- Vector U = p - q;
- double t = cross (W, U) / cross (V, W);
- return p + V * t;
- }
- double dis_to_line(Point p, Point a, Point b) { //点到直线的距离,两点式
- Vector V1 = b - a, V2 = p - a;
- return fabs (cross (V1, V2)) / length (V1);
- }
- double dis_to_seg(Point p, Point a, Point b) { //点到线段的距离,两点式
- if (a == b) return length (p - a);
- Vector V1 = b - a, V2 = p - a, V3 = p - b;
- if (dcmp (dot (V1, V2)) < 0) return length (V2);
- else if (dcmp (dot (V1, V3)) > 0) return length (V3);
- else return fabs (cross (V1, V2)) / length (V1);
- }
- Point point_proj(Point p, Point a, Point b) { //点在直线上的投影,两点式
- Vector V = b - a;
- return a + V * (dot (V, p - a) / dot (V, V));
- }
- bool inter(Point a1, Point a2, Point b1, Point b2) { //判断线段相交,两点式
- double c1 = cross (a2 - a1, b1 - a1), c2 = cross (a2 - a1, b2 - a1),
- c3 = cross (b2 - b1, a1 - b1), c4 = cross (b2 - b1, a2 - b1);
- return dcmp (c1) * dcmp (c2) < 0 && dcmp (c3) * dcmp (c4) < 0;
- }
- bool on_seg(Point p, Point a1, Point a2) { //判断点在线段上,两点式
- return dcmp (cross (a1 - p, a2 - p)) == 0 && dcmp (dot (a1 - p, a2 - p)) < 0;
- }
- double area_poly(Point *p, int n) { //多边形面积
- double ret = 0;
- for (int i=1; i<n-1; ++i) {
- ret += fabs (cross (p[i] - p[0], p[i+1] - p[0]));
- }
- return ret / 2;
- }
- struct Line {
- Point s, e;
- Line () {}
- Line (Point s, Point e) : s (s), e (e) {}
- };
- bool cmp(Line A, Line B) {
- return A.s.x < B.s.x || (A.s.x == B.s.x && A.e.x < B.e.x);
- }
- Line board[N];
- Point toy[N];
- Point b, e;
- int ans[N];
- int main(void) {
- int n, m;
- while(scanf ("%d", &n) == 1) {
- if (!n) break;
- scanf ("%d", &m);
- b = read_point ();
- e = read_point ();
- double U, L;
- for (int i=0; i<n; ++i) {
- scanf ("%lf%lf", &U, &L);
- board[i] = Line (Point (U, b.y), Point (L, e.y));
- }
- board[n] = Line (Point (e.x, b.y), Point (e.x, e.y));
- sort (board, board+1+n, cmp);
- for (int i=0; i<m; ++i) {
- toy[i] = read_point ();
- }
- memset (ans, 0, sizeof (ans));
- for (int i=0; i<m; ++i) {
- if (toy[i].x < b.x || toy[i].x > e.x || toy[i].y > b.y || toy[i].y < e.y) continue;
- int l = 0, r = n, mid, tmp = 0;
- while (l <= r) {
- mid = (l + r) >> 1;
- if (cross (board[mid].s - toy[i], board[mid].e - toy[i]) < 0) {
- tmp = mid;
- r = mid - 1;
- }
- else l = mid + 1;
- }
- ans[tmp]++;
- }
- puts ("Box");
- for (int i=1; i<=m; ++i) {
- int cnt = 0;
- for (int j=0; j<=n; ++j) {
- if (ans[j] == i) ++cnt;
- }
- if (cnt) {
- printf ("%d: %d\n", i, cnt);
- }
- }
- }
- return 0;
- }
简单几何(点与线段的位置) POJ 2318 TOYS && POJ 2398 Toy Storage的更多相关文章
- 向量的叉积 POJ 2318 TOYS & POJ 2398 Toy Storage
POJ 2318: 题目大意:给定一个盒子的左上角和右下角坐标,然后给n条线,可以将盒子分成n+1个部分,再给m个点,问每个区域内有多少各点 这个题用到关键的一步就是向量的叉积,假设一个点m在 由ab ...
- 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
计算几何终于开坑了... 叉积+二分. #include<iostream> #include<cstdio> #include<cstring> #include ...
- POJ 2318 TOYS(叉积+二分)
题目传送门:POJ 2318 TOYS Description Calculate the number of toys that land in each bin of a partitioned ...
- poj 2398 Toy Storage(计算几何)
题目传送门:poj 2398 Toy Storage 题目大意:一个长方形的箱子,里面有一些隔板,每一个隔板都可以纵切这个箱子.隔板将这个箱子分成了一些隔间.向其中扔一些玩具,每个玩具有一个坐标,求有 ...
- 几何+点与线段的位置关系+二分(POJ2318)
TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10666 Accepted: 5128 Description ...
- POJ 2398 - Toy Storage 点与直线位置关系
Toy Storage Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5439 Accepted: 3234 Descr ...
- 2018.07.04 POJ 2398 Toy Storage(二分+简单计算几何)
Toy Storage Time Limit: 1000MS Memory Limit: 65536K Description Mom and dad have a problem: their ch ...
- POJ 2318 TOYS (叉乘判断)
<题目链接> 题目大意: 给出矩形4个点和n个挡板俩顶点的位置,这n个挡板将该矩形分成 n+1块区域,再给你m个点的坐标,然你输出每个区域内有几个点. 解题思路: 用叉乘即可简单判断点与直 ...
随机推荐
- cocos基础教程(3)cocos3.x版本目录结构介绍
简介 cocos2d-x-3.x版本进行了很多优化,比如:将TTF字体用Atlas缓存,节点重排序官方声称提升了10倍速度,查找.移除节点方面也提高了10%,拆分渲染层到独立的线程运行: 另外,coc ...
- 什么是A记录?MX记录?CNAME记录?它们都有些什么用途?
什么是A记录?什么是MX记录?CNAME记录又是什么?它们都有些什么用途? 好,下面就用我浅陋经验给大家介绍一下: 1. A记录:WEB服务器的IP指向 A (Address) 记录是用来指定主机名( ...
- hibernate中几个接口作用
1.Configuration 类 Configuration 类负责管理 Hibernate 的配置信息,包括数据库的URL.用户名.密码.JDBC驱动类,数据库Dialect,数据库连接池等,其加 ...
- 【OpenStack】OpenStack系列11之namaspace&openvswitch原理实践
Namespace实现网络隔离与互通 新建ns: ip netns add foo 查看ns: ip netns 查看ns详细配置: ip netns exec foo ip addr 设置ns内部l ...
- PYTHON实现HTTP摘要认证(DIGEST AUTHENTICATION)
参考: http://blog.csdn.net/kiwi_coder/article/details/28677651 http://blog.csdn.net/gl1987807/article/ ...
- windows2003批量添加和导出所有ip
批量添加IP 在cmd命令行下运行: FOR /L %i IN (130,1,190) DO netsh interface ip add address "本地连接" 192.1 ...
- Java for LeetCode 073 Set Matrix Zeroes
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. 解题思路: ...
- BestCoder13 1001.Beautiful Palindrome Number(hdu 5062) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5062 题目意思:给出 N,找出 1 - 10^N 中满足 Beautiful Palindrome N ...
- codeforces B. Levko and Permutation 解题报告
题目链接:http://codeforces.com/problemset/problem/361/B 题目意思:有n个数,这些数的范围是[1,n],并且每个数都是不相同的.你需要构造一个排列,使得这 ...
- HDU 5795 A Simple Nim (博弈) ---2016杭电多校联合第六场
A Simple Nim Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...