結果
| 問題 | No.2180 Comprehensive Line Segments | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2022-12-30 22:17:39 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                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]))
            
            
            
        