Submission #34034150


Source Code Expand

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

import Data.Array
import qualified Data.IntMap as IM
import Control.Applicative

main = do
  [n,m,e] <- bsGetLnInts
  uvs <- replicateM e bsGetLnInts
  [q] <- bsGetLnInts
  xs <- replicateM q (head <$> bsGetLnInts)
  let 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] -> [Int]
abc264e n m e uvs q xs = ccs
  where
-- 0番が発電所、1~N 個は都市
    uf0 = newUF (succ n)
-- 電線の配列
    uvA = listArray (1,e) [(pp u, pp v) | (u:v:_) <- uvs]
    pp x = if n < x then 0 else x
-- 電線が切れないかチェック表
    uvX = accumArray (&&) True (1,e) [(x,False) | x <- xs]
-- 切れない電線を配線する
    uf1 = foldl' {-'-} uniteUF uf0 [uv | (uv,True) <- zip (elems uvA) (elems uvX)]
-- 逆順に Xi を繋いだufを作りつつ、都市数を追跡
    (_,ccs) = mapAccumR step uf1 xs
    step uf xi = (uniteUF uf (uvA ! xi), pred cc1)
      where
        (pp, cc1) = getRoot uf 0

-- UnionFind
-- 編集が定数時間でできるIntMapを使ってみる

type UnionFind = IM.IntMap Int
-- 要素は 親id または 分割の要素数(負)

-- 0からNまでのN要素が独立した初期状態を作る
newUF :: Int -> UnionFind
newUF n = IM.fromAscList [(i,-1) | i <- [0..n]]

-- 補助関数 ノードの根まで辿り、代表idと分割の要素数を返す
getRoot :: UnionFind -> Int -> (Int,Int)
getRoot uf i = loop i
  where
    loop i
      | k >= 0 = loop k
      | True   = (i, negate k)
      where
        k = uf IM.! i

-- ふたつのノードが同じ分割に属していることを登録する
uniteUF :: UnionFind -> (Int, Int) -> UnionFind
uniteUF uf (i, j)
  | a == b = uf
  | r <= s = IM.insert a b $ IM.insert b (negate $ r + s) uf
  | True   = IM.insert b a $ IM.insert a (negate $ r + s) uf
  where
    (a,r) = getRoot uf i
    (b,s) = getRoot uf j

Submission Info

Submission Time
Task E - Blackout 2
User joetheshootingst
Language Haskell (GHC 8.8.3)
Score 500
Code Size 2142 Byte
Status AC
Exec Time 2679 ms
Memory 560644 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 5 ms 3524 KiB
test_01.txt AC 1041 ms 193936 KiB
test_02.txt AC 657 ms 125328 KiB
test_03.txt AC 1200 ms 381296 KiB
test_04.txt AC 563 ms 120140 KiB
test_05.txt AC 138 ms 37448 KiB
test_06.txt AC 282 ms 66036 KiB
test_07.txt AC 445 ms 99332 KiB
test_08.txt AC 999 ms 319704 KiB
test_09.txt AC 863 ms 178712 KiB
test_10.txt AC 424 ms 149216 KiB
test_11.txt AC 773 ms 234564 KiB
test_12.txt AC 203 ms 93600 KiB
test_13.txt AC 790 ms 279328 KiB
test_14.txt AC 366 ms 120312 KiB
test_15.txt AC 354 ms 88608 KiB
test_16.txt AC 501 ms 151060 KiB
test_17.txt AC 1157 ms 187056 KiB
test_18.txt AC 1345 ms 387392 KiB
test_19.txt AC 1867 ms 479776 KiB
test_20.txt AC 461 ms 144880 KiB
test_21.txt AC 1378 ms 245236 KiB
test_22.txt AC 561 ms 156192 KiB
test_23.txt AC 1256 ms 390480 KiB
test_24.txt AC 1175 ms 273804 KiB
test_25.txt AC 1232 ms 254800 KiB
test_26.txt AC 905 ms 244832 KiB
test_27.txt AC 1088 ms 266640 KiB
test_28.txt AC 1267 ms 390632 KiB
test_29.txt AC 1106 ms 267772 KiB
test_30.txt AC 443 ms 144496 KiB
test_31.txt AC 826 ms 254496 KiB
test_32.txt AC 474 ms 155376 KiB
test_33.txt AC 1177 ms 389456 KiB
test_34.txt AC 457 ms 155472 KiB
test_35.txt AC 2679 ms 547604 KiB
test_36.txt AC 1933 ms 473572 KiB
test_37.txt AC 2020 ms 560644 KiB
test_38.txt AC 1363 ms 392720 KiB
test_39.txt AC 2013 ms 558944 KiB
test_40.txt AC 1442 ms 246096 KiB