Submission #1636132


Source Code Expand

import Control.Applicative
import Control.Monad
import Debug.Trace
import Data.Array.IO
import Data.IORef

-- two stack queue
-- ref: Chris Okasaki "Purely Functional Data Structures" p.42
data Queue a = Node [a] [a] deriving (Show)

queueEmpty = Node [] []

queueNull (Node [] []) = True
queueNull (Node _ _) = False

enqueue x (Node s1 s2) = Node s1 (x : s2)

dequeue (Node [] s2) = dequeue (Node (reverse s2) [])
dequeue (Node (s:s1) s2) = (s, Node s1 s2)

main :: IO ()
main = do
  [n1, m1] <- map read . words <$> getLine
  e1 <- map (map read . words) <$> replicateM m1 getLine :: IO [[Int]]
  [n2, m2] <- map read . words <$> getLine
  e2 <- map (map read . words) <$> replicateM m2 getLine :: IO [[Int]]
  (mn1, mx1) <- solve n1 e1
  (mn2, mx2) <- solve n2 e2
  let mn = maximum [mn1 + mn2 + 1, mx1, mx2]
  let mx = mx1 + mx2 + 1
  putStrLn $ show mn ++ " " ++ show mx

solve :: Int -> [[Int]] -> IO (Int, Int)
solve n es = do
  g <- newArray (0, n - 1) [] :: IO (IOArray Int [Int])
  forM_ es $ \[u, v] -> do
    readArray g u >>= writeArray g u . (v:)
    readArray g v >>= writeArray g v . (u:)
  vals <- mapM (minmax n g) [0..n-1]
  let mn = minimum vals
  let mx = maximum vals
  return (mn, mx)

minmax :: Int -> IOArray Int [Int] -> Int -> IO Int
minmax n g u = do
  dist <- newArray (0, n - 1) (-1) :: IO (IOArray Int Int)
  writeArray dist u 0
  let q = enqueue u queueEmpty
  d <- bfs dist g q
  dd <- getElems d
  return $ maximum dd

bfs :: IOArray Int Int -> IOArray Int [Int] -> Queue Int -> IO (IOArray Int Int)
bfs dist g (Node [] []) = return dist
bfs dist g q1 = do
  let (u, q2) = dequeue q1
  q <- newIORef q2
  d <- readArray dist u
  es <- readArray g u
  forM_ es $ \v -> do
    dv <- readArray dist v
    when (dv == (-1)) $ do
      writeArray dist v (d + 1)
      modifyIORef q (enqueue v)

  bfs dist g =<< readIORef q

Submission Info

Submission Time
Task C - 直径
User pekempey
Language Haskell (GHC 7.10.3)
Score 100
Code Size 1918 Byte
Status AC
Exec Time 1317 ms
Memory 141692 KB

Judge Result

Set Name Small Large
Score / Max Score 50 / 50 50 / 50
Status
AC × 28
AC × 58
Set Name Test Cases
Small 10-small_random-00, 10-small_random-01, 10-small_random-02, 10-small_random-03, 10-small_random-04, 10-small_random-05, 10-small_random-06, 10-small_random-07, 10-small_random-08, 10-small_random-09, 10-small_random-10, 10-small_random-11, 10-small_random-12, 10-small_random-13, 10-small_random-14, 10-small_random-15, 10-small_random-16, 10-small_random-17, 10-small_random-18, 10-small_random-19, 21-small_path-00, 21-small_path-01, 21-small_path-02, 21-small_path-03, 21-small_path-04, 00-sample-00, 00-sample-01, 00-sample-02
Large 00-sample-00, 00-sample-01, 00-sample-02, 10-small_random-00, 10-small_random-01, 10-small_random-02, 10-small_random-03, 10-small_random-04, 10-small_random-05, 10-small_random-06, 10-small_random-07, 10-small_random-08, 10-small_random-09, 10-small_random-10, 10-small_random-11, 10-small_random-12, 10-small_random-13, 10-small_random-14, 10-small_random-15, 10-small_random-16, 10-small_random-17, 10-small_random-18, 10-small_random-19, 20-small_tree-00, 20-small_tree-01, 20-small_tree-02, 20-small_tree-03, 20-small_tree-04, 21-small_path-00, 21-small_path-01, 21-small_path-02, 21-small_path-03, 21-small_path-04, 30-large_random-00, 30-large_random-01, 30-large_random-02, 30-large_random-03, 30-large_random-04, 30-large_random-05, 30-large_random-06, 30-large_random-07, 30-large_random-08, 30-large_random-09, 40-large_comp-00, 40-large_comp-01, 40-large_comp-02, 40-large_comp-03, 40-large_comp-04, 41-large_tree-00, 41-large_tree-01, 41-large_tree-02, 41-large_tree-03, 41-large_tree-04, 42-large_path-00, 42-large_path-01, 42-large_path-02, 42-large_path-03, 42-large_path-04
Case Name Status Exec Time Memory
00-sample-00 AC 2 ms 636 KB
00-sample-01 AC 2 ms 636 KB
00-sample-02 AC 2 ms 508 KB
10-small_random-00 AC 2 ms 1020 KB
10-small_random-01 AC 3 ms 1020 KB
10-small_random-02 AC 2 ms 1020 KB
10-small_random-03 AC 2 ms 1020 KB
10-small_random-04 AC 3 ms 1020 KB
10-small_random-05 AC 3 ms 1020 KB
10-small_random-06 AC 2 ms 892 KB
10-small_random-07 AC 2 ms 892 KB
10-small_random-08 AC 2 ms 636 KB
10-small_random-09 AC 3 ms 1020 KB
10-small_random-10 AC 2 ms 1020 KB
10-small_random-11 AC 2 ms 1020 KB
10-small_random-12 AC 3 ms 1020 KB
10-small_random-13 AC 2 ms 508 KB
10-small_random-14 AC 4 ms 1020 KB
10-small_random-15 AC 2 ms 1020 KB
10-small_random-16 AC 3 ms 1020 KB
10-small_random-17 AC 3 ms 1020 KB
10-small_random-18 AC 4 ms 1020 KB
10-small_random-19 AC 4 ms 1020 KB
20-small_tree-00 AC 9 ms 1916 KB
20-small_tree-01 AC 2 ms 508 KB
20-small_tree-02 AC 13 ms 3068 KB
20-small_tree-03 AC 2 ms 508 KB
20-small_tree-04 AC 665 ms 89468 KB
21-small_path-00 AC 2 ms 636 KB
21-small_path-01 AC 2 ms 764 KB
21-small_path-02 AC 2 ms 508 KB
21-small_path-03 AC 2 ms 892 KB
21-small_path-04 AC 2 ms 1020 KB
30-large_random-00 AC 137 ms 5500 KB
30-large_random-01 AC 3 ms 1020 KB
30-large_random-02 AC 19 ms 2044 KB
30-large_random-03 AC 2 ms 892 KB
30-large_random-04 AC 78 ms 7548 KB
30-large_random-05 AC 2 ms 892 KB
30-large_random-06 AC 28 ms 3836 KB
30-large_random-07 AC 5 ms 1020 KB
30-large_random-08 AC 1317 ms 72060 KB
30-large_random-09 AC 1312 ms 72060 KB
40-large_comp-00 AC 2 ms 636 KB
40-large_comp-01 AC 10 ms 1404 KB
40-large_comp-02 AC 5 ms 1148 KB
40-large_comp-03 AC 29 ms 2428 KB
40-large_comp-04 AC 96 ms 5500 KB
41-large_tree-00 AC 2 ms 764 KB
41-large_tree-01 AC 5 ms 1276 KB
41-large_tree-02 AC 9 ms 1788 KB
41-large_tree-03 AC 100 ms 15740 KB
41-large_tree-04 AC 673 ms 90492 KB
42-large_path-00 AC 33 ms 8572 KB
42-large_path-01 AC 2 ms 1020 KB
42-large_path-02 AC 3 ms 1020 KB
42-large_path-03 AC 259 ms 65916 KB
42-large_path-04 AC 607 ms 141692 KB