题目来源:http://poj.org/problem?id=2318

一个 矩阵 被分成多个 区域, 然后输入 多个点, 输出 每个区域点的 个数。 当寻找点 落在某个区域时, 用二分法。

#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
const int N =6000;
const double PI = 3.1415927;struct Point{int x,y;Point(){}Point(int x,int y):x(x),y(y){} // 构造函数,方便代码编写Point(const Point & p):x(p.x),y(p.y){}Point operator +(Point p){return Point(x+p.x,y+p.y);}Point operator-(Point p){return Point(x-p.x,y-p.y);}Point operator*(double d){return Point(x*d,y*d);}int operator*(Point p){  // 内积 点乘return x*p.x+ y*p.y;}int operator^(Point p){//  外积 叉乘return x*p.y-y*p.x;}friend ostream& operator<<(ostream& os,const Point& p ){os<<p.x<<" "<<p.y<<endl;return os;}friend istream& operator>>(istream& is, Point& p) {// Point 不能是常量,是变量is>>p.x>>p.y;return is;}
};
Point up[N];
Point low[N];
int num[N];
int n;
void bin_search(Point p)   // 二分法,寻找点所在的区域,用叉乘,注意结束条件是 left+1== right
{int left=0,mid;int right = n+1;while(left<=right){mid=(left+right) /2;int t=(up[mid]-low[mid])^(p-low[mid]);if( t >0  )right=mid;else if( t <0 )left=mid;if(left+1 == right ){num[left]++;break;}}
}
int main() {int m;int a,b,count=0;Point p;while(scanf("%d",&n)!=EOF && n){if(count) printf("\n");count=1;scanf("%d",&m);scanf("%d%d%d%d",&up[0].x,&up[0].y,&low[n+1].x,&low[n+1].y);low[0].x=up[0].x;up[n+1].x=low[n+1].x;for(int i=0;i<=n+1;i++){up[i].y=up[0].y;low[i].y=low[n+1].y;}for(int i=1;i<=n;i++){scanf("%d%d",&a,&b);up[i].x=a;low[i].x=b;}memset(num,0,sizeof(num));for(int i=1;i<=m;i++){scanf("%d%d",&p.x,&p.y);bin_search(p);}for(int i=0;i<=n;i++)printf("%d: %d\n",i,num[i]);}return 0;
}

转载于:https://www.cnblogs.com/zn505119020/p/3623613.html

寻找区域中有几个点 叉乘+二分 poj 2318相关推荐

  1. 计算区域中有t 个点的 区域有多少个+计算几何 + 叉乘+sort+ 二分 + map poj 2398 Toy Storage...

    题目来源:http://poj.org/problem?id=2398 分析: 计算区域中有t 个点的 区域有多少个. #include <cstdlib> #include <cs ...

  2. 基本的二分查找、寻找第一个和最后一个数的二分查找

    二分查找 1 二分查找的框架 2 寻找一个数(基本的二分搜索) 3 寻找左侧边界的二分搜索 4 寻找右侧边界的二分查找 5 合并 二分查找场景:有序数组寻找一个数.寻找左侧边界(有序数组等一个等目标数 ...

  3. LeetCode 154. 寻找旋转排序数组中的最小值 II (二分)

    154. 寻找旋转排序数组中的最小值 II 题意 给定一个包含重复元素的升序旋转数组 找出旋转数组的最小值 二分法 class Solution {public int findMin(int[] n ...

  4. LeetCode 153. 寻找旋转排序数组中的最小值(二分)

    153. 寻找旋转排序数组中的最小值 题意 给定一个无重复元素的升序旋转数组 找出旋转数组的最小值 二分法 mid是向下取整:left相对于mid移动 只要中值小于nums[right],说明最小值一 ...

  5. 区域判断hdu 3681 Prison Break bfs+二分+dp

    时间紧张,先记一笔,后续优化与完善. 这个是2010杭州区域赛的目题. bfs出最短路,二分谜底,dp判断可行性. #include <iostream> #include <cst ...

  6. leetcode 153. Find Minimum in Rotated Sorted Array | 153. 寻找旋转排序数组中的最小值(二分查找)

    题目 https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/ 题解 使用二分法,不断地删掉 数组左边的增序列 和 数组右 ...

  7. leetcode 153. 寻找旋转排序数组中的最小值(二分查找)

    已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 ...

  8. LeetCode 4. 寻找两个有序数组的中位数(二分查找,难)

    文章目录 1. 题目 2. 解题 2.1 合并数组 2.2 优化2.1解法,双指针 2.3 二分法(找第k个数) 2.4 切分法 1. 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 n ...

  9. LeetCode4寻找两个有序数组的中位数(二分查找+分治)

    目录 1.题目 2.分析 3.代码 二分查找:绝大多数二分查找问题利用的是单调性,也有一些例外)或者题目本身蕴含的可以逐渐缩小问题规模的特性解决问题.时间复杂度log级. 分治法的设计思想是:将一个难 ...

最新文章

  1. 再次理解信号采样定理(低通抽样定理)
  2. STM32F103C8T6
  3. 户外私密Party| 在大峡谷中聊点平时不能聊的产品干货(报名结束)
  4. 有重复元素的排列问题pascal题解
  5. Servlet的学习(四)
  6. Asp.net Core Jenkins Docker 实现一键化部署
  7. 关于c语言的基本知识,第二章_关于C语言的基本知识.ppt
  8. android编程任务进度条,Android应用开发之AsyncTask 处理耗时操作和显示进度条
  9. 深度学习中的梯度下降算法
  10. 如何将所有音乐从 iPhone传输到Mac?
  11. 汉语转拼音和五笔简码
  12. 手把手搭建K3cloud插件开发环境
  13. 堆积柱形图显示总数_excel堆积柱形图如何显示总数
  14. 网站原创文章被盗用怎么办?
  15. unbuntu samba共享文件夹
  16. Python与Qt UI的图形界面编程(三)
  17. python基础学习与应用
  18. 网口up不起来问题排查
  19. 第三代计算机期间出现了什么问题,第三代电子计算机使用的电子元件是什么_常见问题解析...
  20. 图解MySQL在Linux下的安装与配置

热门文章

  1. 说说报表工具的无编码定制能力
  2. bitbucket迁移
  3. 简单搜索(多位自幂数)+数列网站
  4. TreeView获取目录下的所有文件
  5. asp.net在线预览txt文件(简单实现)
  6. 全球隔夜主要金融市场回顾
  7. 【转】【QT】 Threads, Events and QObjects
  8. 12月份最后一期天下足球
  9. 用神经网络分类连续与离散
  10. 282021年高考成绩查询方法,往年高考成绩怎么查询 查询成绩的方法