結果
問題 | No.461 三角形はいくつ? |
ユーザー |
![]() |
提出日時 | 2020-04-08 16:51:38 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 1,229 ms / 5,000 ms |
コード長 | 1,208 bytes |
コンパイル時間 | 93 ms |
コンパイル使用メモリ | 12,544 KB |
実行使用メモリ | 141,820 KB |
最終ジャッジ日時 | 2024-07-18 15:44:33 |
合計ジャッジ時間 | 39,036 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 41 |
ソースコード
#!/usr/bin/ python3.8 import sys read = sys.stdin.buffer.read readline = sys.stdin.buffer.readline readlines = sys.stdin.buffer.readlines import numpy as np N = int(readline()) XN = [[0] for _ in range(3)] XD = [[1] for _ in range(3)] m = map(int, read().split()) for p, a, b in zip(m, m, m): XN[p].append(b) XD[p].append(a + b) XN.sort(key=len) XD.sort(key=len) for i in range(3): XN[i] = np.array(XN[i], np.int64) XD[i] = np.array(XD[i], np.int64) eps = 1e-12 X = XN[0] / XD[0] Y = XN[1] / XD[1] Z = XN[2] / XD[2] X.sort() Y.sort() Z.sort() add_XY = np.add.outer(X, Y).ravel() max_XY = np.maximum.outer(X, Y).ravel() cnt_Z = np.searchsorted(Z, 1 - max_XY + eps) answer = (cnt_Z * (add_XY < 1 + eps)).sum() # 1点で交わるものを除く:厳密値で行う den = np.multiply.outer(XD[0], XD[1]).ravel() num = den - (np.multiply.outer(XN[0], XD[1]) + np.multiply.outer(XD[0], XN[1])).ravel() g = np.abs(np.gcd(den, num)) den //= g num //= g key = (den << 32) + num g = np.gcd(XN[2], XD[2]) num = XN[2] // g den = XD[2] // g key_Z = (den << 32) + num key.sort() key_Z.sort() answer -= np.sum(np.searchsorted(key, key_Z, 'right') - np.searchsorted(key, key_Z, 'left')) print(answer)