Submission #39057011


Source Code Expand

Copy
{-# LANGUAGE DataKinds,ScopedTypeVariables,KindSignatures #-}
import Control.Monad
import Data.Monoid
import Data.Maybe ( fromJust )
import Data.Array ( Array, (!), listArray, assocs , elems)
import Data.List ( foldl', sort)
import Data.Array.ST
import Control.Monad.ST
import qualified Data.ByteString.Char8 as BS
import GHC.TypeNats ( KnownNat, Nat, natVal )
import Data.Proxy ( Proxy(..) )
import Data.Ratio ( denominator, numerator )
import Data.Set as S (Set, empty, insert, delete, member)
import Debug.Trace
readInt :: BS.ByteString -> Int
readInt = fst . fromJust . BS.readInt
readIntList :: BS.ByteString -> [Int]
readIntList = map readInt . BS.words
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
{-# LANGUAGE DataKinds,ScopedTypeVariables,KindSignatures #-}

import Control.Monad
import Data.Monoid
import Data.Maybe ( fromJust )
import Data.Array ( Array, (!), listArray, assocs , elems) 
import Data.List ( foldl', sort)
import Data.Array.ST
import Control.Monad.ST
import qualified Data.ByteString.Char8 as BS
import GHC.TypeNats ( KnownNat, Nat, natVal )
import Data.Proxy ( Proxy(..) )
import Data.Ratio ( denominator, numerator )
import Data.Set as S (Set, empty, insert, delete, member)
import Debug.Trace


readInt :: BS.ByteString -> Int
readInt = fst . fromJust . BS.readInt
readIntList :: BS.ByteString -> [Int]
readIntList = map readInt . BS.words
readIntTuple :: BS.ByteString -> (Int, Int)
readIntTuple = (\[x, y] -> (x, y)) . readIntList
getInt :: IO Int
getInt = readInt <$> BS.getLine
getInts :: IO [Int]
getInts = readIntList <$> BS.getLine
getIntTuple :: IO (Int, Int)
getIntTuple = readIntTuple <$> BS.getLine
getIntNLists :: Int -> IO [[Int]]
getIntNLists n = fmap readIntList <$> replicateM n BS.getLine 
getIntMatrix :: IO ([[Int]])
getIntMatrix = fmap readIntList . BS.lines <$> BS.getContents
getIntNTuples :: Int -> IO [(Int, Int)]
getIntNTuples n = fmap readIntTuple <$> replicateM n BS.getLine
getIntTuples :: IO [(Int, Int)]
getIntTuples = fmap readIntTuple . BS.lines <$> BS.getContents


newtype ModInt (m :: Nat) = ModInt Integer deriving (Eq)

instance KnownNat m => Num (ModInt m) where
  ModInt x + ModInt y = fromInteger $ x + y
  ModInt x - ModInt y = fromInteger $ x - y
  ModInt x * ModInt y = fromInteger $ x * y
  negate (ModInt x) =  fromInteger $ negate x
  abs a = a
  signum _ = 1
  fromInteger x =  ModInt $ x `mod` (fromIntegral $ natVal (Proxy :: Proxy m))

instance KnownNat m => Fractional (ModInt m) where
  recip a@(ModInt x) = fromInteger r where
    (_, r, _) = exgcd x (fromIntegral $ natVal (Proxy :: Proxy m))
  fromRational x = fromInteger $ numerator x `div` denominator x


exgcd :: Integral a => a -> a -> (a, a, a)
exgcd a b = f $ go a b 1 0 0 1
  where
    go r0 r1 s0 s1 t0 t1
      | r1 == 0   = (r0, s0, t0)
      | otherwise = go r1 r2 s1 s2 t1 t2
      where
        (q, r2) = r0 `divMod` r1
        s2 = s0 - q*s1
        t2 = t0 - q*t1
    f (g,u,v)
      | g < 0 = (-g, -u, -v)
      | otherwise = (g,u,v)

instance KnownNat m => Bounded (ModInt m) where
  minBound = ModInt 0
  maxBound = ModInt $ fromIntegral $ natVal (Proxy :: Proxy m) - 1

instance KnownNat m => Enum (ModInt m) where
  toEnum = fromInteger . toInteger
  fromEnum (ModInt x) = fromInteger x

instance KnownNat m => Ord (ModInt m) where
  ModInt x <= ModInt y = x <= y

instance KnownNat m => Show (ModInt m) where
  show (ModInt x) = show x

(^) :: (Num a) => a -> Int -> a
(^) a n = go a n 1
  where
    go _ 0 res = res
    go a n res
      | even n = go (a*a) (n `div` 2) res
      | otherwise = go a (n-1) (res*a)


shakutori :: (Num a, Eq a) =>(t -> p -> Bool) -> (p -> t -> p) -> (p -> t -> p) -> p -> [t] -> [a]
shakutori p op invOp identity as = go as as 0 identity
  where
    go lls@(l:ls) [] len res = len : (go ls [] (len-1) (invOp res l))
    go lls@(l:ls) rrs@(r:rs) len res
      | p r res = go lls rs (len + 1) (op res r)
      | len == 0 = 0:(go ls rs 0 identity)
      | otherwise =  len : (go ls rrs (len-1) (invOp res l))
    go _ _ len _ = []


newtype MaxPlus a = MaxPlus { unMaxPlus :: a } deriving (Eq, Ord, Show)
newtype MinPlus a = MinPlus { unMinPlus :: a } deriving (Eq, Ord, Show)


class Semiring s where
  (<+>) :: s -> s -> s
  (<.>) :: s -> s -> s
  zero :: s
  one :: s

instance (Ord a, Bounded a, Num a) =>  Semiring (MaxPlus a) where
  t1@(MaxPlus v1) <+> t2@(MaxPlus v2) = MaxPlus (max v1 v2)
  t1@(MaxPlus v1) <.> t2@(MaxPlus v2)
    | t1 == zero = zero
    | t2 == zero = zero
    | otherwise = MaxPlus (v1 + v2)
  zero = MaxPlus minBound
  one = MaxPlus 0

instance (Ord a, Bounded a, Num a) => Semiring (MinPlus a) where
  t1@(MinPlus v1) <+> t2@(MinPlus v2) = MinPlus (min v1 v2)
  t1@(MinPlus v1) <.> t2@(MinPlus v2)
    | t1 == zero = zero
    | t2 == zero = zero
    | otherwise = MinPlus (v1 + v2)
  zero = MinPlus maxBound
  one = MinPlus 0

instance KnownNat m => Semiring (ModInt m) where
  (<+>) = (+)
  (<.>) = (*)
  zero = 0
  one = 1

data DPProblem p sc = DPProblem {
  start :: p,
  getRange :: (p, p),
  isTrivial :: p -> Bool,
  subproblems :: p -> [(sc, p)]
}

dpSolve :: forall i sc s. (Semiring sc, Ix i, Eq sc) => DPProblem i sc -> ST s sc
dpSolve dp = do
  memo <- newArray (getRange dp) zero :: ST s (STArray s i sc)
  go (start dp) memo where
    go p memo
      | isTrivial dp p = return one
      | otherwise = do
        res <- readArray memo p
        if res /= zero then return res
        else do
          ret <- foldM (\acc (s, sp) -> (<+>) acc <$> ((<.>) s <$> go sp memo)) zero (subproblems dp p)
          writeArray memo p ret
          return ret

supplement :: (Array Int Int, Int, Int) -> DPProblem Int (ModInt 1000000007)
supplement (as,n,m) = DPProblem {
  start = 1,
  getRange = (1, n+1),
  isTrivial = (>= n),
  subproblems = \i ->  [(1, i + j ) | j <- [1.. as ! i]]
}


main :: IO ()
main = do
  (n,m) <- getIntTuple
  input <- concat <$> getIntNLists n
  let as = listArray (1,n) $ shakutori (\r res -> not (S.member r res)) (flip S.insert) (flip S.delete) S.empty input
  let ans = runST $ dpSolve $ supplement (as,n,m)
  print $  ans

Submission Info

Submission Time
Task D - サプリメント
User g960059
Language Haskell (GHC 8.8.3)
Score 30
Code Size 5371 Byte
Status TLE
Exec Time 3309 ms
Memory 31516 KB

Compile Error

Loaded package environment from /home/contestant/.ghc/x86_64-linux-8.8.3/environments/default

Judge Result

Set Name Sample Subtask1 Subtask2
Score / Max Score 0 / 0 30 / 30 0 / 70
Status
AC × 2
AC × 22
AC × 37
TLE × 5
Set Name Test Cases
Sample subtask0-sample01.txt, subtask0-sample02.txt
Subtask1 subtask0-sample01.txt, subtask0-sample02.txt, subtask1-01.txt, subtask1-02.txt, subtask1-03.txt, subtask1-04.txt, subtask1-05.txt, subtask1-06.txt, subtask1-07.txt, subtask1-08.txt, subtask1-09.txt, subtask1-10.txt, subtask1-11.txt, subtask1-12.txt, subtask1-13.txt, subtask1-14.txt, subtask1-15.txt, subtask1-16.txt, subtask1-17.txt, subtask1-18.txt, subtask1-19.txt, subtask1-20.txt
Subtask2 subtask0-sample01.txt, subtask0-sample02.txt, subtask1-01.txt, subtask1-02.txt, subtask1-03.txt, subtask1-04.txt, subtask1-05.txt, subtask1-06.txt, subtask1-07.txt, subtask1-08.txt, subtask1-09.txt, subtask1-10.txt, subtask1-11.txt, subtask1-12.txt, subtask1-13.txt, subtask1-14.txt, subtask1-15.txt, subtask1-16.txt, subtask1-17.txt, subtask1-18.txt, subtask1-19.txt, subtask1-20.txt, subtask2-01.txt, subtask2-02.txt, subtask2-03.txt, subtask2-04.txt, subtask2-05.txt, subtask2-06.txt, subtask2-07.txt, subtask2-08.txt, subtask2-09.txt, subtask2-10.txt, subtask2-11.txt, subtask2-12.txt, subtask2-13.txt, subtask2-14.txt, subtask2-15.txt, subtask2-16.txt, subtask2-17.txt, subtask2-18.txt, subtask2-19.txt, subtask2-20.txt
Case Name Status Exec Time Memory
subtask0-sample01.txt AC 10 ms 3656 KB
subtask0-sample02.txt AC 2 ms 3776 KB
subtask1-01.txt AC 6 ms 5072 KB
subtask1-02.txt AC 12 ms 5204 KB
subtask1-03.txt AC 7 ms 5232 KB
subtask1-04.txt AC 28 ms 5528 KB
subtask1-05.txt AC 9 ms 5424 KB
subtask1-06.txt AC 12 ms 5440 KB
subtask1-07.txt AC 26 ms 5704 KB
subtask1-08.txt AC 12 ms 5584 KB
subtask1-09.txt AC 13 ms 5816 KB
subtask1-10.txt AC 15 ms 5860 KB
subtask1-11.txt AC 7 ms 5812 KB
subtask1-12.txt AC 26 ms 6228 KB
subtask1-13.txt AC 32 ms 6164 KB
subtask1-14.txt AC 34 ms 6480 KB
subtask1-15.txt AC 11 ms 5748 KB
subtask1-16.txt AC 15 ms 5860 KB
subtask1-17.txt AC 44 ms 6580 KB
subtask1-18.txt AC 922 ms 6984 KB
subtask1-19.txt AC 12 ms 5820 KB
subtask1-20.txt AC 13 ms 5684 KB
subtask2-01.txt AC 143 ms 10288 KB
subtask2-02.txt AC 45 ms 14648 KB
subtask2-03.txt AC 1569 ms 21500 KB
subtask2-04.txt TLE 3309 ms 26236 KB
subtask2-05.txt AC 95 ms 23408 KB
subtask2-06.txt AC 80 ms 26792 KB
subtask2-07.txt AC 77 ms 26796 KB
subtask2-08.txt TLE 3309 ms 29928 KB
subtask2-09.txt AC 161 ms 26932 KB
subtask2-10.txt AC 2674 ms 27112 KB
subtask2-11.txt AC 164 ms 27052 KB
subtask2-12.txt AC 2673 ms 27336 KB
subtask2-13.txt AC 2677 ms 27176 KB
subtask2-14.txt AC 91 ms 27476 KB
subtask2-15.txt TLE 3309 ms 31352 KB
subtask2-16.txt AC 295 ms 28832 KB
subtask2-17.txt AC 2672 ms 27204 KB
subtask2-18.txt TLE 3309 ms 31516 KB
subtask2-19.txt AC 92 ms 27380 KB
subtask2-20.txt TLE 3309 ms 31516 KB


2025-03-14 (Fri)
13:01:44 +00:00