結果
問題 | No.318 学学学学学 |
ユーザー | Haar |
提出日時 | 2018-09-03 01:31:29 |
言語 | Haskell (9.8.2) |
結果 |
CE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 3,839 bytes |
コンパイル時間 | 187 ms |
コンパイル使用メモリ | 158,848 KB |
最終ジャッジ日時 | 2024-11-14 20:36:21 |
合計ジャッジ時間 | 1,083 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、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:13:1: error: [GHC-87110] Could not load module ‘Control.Monad.Primitive’. It is a member of the hidden package ‘primitive-0.9.0.0’. Use -v to see a list of the files searched for. | 13 | import Control.Monad.Primitive | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Main.hs:29:1: error: [GHC-87110] Could not load module ‘Data.Set’. It is a member of the hidden package ‘containers-0.6.8’. Use -v to see a list of the files searched for. | 29 | import qualified Data.Set as Set | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ソースコード
{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE UnboxedTuples #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE BangPatterns #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE ViewPatterns #-} {-# LANGUAGE TupleSections #-} {-# LANGUAGE MultiWayIf #-} import Control.Monad import Control.Monad.ST import Control.Monad.State import Control.Monad.Primitive import Control.Applicative import Control.Arrow import Data.List import Data.Array import Data.Array.IO import Data.Array.ST import Data.IORef import Data.STRef import Data.Maybe import Data.Bits import Data.Ord import Data.Ratio import Data.Int import Data.Char import qualified Data.ByteString.Char8 as BS import qualified Data.Set as Set import qualified Data.Vector as V import qualified Data.Vector.Mutable as VM import qualified Data.Vector.Unboxed as VU import qualified Data.Vector.Unboxed.Mutable as VUM import qualified Data.Vector.Generic as VG import qualified Data.Vector.Generic.Mutable as VGM import Data.Tuple import Data.Function import Text.Printf import Debug.Trace import Numeric modifyArray arr i f = readArray arr i >>= \x -> writeArray arr i (f x) listToTuple2 [a,b] = (a,b) listToTuple3 [a,b,c] = (a,b,c) listToTuple4 [a,b,c,d] = (a,b,c,d) listToTuple5 [a,b,c,d,e] = (a,b,c,d,e) readIntBS = fst . fromJust . BS.readInt for = flip map infixr 1 ? (?) :: Bool -> (a,a) -> a (?) b t = (if b then fst else snd) t main :: IO () main = do n <- readLn :: IO Int as <- map readIntBS . BS.words <$> BS.getLine :: IO [Int] let xs = (groupBy ((==) `on` fst) . sort . (flip zip) [0..]) as inf = maxBound :: Int f x y = if x == inf then y else x bs <- newLazySegmentTree n inf f :: IO (IOULazySegmentTree Int) forM_ xs $ \x -> do let (a,i) = head x (_,j) = last x modifyLazySegmentTree bs i (j+1) (const a) putStrLn =<< unwords . map show <$> (forM [0..n-1] $ \i -> findLazySegmentTree bs i) {-- 範囲更新・点取得のセグメント木--} type MLazySegmentTree v s a = (v s a, a, (a -> a -> a)) -- (セグメント木, 単位元, 二項演算) type STLazySegmentTree s a = MLazySegmentTree VM.MVector s a type IOLazySegmentTree a = STLazySegmentTree RealWorld a type STULazySegmentTree s a = MLazySegmentTree VUM.MVector s a type IOULazySegmentTree a = STULazySegmentTree RealWorld a newLazySegmentTree :: (PrimMonad m, VGM.MVector v a) => Int -> a -> (a -> a -> a) -> m (MLazySegmentTree v (PrimState m) a) newLazySegmentTree n e f = return . (,e,f) =<< VGM.replicate m e where m = 2 * (2 ^ (ceiling $ logBase 2 (fromIntegral n))) - 1 modifyLazySegmentTree :: (PrimMonad m, VGM.MVector v a) => MLazySegmentTree v (PrimState m) a -> Int -> Int -> (a -> a) -> m () modifyLazySegmentTree (tree,e,f) x y g = do aux 0 0 n where n = (VGM.length tree) `div` 2 + 1 aux i l r | r <= x || y <= l = return () | x <= l && r <= y = VGM.read tree i >>= \a -> VGM.write tree i (g a) | otherwise = propag i >> aux (i*2+1) l ((l+r)`div`2) >> aux (i*2+2) ((l+r)`div`2) r propag i = do a <- VGM.read tree i when (i<n-1) $ do VGM.read tree (i*2+1) >>= \b -> VGM.write tree (i*2+1) (f a b) VGM.read tree (i*2+2) >>= \b -> VGM.write tree (i*2+2) (f a b) VGM.write tree i e findLazySegmentTree :: (PrimMonad m, VGM.MVector v a) => MLazySegmentTree v (PrimState m) a -> Int -> m a findLazySegmentTree (tree,e,f) i = do aux ((j-1)`div`2) VGM.read tree j where n = (VGM.length tree + 1) `div` 2 j = i + n - 1 aux x = do when (x >= 0) $ do aux ((x-1)`div`2) propag x propag i = do a <- VGM.read tree i when (i < n-1) $ do VGM.read tree (i*2+1) >>= \b -> VGM.write tree (i*2+1) (f a b) VGM.read tree (i*2+2) >>= \b -> VGM.write tree (i*2+2) (f a b) VGM.write tree i e