結果
| 問題 | No.2180 Comprehensive Line Segments |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-12-30 22:17:39 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,209 bytes |
| 記録 | |
| コンパイル時間 | 279 ms |
| コンパイル使用メモリ | 82,048 KB |
| 実行使用メモリ | 86,604 KB |
| 最終ジャッジ日時 | 2024-11-25 20:54:04 |
| 合計ジャッジ時間 | 14,568 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 16 WA * 9 |
ソースコード
import sys
from collections import deque, Counter
sys.setrecursionlimit(5 * 10 ** 5)
from pypyjit import set_param
set_param('max_unroll_recursion=-1')
input = lambda: sys.stdin.readline().rstrip()
ii = lambda: int(input())
mi = lambda: map(int, input().split())
li = lambda: list(mi())
inf = 2 ** 63 - 1
mod = 998244353
import itertools
class Vector2:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return str((self.x, self.y))
__repr__ = __str__
def __eq__(self, other):
return (self.x == other.x and self.y == other.y)
def __hash__(self):
return hash((self.x, self.y))
def __add__(self, other):
return Vector2(self.x + other.x, self.y + other.y)
def __sub__(self, other):
return Vector2(self.x - other.x, self.y - other.y)
def __mul__(self, other):
return self.x * other.y - self.y * other.x
def normalize(self):
assert(self.x != 0 or self.y != 0)
norm = self.x ** 2 + self.y ** 2
self.x *= abs(self.x) / norm
self.y *= abs(self.y) / norm
return self
def sgn(x: int) -> int:
if(x > 0):
return 1
if(x < 0):
return -1
return 0
def same_inclination(v1: Vector2, v2: Vector2) -> bool:
return (v1 * v2 == 0 and (v1.x * v2.x > 0 or v1.y * v2.y > 0))
n = ii()
XY = [Vector2(*li()) for _ in range(n)]
dp = [[[n] * n for _ in range(n)] for _ in range(1<<n)]
vlis = [[None] * n for _ in range(n)]
P = list(itertools.permutations(range(n), 2))
for v in P:
vlis[v[0]][v[1]] = XY[v[1]] - XY[v[0]]
dp[(1<<v[0]) | (1<<v[1])][v[0]][v[1]] = 1
for bit in range(3, 1<<n):
for vfr, vnow in P:
if dp[bit][vfr][vnow] == n or not(1 & (bit >> vfr)) or not(1 & (bit >> vnow)):
continue
cnext = cnow = dp[bit][vfr][vnow]
v1 = vlis[vfr][vnow]
for tox, toy in P:
if 1 & (bit >> tox) or 1 & (bit >> toy) : continue
bitto = bit | (1<<tox) | (1 << toy)
v2 = vlis[vnow][tox]
v3 = vlis[tox][toy]
if(vnow == tox):
cnext = cnow + 1 - same_inclination(v1, v3)
else:
d = same_inclination(v1, v2) + same_inclination(v2, v3)
if(d == 0):
d = (sgn(v1 * v2) == sgn(v2 * v3) == sgn(v1 * v3))
cnext = cnow + 2 - d
dp[bitto][tox][toy] = min(dp[bitto][tox][toy], cnext)
print(min(min(v) for v in dp[(1<<n)-1]))