結果
| 問題 |
No.59 鉄道の旅
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-10-19 13:57:10 |
| 言語 | Haskell (9.10.1) |
| 結果 |
CE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 3,406 bytes |
| コンパイル時間 | 583 ms |
| コンパイル使用メモリ | 161,152 KB |
| 最終ジャッジ日時 | 2024-11-14 23:52:17 |
| 合計ジャッジ時間 | 1,015 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
コンパイルメッセージ
Loaded package environment from /home/judge/.ghc/x86_64-linux-9.8.2/environments/default
[1 of 2] Compiling Main ( Main.hs, Main.o )
Main.hs:62:19: error: [GHC-87543]
Ambiguous occurrence ‘.<<.’.
It could refer to
either ‘Data.Bits..<<.’,
imported from ‘Data.Bits’ at Main.hs:5:1-26,
or ‘Main..<<.’, defined at Main.hs:49:1.
|
62 | | n >= 1 = 1 .<<. (63 - (clz n))
| ^^^^
Main.hs:118:37: error: [GHC-87543]
Ambiguous occurrence ‘.>>.’.
It could refer to
either ‘Data.Bits..>>.’,
imported from ‘Data.Bits’ at Main.hs:5:1-26,
or ‘Main..>>.’, defined at Main.hs:53:1.
|
118 | then go (w - u) (step .>>. 1) (i + step) m
| ^^^^
Main.hs:119:31: error: [GHC-87543]
Ambiguous occurrence ‘.>>.’.
It could refer to
either ‘Data.Bits..>>.’,
imported from ‘Data.Bits’ at Main.hs:5:1-26,
or ‘Main..>>.’, defined at Main.hs:53:1.
|
119 | else go w (step .>>. 1) i m
| ^^^^
Main.hs:120:27: error: [GHC-87543]
Ambiguous occurrence ‘.>>.’.
It could refer to
either ‘Data.Bits..>>.’,
imported from ‘Data.Bits’ at Main.hs:5:1-26,
or ‘Main..>>.’, defined at Main.hs:53:1.
|
120 | else go w (step .>>. 1) i m
| ^^^^
ソースコード
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE FlexibleContexts #-}
import Control.Monad
import Data.Bits
import qualified Data.Array.IO as ArrIO
import qualified Data.Vector.Fusion.Stream.Monadic as VFSM
main :: IO ()
main = do
[n, k] <- map read . words <$> getLine
bit <- newBIT 2000000
rep n $ \_ -> do
w <- readLn :: IO Int
if w > 0
then do
temp1 <- bit -|-! 2000000
temp2 <- bit -|-! (w - 1)
when (temp1 - temp2 < k) $ incBIT bit w 1
else do
let w' = abs w
temp3 <- bit -|-! w'
temp4 <- bit -|-! (w' - 1)
when (temp3 - temp4 > 0) $ incBIT bit w' (-1)
print =<< bit -|-! 2000000
-------------------------------------------------------------------------------
-- Utils
-------------------------------------------------------------------------------
stream :: Monad m => Int -> Int -> VFSM.Stream m Int
stream !l !r = VFSM.Stream step l
where
step x
| x < r = return $ VFSM.Yield x (x + 1)
| otherwise = return $ VFSM.Done
{-# INLINE [0] step #-}
{-# INLINE [1] stream #-}
rep :: Monad m => Int -> (Int -> m ()) -> m ()
rep n = flip VFSM.mapM_ (stream 0 n)
{-# INLINE rep #-}
-------------------------------------------------------------------------------
-- Binary Indexed Tree
-------------------------------------------------------------------------------
infixl 8 .<<., .>>.
(.<<.) :: Bits b => b -> Int -> b
(.<<.) = unsafeShiftL
{-# INLINE (.<<.) #-}
(.>>.) :: Bits b => b -> Int -> b
(.>>.) = unsafeShiftR
{-# INLINE (.>>.) #-}
clz :: FiniteBits fb => fb -> Int
clz = countLeadingZeros
{-# INLINE clz #-}
ltPow2 :: Int -> Int
ltPow2 n
| n >= 1 = 1 .<<. (63 - (clz n))
| otherwise = 0
type BinaryIndexedTree = ArrIO.IOUArray Int Int
newBIT :: Int -> IO BinaryIndexedTree
newBIT n = ArrIO.newListArray (1, n) $ repeat 0
{-# INLINE newBIT #-}
infixl 9 -|-!
(-|-!) :: BinaryIndexedTree -> Int -> IO Int
bit -|-! i = iter i 0
where
iter :: Int -> Int -> IO Int
iter z a
| z < 1 = return a
| otherwise = do
b <- (+ a) <$> ArrIO.readArray bit z
let j = z - (z .&. (- z))
iter j b
sumFromToBIT :: BinaryIndexedTree -> Int -> Int -> IO Int
sumFromToBIT bit l r
| l >= 2 = (-) <$> bit -|-! r <*> bit -|-! (l - 1)
| otherwise = bit -|-! r
incBIT :: BinaryIndexedTree -> Int -> Int -> IO ()
incBIT bit i v = do
(_, u) <- ArrIO.getBounds bit
iter i u v bit
where
iter z key value b = when (z <= key) $ do
ArrIO.writeArray b z . (+ value) =<< ArrIO.readArray b z
iter (z + (z .&. (-z))) key value b
readBIT :: BinaryIndexedTree -> Int -> IO Int
readBIT bit i = sumFromToBIT bit i (i + 1)
writeBIT :: BinaryIndexedTree -> Int -> Int -> IO ()
writeBIT bit i x = readBIT bit i >>= incBIT bit i . (x - )
findMaxIndexLT :: BinaryIndexedTree -> Int -> IO Int
findMaxIndexLT bit w0
| w0 <= 0 = return 0
| otherwise = do
n <- snd <$> ArrIO.getBounds bit
go w0 (ltPow2 n) 0 n
where
go !w !step !i !m
| step == 0 = return (i + 1)
| otherwise = do
if i + step < m
then do
u <- ArrIO.readArray bit (i + step)
if u < w
then go (w - u) (step .>>. 1) (i + step) m
else go w (step .>>. 1) i m
else go w (step .>>. 1) i m
{-# INLINE findMaxIndexLT #-}