#P3672. *【计算几何】点的角排序 Sort Points by Argument

*【计算几何】点的角排序 Sort Points by Argument

问题描述

给定 N N 个二维点 (x0,y0),(x1,y1),,(xN1,yN1)(x_0, y_0), (x_1, y_1), \dots, (x_{N-1}, y_{N-1}),请按 atan2(x,y)\operatorname{atan2}(x, y) 对其排序。
换言之,将这些点按逆时针顺序排序,起始于半直线 x0,y=0x \le 0, y = 0

注意:

  • atan2(x<0,y=0)=π\operatorname{atan2}(x < 0, y = 0) = \pi
  • atan2(0,0)=0\operatorname{atan2}(0, 0) = 0
  • 具有相同参数的点可任意排序。
  • 64 位浮点类型(C++: double)的精度可能不足;
    请使用整数类型或 80 位浮点类型(C++: long double)。

约束条件

  • 1N2×1051 \le N \le 2 \times 10^5
  • xi,yi109|x_i|, |y_i| \le 10^9
  • xi,yix_i, y_i 为整数。

输入

N
x₀ y₀
x₁ y₁
:
x_{N-1} y_{N-1}

输出

x₀ y₀
x₁ y₁
:
x_{N-1} y_{N-1}
8
1 0
0 0
-1 0
0 1
0 -1
1 1
2 2
-10 -1
-10 -1
0 -1
1 0
0 0
1 1
2 2
0 1
-1 0