Submission #34030932


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.Mutable as MV

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
-- 先頭 N 個は都市、後半 M 個が発電所
    uf <- newUF $ replicate n (1,False) ++ replicate m (0, True)
-- 切れない電線を配線する
    sequence_ [uniteUF uf u v | ((u,v),True) <- zip (elems uvA) (elems uvX)]
-- 最後まで通電している都市の数
    ansQ <- getPowered uf
-- 逆順に Xi を繋ぎつつ、都市数を追跡
    foldM (action uf) [ansQ] (map (uvA !) $ reverse $ tail xs)
  where
-- 電線の配列
    uvA = listArray (1,e) [(pred u, pred v) | (u:v:_) <- uvs]
-- 電線が切れないかチェック表
    uvX = accumArray (&&) True (1,e) [(x,False) | x <- xs]

action uf (acc:accs) (u, v) =
  do
    (a, (cc1,pp1)) <- getRoot uf u
    (b, (cc2,pp2)) <- getRoot uf v
    if a == b then return (acc:acc:accs) else do
      uniteUF uf a b
      return $ case (pp1, pp2) of
        (True, False) -> acc+cc2:acc:accs
        (False, True) -> acc+cc1:acc:accs
        _             -> acc    :acc:accs

{- foldl : Since: 0.12.3.0
getPowered uf = MV.foldl step 0 uf
  where
    step acc (Right (cc,True)) = cc + acc
    step acc _ = acc
-}
getPowered uf = do
  foldM (\acc i -> do
    x <- MV.read uf i
    return $ case x of
      Right (cc,True) -> acc + cc
      _ -> acc
    ) 0 [0 .. pred $ MV.length uf]

uniteUF = mkUniteUF (\(cc1,pp1) (cc2,pp2) -> (cc1 + cc2, pp1 || pp2))

-- UnionFind

-- @gotoki_no_joe
type UnionFind a = MV.IOVector (Either Int a)

newUF :: [a] -> IO (UnionFind a)
newUF xs = do
  v <- MV.new (length xs)
  forM_ (zip [0..] xs) (\(i,x) -> MV.write v i (Right x))
  return v

getRoot :: UnionFind a -> Int -> IO (Int, a)
getRoot vec i = loop vec i []
  where
    loop vec i ks =
      do
        k <- MV.read vec i
        case k of
          Right x -> do
            forM_ ks (\k -> MV.write vec k (Left i))
            return (i, x)
          Left j -> loop vec j (i:ks)

mkUniteUF :: (a -> a -> a) -> UnionFind a -> Int -> Int -> IO Bool
mkUniteUF f vec i j =
  do
    (a, r) <- getRoot vec i
    (b, s) <- getRoot vec j
    if a == b then return False else
      do
        MV.write vec a (Left b)
        MV.write vec b (Right $ f r s)
        return True

Submission Info

Submission Time
Task E - Blackout 2
User joetheshootingst
Language Haskell (GHC 8.8.3)
Score 500
Code Size 2810 Byte
Status AC
Exec Time 1684 ms
Memory 360092 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 4076 KiB
test_01.txt AC 859 ms 184868 KiB
test_02.txt AC 729 ms 140064 KiB
test_03.txt AC 1284 ms 342652 KiB
test_04.txt AC 683 ms 134052 KiB
test_05.txt AC 153 ms 41796 KiB
test_06.txt AC 300 ms 70452 KiB
test_07.txt AC 552 ms 108012 KiB
test_08.txt AC 1014 ms 281952 KiB
test_09.txt AC 794 ms 154416 KiB
test_10.txt AC 842 ms 165404 KiB
test_11.txt AC 1297 ms 252844 KiB
test_12.txt AC 501 ms 100596 KiB
test_13.txt AC 844 ms 241616 KiB
test_14.txt AC 803 ms 149184 KiB
test_15.txt AC 184 ms 46612 KiB
test_16.txt AC 256 ms 68356 KiB
test_17.txt AC 621 ms 119632 KiB
test_18.txt AC 1260 ms 352616 KiB
test_19.txt AC 897 ms 171480 KiB
test_20.txt AC 806 ms 152336 KiB
test_21.txt AC 1362 ms 243476 KiB
test_22.txt AC 913 ms 174952 KiB
test_23.txt AC 1278 ms 360036 KiB
test_24.txt AC 914 ms 175992 KiB
test_25.txt AC 1237 ms 225096 KiB
test_26.txt AC 736 ms 146224 KiB
test_27.txt AC 897 ms 176016 KiB
test_28.txt AC 1267 ms 360068 KiB
test_29.txt AC 898 ms 176132 KiB
test_30.txt AC 815 ms 165140 KiB
test_31.txt AC 1261 ms 233256 KiB
test_32.txt AC 866 ms 175108 KiB
test_33.txt AC 1261 ms 359340 KiB
test_34.txt AC 860 ms 174884 KiB
test_35.txt AC 1684 ms 303012 KiB
test_36.txt AC 1116 ms 237184 KiB
test_37.txt AC 891 ms 175068 KiB
test_38.txt AC 1267 ms 360092 KiB
test_39.txt AC 876 ms 174968 KiB
test_40.txt AC 1378 ms 235532 KiB