atcoder#ABC251G. [ABC251G] Intersection of Polygons

[ABC251G] Intersection of Polygons

配点 : 600600

問題文

xyxy -平面上の凸 NN 角形 PP の頂点が、反時計回り(x1,y1),(x2,y2),,(xN,yN)(x_1, y_1), (x_2, y_2), \ldots, (x_N, y_N) として与えられます。(ただし、xx 軸の正の方向を右向き、yy 軸の正の方向を上向きとします。)

この多角形 PP に対して、MM 個の凸 NN 多角形 P1,P2,,PMP_1, P_2, \ldots, P_M を考えます。 i=1,2,,Mi = 1, 2, \ldots, M について多角形 PiP_i は、 多角形 PPxx 軸の正の方向に uiu_iyy 軸の正の方向に viv_i だけ平行移動して得られる多角形です。すなわち、PiP_iNN 個の点 $(x_1+u_i, y_1+v_i), (x_2+u_i, y_2+v_i), \ldots, (x_N+u_i, y_N+v_i)$ を頂点とする凸 NN 角形です。

QQ 個の点 (a1,b1),(a2,b2),,(aQ,bQ)(a_1, b_1), (a_2, b_2), \ldots, (a_Q, b_Q) のそれぞれについて、 「その点が MM 個の多角形 P1,P2,,PMP_1, P_2, \ldots, P_M のすべてに含まれるか」を判定してください。

ただし、点が多角形の境界上にある場合も、その点はその多角形に含まれるとみなします。

制約

  • 3N503 \leq N \leq 50
  • 1M2×1051 \leq M \leq 2 \times 10^5
  • 1Q2×1051 \leq Q \leq 2 \times 10^5
  • 108xi,yi108-10^8 \leq x_i, y_i \leq 10^8
  • 108ui,vi108-10^8 \leq u_i, v_i \leq 10^8
  • 108ai,bi108-10^8 \leq a_i, b_i \leq 10^8
  • 入力はすべて整数
  • (x1,y1),(x2,y2),,(xN,yN)(x_1, y_1), (x_2, y_2), \ldots, (x_N, y_N) は反時計回りに凸多角形をなす
  • 多角形 PP のそれぞれの内角の大きさは 180180 度未満

入力

入力は以下の形式で標準入力から与えられる。

NN

x1x_1 y1y_1

x2x_2 y2y_2

\vdots

xNx_N yNy_N

MM

u1u_1 v1v_1

u2u_2 v2v_2

\vdots

uMu_M vMv_M

QQ

a1a_1 b1b_1

a2a_2 b2b_2

\vdots

aQa_Q bQb_Q

出力

QQ 行出力せよ。i=1,2,,Qi = 1, 2, \ldots, Q について、ii 行目には点 (ai,bi)(a_i, b_i)MM 個の多角形 P1,P2,,PMP_1, P_2, \ldots, P_M のすべてに含まれる場合は Yes を、そうでない場合は No を出力せよ。

5
-2 -3
0 -2
1 0
0 2
-2 1
2
0 1
1 0
6
0 0
1 0
0 1
1 1
-1 -1
-1 -2
Yes
No
Yes
Yes
Yes
No

多角形 PP(2,3),(0,2),(1,0),(0,2),(2,1)(-2, -3), (0, -2), (1, 0), (0, 2), (-2, 1) を頂点とする 55 角形です。

  • 多角形 P1P_1 は、PPxx 軸の正の方向に 00yy 軸の正の方向に 11 だけ平行移動させた、(2,2),(0,1),(1,1),(0,3),(2,2)(-2, -2), (0, -1), (1, 1), (0, 3), (-2, 2) を頂点とする 55 角形です。
  • 多角形 P2P_2 は、PPxx 軸の正の方向に 11yy 軸の正の方向に 00 だけ平行移動させた、(1,3),(1,2),(2,0),(1,2),(1,1)(-1, -3), (1, -2), (2, 0), (1, 2), (-1, 1) を頂点とする 55 角形です。

よって、下記の通りに 66 行出力します。

  • (a1,b1)=(0,0)(a_1, b_1) = (0, 0)P1P_1P2P_2 の両方に含まれるので、11 行目には Yes を出力します。
  • (a2,b2)=(1,0)(a_2, b_2) = (1, 0)P2P_2 には含まれますが P1P_1 には含まれないので、22 行目には No を出力します。
  • (a3,b3)=(0,1)(a_3, b_3) = (0, 1)P1P_1P2P_2 の両方に含まれるので、33 行目には Yes を出力します。
  • (a4,b4)=(1,1)(a_4, b_4) = (1, 1)P1P_1P2P_2 の両方に含まれるので、44 行目には Yes を出力します。
  • (a5,b5)=(1,1)(a_5, b_5) = (-1, -1)P1P_1P2P_2 の両方に含まれるので、55 行目には Yes を出力します。
  • (a6,b6)=(1,2)(a_6, b_6) = (-1, -2)P2P_2 には含まれますが P1P_1 には含まれないので、66 行目には No を出力します。

多角形の境界上にある点も多角形に含まれるとみなすことに注意してください。

10
45 100
-60 98
-95 62
-95 28
-78 -41
-54 -92
-8 -99
87 -94
98 23
87 91
5
-57 -40
-21 -67
25 39
-30 25
39 -20
16
4 5
-34 -8
-63 53
78 84
19 -16
64 9
-13 7
13 53
-20 4
2 -7
3 18
-12 10
-69 -93
2 9
27 64
-92 -100
Yes
Yes
No
No
Yes
No
Yes
No
Yes
Yes
Yes
Yes
No
Yes
No
No