Submission #12068155
Source Code Expand
Copy
importControl.ExceptionassertimportControl.MonadimportqualifiedControl.Monad.STasSTimportqualifiedData.Array.IOasIOimportqualifiedData.Array.STasSTimportqualifiedData.Array.UnboxedasAimportData.BitsimportqualifiedData.ByteString.CharasBSimportData.CharimportData.FoldableimportData.ListimportData.MaybeimportqualifiedData.SequenceasSeqimportqualifiedData.Vector.UnboxedasVimportqualifiedData.Vector.Unboxed.MutableasVMimportDebug.TracereadInt = fst . fromJust . BS.readIntreadIntList = map readInt . BS.wordsgetInt = readInt <$> BS.getLinegetIntList = readIntList <$> BS.getLine
import Control.Exception (assert) import Control.Monad import qualified Control.Monad.ST as ST import qualified Data.Array.IO as IO import qualified Data.Array.ST as ST import qualified Data.Array.Unboxed as A import Data.Bits import qualified Data.ByteString.Char8 as BS import Data.Char import Data.Foldable import Data.List import Data.Maybe import qualified Data.Sequence as Seq import qualified Data.Vector.Unboxed as V import qualified Data.Vector.Unboxed.Mutable as VM import Debug.Trace readInt = fst . fromJust . BS.readInt readIntList = map readInt . BS.words getInt = readInt <$> BS.getLine getIntList = readIntList <$> BS.getLine getIntVec n = V.unfoldrN n (BS.readInt . BS.dropWhile isSpace) <$> BS.getLine readInteger = fst . fromJust . BS.readInteger readIntegerList = map readInteger . BS.words getInteger = readInteger <$> BS.getLine getIntegerList = readIntegerList <$> BS.getLine type Edge = (Int, Int, Int) eFrm (frm, _, _) = frm eTo (_, to, _) = to eCost (_, _, cost) = cost shortestPath :: Int -> V.Vector Edge -> Int -> IO (Maybe (V.Vector Int)) shortestPath s edges numV = do let numE = V.length edges inf = 10^9 :: Int d <- VM.new numV VM.set d inf VM.write d s 0 let loop :: Int -> IO Bool loop i | i == numV = return True -- cyclic | otherwise = do update <- loop2 0 False if update then loop (i+1) else return False loop2 :: Int -> Bool -> IO Bool loop2 j upd | j == V.length edges = return upd | otherwise = do let e = edges V.! j d_frm <- VM.read d (eFrm e) d_to <- VM.read d (eTo e) let ucond = d_frm /= inf && d_to > d_frm + eCost e upd' = upd || ucond when ucond $ VM.write d (eTo e) (d_frm + eCost e) loop2 (j+1) upd' cyc <- loop 0 res <- V.freeze d if cyc then return Nothing else return (Just res) main = do [n, m, t] <- getIntList as <- getIntVec n edges <- V.replicateM m $ do [a, b, c] <- getIntList return (a-1, b-1, c) let edges_rev = V.map (\(a, b, c) -> (b, a, c)) edges costs <- fromJust <$> shortestPath 0 edges n costs_r <- fromJust <$> shortestPath 0 edges_rev n let solve i r | i >= n = r | otherwise = let waste = (costs V.! i) + (costs_r V.! i) rest = max 0 (t - waste) gain = rest * as V.! i in solve (i+1) (max r gain) print $ solve 0 0
Submission Info
Submission Time | |
---|---|
Task | D - トレジャーハント |
User | unnohideyuki |
Language | Haskell (GHC 7.10.3) |
Score | 50 |
Code Size | 2922 Byte |
Status | TLE |
Exec Time | 3156 ms |
Memory | 14204 KB |
Judge Result
Set Name | Sample | Subtask1 | All | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Score / Max Score | 0 / 0 | 50 / 50 | 0 / 50 | ||||||||
Status |
|
|
|
Set Name | Test Cases |
---|---|
Sample | 00_example_01.txt, 00_example_02.txt, 00_example_03.txt |
Subtask1 | 00_example_01.txt, 00_example_02.txt, 00_example_03.txt, 50_small_01.txt, 50_small_02.txt, 50_small_03.txt, 50_small_04.txt, 50_small_05.txt, 50_small_06.txt, 50_small_07.txt, 50_small_08.txt, 50_small_09.txt, 50_small_10.txt, 60_hand_01.txt, 60_hand_02.txt, 60_hand_03.txt, 60_hand_04.txt, 70_max_01.txt, 70_max_02.txt, 70_max_03.txt |
All | 00_example_01.txt, 00_example_02.txt, 00_example_03.txt, 10_rand_01.txt, 10_rand_02.txt, 10_rand_03.txt, 10_rand_04.txt, 10_rand_05.txt, 10_rand_06.txt, 10_rand_07.txt, 10_rand_08.txt, 10_rand_09.txt, 10_rand_10.txt, 10_rand_12.txt, 10_rand_13.txt, 30_max_01.txt, 30_max_02.txt, 30_max_03.txt, 30_max_04.txt, 30_max_05.txt, 30_max_06.txt, 40_corner_01.txt, 40_corner_02.txt, 40_corner_03.txt, 40_corner_04.txt, 50_small_01.txt, 50_small_02.txt, 50_small_03.txt, 50_small_04.txt, 50_small_05.txt, 50_small_06.txt, 50_small_07.txt, 50_small_08.txt, 50_small_09.txt, 50_small_10.txt, 60_hand_01.txt, 60_hand_02.txt, 60_hand_03.txt, 60_hand_04.txt, 70_max_01.txt, 70_max_02.txt, 70_max_03.txt |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
00_example_01.txt | AC | 1 ms | 380 KB |
00_example_02.txt | AC | 2 ms | 380 KB |
00_example_03.txt | AC | 2 ms | 508 KB |
10_rand_01.txt | AC | 4 ms | 1660 KB |
10_rand_02.txt | AC | 23 ms | 2940 KB |
10_rand_03.txt | AC | 5 ms | 2044 KB |
10_rand_04.txt | AC | 3 ms | 1404 KB |
10_rand_05.txt | AC | 5 ms | 2300 KB |
10_rand_06.txt | AC | 5 ms | 2812 KB |
10_rand_07.txt | AC | 6 ms | 3324 KB |
10_rand_08.txt | AC | 3 ms | 1916 KB |
10_rand_09.txt | AC | 6 ms | 3196 KB |
10_rand_10.txt | AC | 3 ms | 1532 KB |
10_rand_12.txt | AC | 39 ms | 4476 KB |
10_rand_13.txt | AC | 40 ms | 4476 KB |
30_max_01.txt | AC | 77 ms | 9084 KB |
30_max_02.txt | AC | 129 ms | 10236 KB |
30_max_03.txt | AC | 55 ms | 8060 KB |
30_max_04.txt | AC | 53 ms | 8956 KB |
30_max_05.txt | AC | 51 ms | 8956 KB |
30_max_06.txt | AC | 53 ms | 8956 KB |
40_corner_01.txt | TLE | 3156 ms | 14204 KB |
40_corner_02.txt | TLE | 3155 ms | 14204 KB |
40_corner_03.txt | TLE | 3156 ms | 12156 KB |
40_corner_04.txt | TLE | 3156 ms | 12156 KB |
50_small_01.txt | AC | 2 ms | 1020 KB |
50_small_02.txt | AC | 2 ms | 508 KB |
50_small_03.txt | AC | 2 ms | 636 KB |
50_small_04.txt | AC | 2 ms | 1020 KB |
50_small_05.txt | AC | 3 ms | 1148 KB |
50_small_06.txt | AC | 3 ms | 1148 KB |
50_small_07.txt | AC | 2 ms | 508 KB |
50_small_08.txt | AC | 2 ms | 508 KB |
50_small_09.txt | AC | 2 ms | 1020 KB |
50_small_10.txt | AC | 2 ms | 892 KB |
60_hand_01.txt | AC | 2 ms | 380 KB |
60_hand_02.txt | AC | 2 ms | 380 KB |
60_hand_03.txt | AC | 1 ms | 380 KB |
60_hand_04.txt | AC | 2 ms | 380 KB |
70_max_01.txt | AC | 18 ms | 2940 KB |
70_max_02.txt | AC | 18 ms | 2940 KB |
70_max_03.txt | AC | 18 ms | 2940 KB |