結果
| 問題 |
No.2173 Nightcord
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-12-25 02:26:33 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 4,395 bytes |
| コンパイル時間 | 143 ms |
| コンパイル使用メモリ | 82,164 KB |
| 実行使用メモリ | 84,052 KB |
| 最終ジャッジ日時 | 2024-11-18 09:39:50 |
| 合計ジャッジ時間 | 19,625 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 36 WA * 12 RE * 6 |
ソースコード
import sys,random,bisect
from collections import deque,defaultdict,Counter
from heapq import heapify,heappop,heappush
from itertools import cycle, permutations
from math import log,gcd
input = lambda :sys.stdin.readline().rstrip()
mi = lambda :map(int,input().split())
li = lambda :list(mi())
def cross3(a, b, c):
return (b[0]-a[0])*(c[1]-a[1]) - (b[1]-a[1])*(c[0]-a[0])
# ps = [(x, y), ...]: ソートされた座標list
def convex_hull(ps):
qs = []
N = len(ps)
for p in ps:
# 一直線上で高々2点にする場合は ">=" にする
while len(qs) > 1 and cross3(qs[-1], qs[-2], p) > 0:
qs.pop()
qs.append(p)
t = len(qs)
for i in range(N-2, -1, -1):
p = ps[i]
while len(qs) > t and cross3(qs[-1], qs[-2], p) > 0:
qs.pop()
qs.append(p)
return qs
# O(N)
def inside_convex_polygon0(p0, qs):
L = len(qs)
D = [cross3(qs[i-1], p0, qs[i]) for i in range(L)]
return all(e >= 0 for e in D) or all(e <= 0 for e in D)
# O(log N)
def inside_convex_polygon(p0, qs):
L = len(qs)
left = 1; right = L
q0 = qs[0]
while left+1 < right:
mid = (left + right) >> 1
if cross3(q0, p0, qs[mid]) <= 0:
left = mid
else:
right = mid
if left == L-1:
left -= 1
qi = qs[left]; qj = qs[left+1]
v0 = cross3(q0, qi, qj)
v1 = cross3(q0, p0, qj)
v2 = cross3(q0, qi, p0)
if v0 < 0:
v1 = -v1; v2 = -v2
return 0 <= v1 and 0 <= v2 and v1 + v2 <= v0
def find_zero(x0, x1, f):
v0 = f(x0)
if v0 == 0:
return x0+1
left = x0; right = x1+1
while left+1 < right:
mid = (left + right) >> 1
if v0 * f(mid) >= 0:
left = mid
else:
right = mid
return right
def binary_search(f, L):
left = 0; right = L
while left+1 < right:
mid = (left + right) >> 1
if f(mid) < 0:
left = mid
else:
right = mid
return right
def line_polygon_intersection(p0, p1, qs):
x0, y0 = p0; x1, y1 = p1
dx = x1 - x0; dy = y1 - y0
h = lambda p: (p[0] - x0)*dy - (p[1] - y0)*dx
L = len(qs)
i0 = i1 = -1
v0 = h(qs[0])
v1 = h(qs[L-1])
if v0 == v1:
v2 = h(qs[1])
# assert v0 != v2
if v0 < v2:
i0 = L-1
else:
i1 = L-1
else:
v2 = h(qs[1])
if v1 > v0 <= v2:
i0 = 0
elif v1 < v0 >= v2:
i1 = 0
else:
g = lambda x: min((v1 - v0)*x/(L-1) + v0, h(qs[x]))
i0 = binary_search(lambda x: g(x+1) - g(x), L-1)
if i1 == -1:
B = i0 - L
k = binary_search(lambda x: h(qs[B+x]) - h(qs[B+x+1]), L)
i1 = (i0 + k) % L
else:
B = i1 - L
k = binary_search(lambda x: h(qs[B+x+1]) - h(qs[B+x]), L)
i0 = (i1 + k) % L
if h(qs[i0]) * h(qs[i1]) > 0:
# a line and a polygon are disjoint
return []
# a vertex to the left side of a line: i0
# a vertex to the right side of a line: i1
f = lambda i: h(qs[i-L])
k0 = find_zero(i1, i0 if i1 < i0 else i0+L, f) % L
k1 = find_zero(i0, i1 if i0 < i1 else i1+L, f) % L
# vertices to the left side of a line: k0, k0+1, ..., k1-2, k1-1
# vertices to the right side of a line: k1, k1+1, ..., k0-2, k0-1
if k0 == k1:
return [k0]
return [k0, k1]
def solve_3(N,K,star):
for p in range(2):
for x,y in star[p]:
S = set()
for xx,yy in star[p^1]:
xx,yy = xx-x,yy-y
g = gcd(xx,yy)
xx,yy = xx//g,yy//g
if (-xx,-yy) in S:
return "Yes"
S.add((xx,yy))
return "No"
def solve_4(N,K,star):
star[0].sort()
star[1].sort()
ch = [convex_hull(star[p]) for p in range(2)]
for p in range(2):
for i in range(len(ch[p])):
x,y = ch[p][i]
if inside_convex_polygon((x,y),ch[p^1]):
return "Yes"
xx,yy = ch[p][i+1]
if line_polygon_intersection((x,y),(xx,yy),ch[p^1]):
return "Yes"
return "No"
N,K = mi()
star = [[] for p in range(2)]
for _ in range(N):
x,y,c = mi()
star[c-1].append((x,y))
if K == 3:
print(solve_3(N,K,star))
else:
print(solve_4(N,K,star))