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 |
|
|
| 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 |