Submission #35149001
Source Code Expand
Copy
importControl.MonadimportqualifiedData.ByteString.CharasBSimportData.CharimportData.ListimportqualifiedData.Vector.Unboxed.MutableasMUVimportControl.ApplicativeimportqualifiedData.IntMapasIMimportControl.Monad.STmain = do[n,m] <- bsGetLnIntsxs <- bsGetLnIntsys <- bsGetLnIntsabzs <- replicateM m bsGetLnIntslet ans = abc270f n m xs ys abzsprint ansbsGetLnInts::IOIntbsGetLnInts = BS.getLine >>= return . unfoldr (BS.readInt . BS.dropWhile isSpace)
import Control.Monad import qualified Data.ByteString.Char8 as BS import Data.Char import Data.List import qualified Data.Vector.Unboxed.Mutable as MUV import Control.Applicative import qualified Data.IntMap as IM import Control.Monad.ST main = do [n,m] <- bsGetLnInts xs <- bsGetLnInts ys <- bsGetLnInts abzs <- replicateM m bsGetLnInts let ans = abc270f n m xs ys abzs print ans bsGetLnInts :: IO [Int] bsGetLnInts = BS.getLine >>= return . unfoldr (BS.readInt . BS.dropWhile isSpace) abc270f :: Int -> Int -> [Int] -> [Int] -> [[Int]] -> Int abc270f n m xs ys abzs = minimum [c1,c2,c3,c4] where n1 = succ n n2 = succ n1 bridges = sort [(z,(a,b)) | (a:b:z:_) <- abzs] airs = sort [(x,(i, 0)) | (i,x) <- zip [1..] xs] seas = sort [(y,(i,n1)) | (i,y) <- zip [1..] ys] ba = merge bridges airs c1 = if succ m < n then maxBound else sub n2 n bridges c2 = sub n2 n1 ba c3 = sub n2 n1 $ merge bridges seas c4 = sub n2 n2 $ merge ba seas sub :: Int -> Int -> [(Int,(Int,Int))] -> Int sub n cnt zabs = runST $ do uf <- newUF n (cost, cnt1) <- foldM (\(cost, cnt) (z,(a,b)) -> do m <- uniteUF uf a b return $ if m then (cost + z, pred cnt) else (cost, cnt) ) (0, cnt) zabs return $ if cnt1 == 1 then cost else maxBound ------------------ -- @gotoki_no_joe merge :: Ord a => [a] -> [a] -> [a] merge xxs@(x:xs) yys@(y:ys) = case compare x y of EQ -> x : y : merge xs ys LT -> x : merge xs yys GT -> y : merge xxs ys merge [] ys = ys merge xs [] = xs -- @gotoki_no_joe type UnionFind s = MUV.MVector s Int newUF :: Int -> ST s (UnionFind s) newUF n = MUV.replicate n (-1) getRoot :: UnionFind s -> Int -> ST s (Int, Int) getRoot uf i = loop uf i [] where loop uf i ks = do k <- MUV.read uf i if k >= 0 then loop uf k (i:ks) else do forM_ (drop 1 ks) (\k -> MUV.write uf k i) return (i, -k) uniteUF :: UnionFind s -> Int -> Int -> ST s Bool uniteUF uf i j = do (a, r) <- getRoot uf i (b, s) <- getRoot uf j if a == b then return False else if r >= s then do MUV.write uf a (negate $ r + s) MUV.write uf b a return True else do MUV.write uf b (negate $ r + s) MUV.write uf a b return True
Submission Info
Submission Time | |
---|---|
Task | F - Transportation |
User | joetheshootingst |
Language | Haskell (GHC 8.8.3) |
Score | 500 |
Code Size | 2358 Byte |
Status | AC |
Exec Time | 2587 ms |
Memory | 254444 KB |
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 | example_00.txt, example_01.txt, example_02.txt |
All | example_00.txt, example_01.txt, example_02.txt, hand_00.txt, hand_01.txt, hand_02.txt, hand_03.txt, hand_04.txt, hand_05.txt, hand_06.txt, hand_07.txt, random_00.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, random_17.txt, random_18.txt, random_19.txt, random_20.txt, random_21.txt, random_22.txt, random_23.txt, random_24.txt, random_25.txt, random_26.txt, random_27.txt, random_28.txt, random_29.txt |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
example_00.txt | AC | 9 ms | 3588 KB |
example_01.txt | AC | 2 ms | 3680 KB |
example_02.txt | AC | 2 ms | 3696 KB |
hand_00.txt | AC | 1116 ms | 171920 KB |
hand_01.txt | AC | 1129 ms | 169924 KB |
hand_02.txt | AC | 1136 ms | 172544 KB |
hand_03.txt | AC | 269 ms | 103908 KB |
hand_04.txt | AC | 1014 ms | 145152 KB |
hand_05.txt | AC | 1054 ms | 167996 KB |
hand_06.txt | AC | 1208 ms | 200284 KB |
hand_07.txt | AC | 1228 ms | 195868 KB |
random_00.txt | AC | 2249 ms | 246260 KB |
random_01.txt | AC | 1333 ms | 171456 KB |
random_02.txt | AC | 2054 ms | 236956 KB |
random_03.txt | AC | 1329 ms | 172396 KB |
random_04.txt | AC | 2364 ms | 252324 KB |
random_05.txt | AC | 1255 ms | 173604 KB |
random_06.txt | AC | 2297 ms | 253280 KB |
random_07.txt | AC | 1315 ms | 169488 KB |
random_08.txt | AC | 1946 ms | 217612 KB |
random_09.txt | AC | 1492 ms | 169600 KB |
random_10.txt | AC | 2529 ms | 253336 KB |
random_11.txt | AC | 1349 ms | 160836 KB |
random_12.txt | AC | 2587 ms | 254444 KB |
random_13.txt | AC | 1501 ms | 173476 KB |
random_14.txt | AC | 2194 ms | 242160 KB |
random_15.txt | AC | 1499 ms | 171144 KB |
random_16.txt | AC | 2530 ms | 253340 KB |
random_17.txt | AC | 1460 ms | 165348 KB |
random_18.txt | AC | 2395 ms | 241052 KB |
random_19.txt | AC | 1563 ms | 171564 KB |
random_20.txt | AC | 2188 ms | 228704 KB |
random_21.txt | AC | 1489 ms | 170504 KB |
random_22.txt | AC | 2380 ms | 243212 KB |
random_23.txt | AC | 1429 ms | 163332 KB |
random_24.txt | AC | 2587 ms | 249328 KB |
random_25.txt | AC | 1506 ms | 170404 KB |
random_26.txt | AC | 2182 ms | 220760 KB |
random_27.txt | AC | 1544 ms | 171492 KB |
random_28.txt | AC | 2567 ms | 248228 KB |
random_29.txt | AC | 1537 ms | 171180 KB |