象限极角排序

struct Point
{
    int id;
    LL x,y;
    Point(){}
    Point(LL x,LL y):x(x),y(y){}
    void Read(){scanf("%I64d%I64d",&x,&y);}
    LL operator^(const Point P)const{return x*P.y-y*P.x;}
    Point operator-(const Point P)const{return Point(x-P.x,y-P.y);}
}me[10],mos[1050],tmp[1050];
int quad(Point a)
{
    if(a.x>0 && a.y>=0) return 1;
    if(a.x<=0 && a.y>0) return 2;
    if(a.x<0 && a.y<=0) return 3;
    if(a.x>=0 && a.y<0) return 4;
}

bool cmp(Point a,Point b)
{
    int l1=quad(a),l2=quad(b);
    if(l1==l2)
    {
        LL c=a^b;
        return c<0LL || (c==0LL && a.x*a.x+a.y*a.y<b.x*b.x+b.y*b.y);
    }
    return l1<l2;
}
bool Equal(Point a,Point b)
{
    int l1=quad(a),l2=quad(b);
    return l1==l2&&(a^b)==0;
}
时间: 2024-10-13 06:58:57

象限极角排序的相关文章

【极角排序+双指针线性扫】2017多校训练七 HDU 6127 Hard challenge

acm.hdu.edu.cn/showproblem.php?pid=6127 [题意] 给定平面直角坐标系中的n个点,这n个点每个点都有一个点权 这n个点两两可以连乘一条线段,定义每条线段的权值为线段两端点点权的乘积 现在要过原点作一条直线,要求这条直线不经过任意一个给定的点 在所有n个点两两连成的线段中,计算与这条直线有交点的线段的权值和 最大化这个权值和并输出 题目保证,给定的n个点不重合且任意两个点的连线不经过原点 [思路] 一条经过原点的直线把n个点分成两个半平面A,B 假设A中的点权

极角排序详解

关于极角排序: 在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向). 对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r表示),θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对 (ρ,θ)就叫点M的极坐标. 那么给定平面上的一些点,把它们按照一个选定的中心点排成顺(逆)时针. 极角排序常用的四种方法: 在说四种方法之前,给出一会用到的函数和存储点的结构体 struct point//存储点 { double x

C. Nearest vectors--cf598C(极角排序)

http://codeforces.com/problemset/problem/598/C 题目大意: 给你你个向量  向量的起点都是从(0,0)开始的   求哪个角最小  输出这两个向量 这是第一次接触极角 一个函数图像上某一点到原点的距离就是极径,极径与x轴的夹角就是极角 按照极角排序   是从第三象限的最右边的开始是最小  一直逆时针转到第二象限的最右边 求极角差最小就行了 但是卡精度问题  把double换成long double   就好了  (我也不知道为什么) #include<

【计算几何】【极角排序】【二分】Petrozavodsk Summer Training Camp 2016 Day 6: Warsaw U Contest, XVI Open Cup Onsite, Sunday, August 28, 2016 Problem J. Triangles

平面上给你n(不超过2000)个点,问你能构成多少个面积在[A,B]之间的Rt三角形. 枚举每个点作为直角顶点,对其他点极角排序,同方向的按长度排序,然后依次枚举每个向量,与其对应的另一条直角边是单调的,可以用一个pointer做出来,然后可以得出那些同方向的向量的区间(这个代码好像有点问题,可能会退化,最好确定了一个LL之后,对一个方向的不要重复算RR.这里如果也改成二分就比较好,复杂度不会退化).然后通过二分可以得到A使得面积在[A,B]间的有哪些(其实这个因为也是单调的,好像也没必要二分,

poj 1696 Space Ant(极角排序)

Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3661   Accepted: 2281 Description The most exciting space discovery occurred at the end of the 20th century. In 1999, scientists traced down an ant-like creature in the planet Y19

极角排序详解:

极角排序详解 名词释义: 在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向).对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r表示),θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对 (ρ,θ)就叫点M的极坐标 四种极角排序代码详解: 1 struct point 2 { 3 double x,y; 4 }; 5 6 double cross(double x1,double y1,double x2,dou

极角排序常用方法

极角排序常用的四种方法: 写在前面:存储点的结构体和函数 1 struct point//存储点 2 { 3 double x,y; 4 }; 5 6 double cross(double x1,double y1,double x2,double y2) //计算叉积 7 { 8 return (x1*y2-x2*y1); 9 } 10 11 double compare(point a,point b,point c)//计算极角 12 { 13 return cross((b.x-a.x

极角排序

极角排序 所谓极角,指的就是以x轴正半轴为始边,逆时针转过的角,这个角的范围是[0,2π][0,2π]. 利用atan2函数 atan2(y,x),表示(x,y)这个点与原点连线,这条线与x轴正半轴的夹角,这里的这个极角的范围是[−π,π][−π,π]的,一二象限为正,三四象限为负.所以我们从小到大排完序后,实际上是第三象限→→第四象限→→第一象限→→第二象限. struct node { int x, y; double angle; bool operator<(const node &

极角排序+求锐角三角形个数——uva12123

这个版本还不能处理三点共线的情况(处理起来其实比较麻烦) 可以用atan2来排序(较为简单,但是精度误差大),也可以用叉积排序(比较优秀) atan2 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <cstdlib> using namespace std; typedef