Submission #34031960


Source Code Expand

import Control.Monad
import qualified Data.ByteString.Char8 as BS
import Data.Char
import Data.List

import Data.Array
import Control.Applicative
import qualified Data.Vector.Unboxed.Mutable as MUV

main = do
  [n,m,e] <- bsGetLnInts
  uvs <- replicateM e bsGetLnInts
  [q] <- bsGetLnInts
  xs <- replicateM q (head <$> bsGetLnInts)
  ans <- abc264e n m e uvs q xs
  mapM_ print ans

bsGetLnInts :: IO [Int]
bsGetLnInts = BS.getLine >>= return . unfoldr (BS.readInt . BS.dropWhile isSpace)

abc264e :: Int -> Int -> Int -> [[Int]] -> Int -> [Int] -> IO [Int]
abc264e n m e uvs q xs =
  do
-- 0番が発電所、1~N 個は都市
    uf <- newUF (succ n)
-- 切れない電線を配線する
    sequence_ [uniteUF uf u v | ((u,v),True) <- zip (elems uvA) (elems uvX)]
-- 逆順に Xi を繋ぎつつ、都市数を追跡
    ansS <- mapM (action uf) (map (uvA !) $ reverse xs)
    return $ reverse ansS
  where
-- 電線の配列(発電所は0に統合)
    uvA = listArray (1,e) [(pp u, pp v) | (u:v:_) <- uvs]
    pp x
      | x <= n    = x
      | otherwise = 0
-- 電線が切れないかチェック表
    uvX = accumArray (&&) True (1,e) [(x,False) | x <- xs]

action uf (u, v) =
  do
    pp <- getRoot uf 0
    a <- MUV.read uf pp
    uniteUF uf u v
    return (pred $ negate a)

-- UnionFind
type UnionFind = MUV.IOVector Int

newUF :: Int -> IO UnionFind
newUF n = MUV.replicate n (-1)

getRoot :: UnionFind -> Int -> IO Int
getRoot vec i = loop i []
  where
    loop :: Int -> [Int] -> IO Int
    loop i ks =
      do
        k <- MUV.read vec i
        if k < 0 then
          do
            forM_ ks (\k -> do MUV.write vec k i)   -- 経路圧縮
            return i
          else
            loop k (i:ks)

uniteUF :: UnionFind -> Int -> Int -> IO Bool
uniteUF vec i j =
  do
    a <- getRoot vec i
    b <- getRoot vec j
    if a == b then return False else
      do
        r <- MUV.read vec a
        s <- MUV.read vec b
        if r < s then
          do
            MUV.write vec a b
            MUV.write vec b (r+s)
          else do
            MUV.write vec b a
            MUV.write vec a (r+s)
        return True

Submission Info

Submission Time
Task E - Blackout 2
User joetheshootingst
Language Haskell (GHC 8.8.3)
Score 500
Code Size 2229 Byte
Status AC
Exec Time 1224 ms
Memory 367876 KiB

Compile Error

Loaded package environment from /home/contestant/.ghc/x86_64-linux-8.8.3/environments/default

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 500 / 500
Status
AC × 1
AC × 41
Set Name Test Cases
Sample sample_01.txt
All sample_01.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt, test_28.txt, test_29.txt, test_30.txt, test_31.txt, test_32.txt, test_33.txt, test_34.txt, test_35.txt, test_36.txt, test_37.txt, test_38.txt, test_39.txt, test_40.txt
Case Name Status Exec Time Memory
sample_01.txt AC 6 ms 3584 KiB
test_01.txt AC 532 ms 154124 KiB
test_02.txt AC 375 ms 118288 KiB
test_03.txt AC 1224 ms 343932 KiB
test_04.txt AC 336 ms 116016 KiB
test_05.txt AC 65 ms 29960 KiB
test_06.txt AC 144 ms 58180 KiB
test_07.txt AC 244 ms 101100 KiB
test_08.txt AC 935 ms 258356 KiB
test_09.txt AC 434 ms 121200 KiB
test_10.txt AC 417 ms 122236 KiB
test_11.txt AC 746 ms 225772 KiB
test_12.txt AC 202 ms 93500 KiB
test_13.txt AC 746 ms 227780 KiB
test_14.txt AC 368 ms 120200 KiB
test_15.txt AC 83 ms 33072 KiB
test_16.txt AC 142 ms 49200 KiB
test_17.txt AC 302 ms 113564 KiB
test_18.txt AC 1161 ms 363356 KiB
test_19.txt AC 465 ms 132316 KiB
test_20.txt AC 340 ms 143252 KiB
test_21.txt AC 813 ms 234892 KiB
test_22.txt AC 471 ms 133372 KiB
test_23.txt AC 1197 ms 367872 KiB
test_24.txt AC 496 ms 135332 KiB
test_25.txt AC 731 ms 226804 KiB
test_26.txt AC 403 ms 124176 KiB
test_27.txt AC 498 ms 135028 KiB
test_28.txt AC 1191 ms 367664 KiB
test_29.txt AC 494 ms 134980 KiB
test_30.txt AC 438 ms 124320 KiB
test_31.txt AC 799 ms 231784 KiB
test_32.txt AC 450 ms 132640 KiB
test_33.txt AC 1171 ms 367876 KiB
test_34.txt AC 443 ms 132600 KiB
test_35.txt AC 1017 ms 245136 KiB
test_36.txt AC 827 ms 236904 KiB
test_37.txt AC 485 ms 137052 KiB
test_38.txt AC 1211 ms 367820 KiB
test_39.txt AC 475 ms 137348 KiB
test_40.txt AC 815 ms 232872 KiB