提出 #33960576
ソースコード 拡げる
import Control.Monad
import qualified Data.ByteString.Char8 as BS
import Data.Char
import Data.List
import Data.Array
main = do
[n] <- bsGetLnInts
[sx,sy,tx,ty] <- bsGetLnInts
xyrs <- replicateM n bsGetLnInts
let ans = abc259d n sx sy tx ty xyrs
putStrLn $ if ans then "Yes" else "No"
bsGetLnInts :: IO [Int]
bsGetLnInts = BS.getLine >>= return . unfoldr (BS.readInt . BS.dropWhile isSpace)
abc259d :: Int -> Int -> Int -> Int -> Int -> [[Int]] -> Bool
abc259d n sx sy tx ty xyrs = findUF uf a b
where
a = findab sx sy xyrs
b = findab tx ty xyrs
uf = foldl (\uf (i,j) -> uniteUF uf i j) (newUF n)
[ (i,j)
| (i,c1) : jcs <- tails (zip [0..] xyrs)
, (j,c2) <- jcs
, connect c1 c2]
findab x y xyrs = head
[i | (i, (xi:yi:ri:_)) <- zip [0..] xyrs, dist2 x y xi yi == ri^2]
dist2 x1 y1 x2 y2 = (x1 - x2)^2 + (y1 - y2)^2
connect (x1:y1:r1:_) (x2:y2:r2:_)
| (max r1 r2)^2 <= d2 = (r1 + r2)^2 >= d2
| otherwise = (r1 - r2)^2 <= d2
where
d2 = dist2 x1 y1 x2 y2
-- UnionFind
type UnionFind = Array Int Int
-- 0からN-1までのN要素が独立した初期状態を作る
newUF :: Int -> UnionFind
newUF n = listArray (0, pred n) $ replicate n (-1)
-- 補助関数 ノードの根まで辿り、そのrank(負)と共に返す
getRoot :: UnionFind -> Int -> (Int, Int)
getRoot uf i = let k = uf ! i in if k < 0 then (i, k) else getRoot uf k
-- ふたつのノードが同じ分割に属しているか判定する
findUF :: UnionFind -> Int -> Int -> Bool
findUF uf i j = fst (getRoot uf i) == fst (getRoot uf j)
-- ふたつのノードが同じ分割に属していることを登録する
uniteUF :: UnionFind -> Int -> Int -> UnionFind
uniteUF uf i j
| a == b = uf
| otherwise =
case compare r s of
GT -> uf // [(a,b)]
LT -> uf // [(b,a)]
EQ -> uf // [(b,a), (a, pred r)]
where
(a, r) = getRoot uf i
(b, s) = getRoot uf j
提出情報
| 提出日時 | |
|---|---|
| 問題 | D - Circumferences |
| ユーザ | joetheshootingst |
| 言語 | Haskell (GHC 8.8.3) |
| 得点 | 400 |
| コード長 | 2017 Byte |
| 結果 | AC |
| 実行時間 | 1222 ms |
| メモリ | 405736 KiB |
コンパイルエラー
Loaded package environment from /home/contestant/.ghc/x86_64-linux-8.8.3/environments/default
ジャッジ結果
| セット名 | Sample | All | ||||
|---|---|---|---|---|---|---|
| 得点 / 配点 | 0 / 0 | 400 / 400 | ||||
| 結果 |
|
|
| セット名 | テストケース |
|---|---|
| Sample | example0.txt, example1.txt |
| All | 000.txt, 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, 007.txt, 008.txt, 009.txt, 010.txt, 011.txt, 012.txt, 013.txt, 014.txt, 015.txt, 016.txt, 017.txt, 018.txt, 019.txt, 020.txt, 021.txt, 022.txt, 023.txt, 024.txt, 025.txt, 026.txt, 027.txt, 028.txt, 029.txt, 030.txt, 031.txt, 032.txt, 033.txt, 034.txt, 035.txt, 036.txt, 037.txt, 038.txt, 039.txt, 040.txt, 041.txt, 042.txt, 043.txt, 044.txt, 045.txt, example0.txt, example1.txt |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| 000.txt | AC | 5 ms | 3496 KiB |
| 001.txt | AC | 1222 ms | 405064 KiB |
| 002.txt | AC | 1198 ms | 404924 KiB |
| 003.txt | AC | 3 ms | 3552 KiB |
| 004.txt | AC | 2 ms | 3704 KiB |
| 005.txt | AC | 2 ms | 3488 KiB |
| 006.txt | AC | 2 ms | 3544 KiB |
| 007.txt | AC | 2 ms | 3540 KiB |
| 008.txt | AC | 179 ms | 9008 KiB |
| 009.txt | AC | 1195 ms | 405736 KiB |
| 010.txt | AC | 710 ms | 199012 KiB |
| 011.txt | AC | 2 ms | 3708 KiB |
| 012.txt | AC | 2 ms | 3552 KiB |
| 013.txt | AC | 2 ms | 3660 KiB |
| 014.txt | AC | 2 ms | 3636 KiB |
| 015.txt | AC | 2 ms | 3492 KiB |
| 016.txt | AC | 2 ms | 3640 KiB |
| 017.txt | AC | 1 ms | 3652 KiB |
| 018.txt | AC | 2 ms | 3672 KiB |
| 019.txt | AC | 2 ms | 3732 KiB |
| 020.txt | AC | 31 ms | 12016 KiB |
| 021.txt | AC | 57 ms | 19916 KiB |
| 022.txt | AC | 42 ms | 15808 KiB |
| 023.txt | AC | 680 ms | 191932 KiB |
| 024.txt | AC | 697 ms | 191792 KiB |
| 025.txt | AC | 696 ms | 193808 KiB |
| 026.txt | AC | 196 ms | 10720 KiB |
| 027.txt | AC | 194 ms | 9828 KiB |
| 028.txt | AC | 199 ms | 10372 KiB |
| 029.txt | AC | 193 ms | 9608 KiB |
| 030.txt | AC | 193 ms | 10708 KiB |
| 031.txt | AC | 193 ms | 9652 KiB |
| 032.txt | AC | 195 ms | 9840 KiB |
| 033.txt | AC | 195 ms | 10712 KiB |
| 034.txt | AC | 189 ms | 9852 KiB |
| 035.txt | AC | 196 ms | 10700 KiB |
| 036.txt | AC | 194 ms | 9772 KiB |
| 037.txt | AC | 194 ms | 10296 KiB |
| 038.txt | AC | 194 ms | 10696 KiB |
| 039.txt | AC | 195 ms | 10700 KiB |
| 040.txt | AC | 192 ms | 9632 KiB |
| 041.txt | AC | 196 ms | 10364 KiB |
| 042.txt | AC | 194 ms | 9728 KiB |
| 043.txt | AC | 195 ms | 10788 KiB |
| 044.txt | AC | 193 ms | 10380 KiB |
| 045.txt | AC | 195 ms | 10340 KiB |
| example0.txt | AC | 3 ms | 3676 KiB |
| example1.txt | AC | 2 ms | 3552 KiB |