結果
問題 | No.998 Four Integers |
ユーザー |
|
提出日時 | 2020-10-31 11:07:51 |
言語 | Haskell (9.10.1) |
結果 |
CE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 18,775 bytes |
コンパイル時間 | 1,218 ms |
コンパイル使用メモリ | 189,964 KB |
最終ジャッジ日時 | 2024-11-14 23:53:45 |
合計ジャッジ時間 | 1,628 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、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:319:17: error: [GHC-87543] Ambiguous occurrence ‘.>>.’. It could refer to either ‘Data.Bits..>>.’, imported from ‘Data.Bits’ at Main.hs:8:1-26, or ‘Main..>>.’, defined at Main.hs:543:1. | 319 | minrun n0 = (n0 .>>. extra) + if (lowMask .&. n0) > 0 then 1 else 0 | ^^^^ Main.hs:321:22: error: [GHC-87543] Ambiguous occurrence ‘.>>.’. It could refer to either ‘Data.Bits..>>.’, imported from ‘Data.Bits’ at Main.hs:8:1-26, or ‘Main..>>.’, defined at Main.hs:543:1. | 321 | !n1 = n0 .|. (n0 .>>. 1) | ^^^^ Main.hs:322:22: error: [GHC-87543] Ambiguous occurrence ‘.>>.’. It could refer to either ‘Data.Bits..>>.’, imported from ‘Data.Bits’ at Main.hs:8:1-26, or ‘Main..>>.’, defined at Main.hs:543:1. | 322 | !n2 = n1 .|. (n1 .>>. 2) | ^^^^ Main.hs:323:22: error: [GHC-87543] Ambiguous occurrence ‘.>>.’. It could refer to either ‘Data.Bits..>>.’, imported from ‘Data.Bits’ at Main.hs:8:1-26, or ‘Main..>>.’, defined at Main.hs:543:1. | 323 | !n3 = n2 .|. (n2 .>>. 4) | ^^^^ Main.hs:324:22: error: [GHC-87543] Ambiguous occurrence ‘.>>.’. It could refer to either ‘Data.Bits..>>.’, imported from ‘Data.Bits’ at Main.hs:8:1-26, or ‘Main..>>.’, defined at Main.hs:543:1. | 324 | !n4 = n3 .|. (n3 .>>. 8) | ^^^^ Main.hs:325:22: error: [GHC-87543] Ambiguous occurrence ‘.>>.’. It could refer to either ‘Data.Bits..>>.’, imported from ‘Data.Bits’ at Main.hs:8:1-26,
ソースコード
LANGUAGEmoduleMainwhereimportControl.MonadimportControl.Monad.STimportControl.Monad.StateimportData.BitsimportData.BoolimportData.CharimportData.CoerceimportqualifiedData.ByteString.CharasBSCimportqualifiedData.Vector.Generic.MutableasVGMimportqualifiedData.Vector.UnboxedasVUmain::IO()main = doxs <- seqInput 4putStrLn $ bool "No" "Yes" (solve xs)solve::VUVectorInt->Boolsolve xs = runST $ doys <- VU.unsafeThaw xstimSort yszs <- VU.unsafeFreeze ysleta = zs VU.! 0b = zs VU.! 1c = zs VU.! 2d = zs VU.! 3return ((a + 1 == b) && (b + 1 == c) && (c + 1 == d))type CParser a = StateT BSC8.ByteString Maybe arunCParser::CParsera->BSC8ByteString->MaybeaBSC8ByteStringrunCParser = runStateTINLINEint::CParserIntint = coerce $ BSC8.readInt . BSC8.dropWhile isSpaceINLINEseqInput::Int->IOVUVectorIntseqInput n = VU.unfoldrN n (runCParser int) <$> BSC8.getLineINLINEtimSort::VGMMVectorvaOrda=>vsa->STs()timSort = timSortBy comparetimSortBy::VGMMVectorva=>a->a->Ordering->vsa->STs()timSortBy cmp vec| mr == len = iter [0] 0 (error "no merge buffer needed!")| otherwise = VGM.unsafeNew 256 >>= iter [] 0wherelen = VGM.length vecmr = minrun leniter s i tmpBuf| i >= len = performRemainingMerges s tmpBuf| otherwise = do(order, runLen) <- nextRun cmp vec i lenwhen (order == Descending) $ VGM.reverse $ VGM.unsafeSlice i runLen veclet runEnd = min len (i + max runLen mr)sortByBounds' cmp vec i (i + runLen) runEnd(s', tmpBuf') <- performMerges (i : s) runEnd tmpBufiter s' runEnd tmpBuf'runLengthInvariantBroken a b c i = (b - a <= i - b) || (c - b <= i - c)performMerges [b,a] i tmpBuf| i - b >= b - a = merge cmp vec a b i tmpBuf >>= performMerges [a] iperformMerges (c:b:a:ss) i tmpBuf| runLengthInvariantBroken a b c i =if i - c <= b - athen merge cmp vec b c i tmpBuf >>= performMerges (b:a:ss) ielse do tmpBuf' <- merge cmp vec a b c tmpBuf(ass', tmpBuf'') <- performMerges (a:ss) c tmpBuf'performMerges (c:ass') i tmpBuf''performMerges s _ tmpBuf = return (s, tmpBuf)performRemainingMerges (b:a:ss) tmpBuf =merge cmp vec a b len tmpBuf >>= performRemainingMerges (a:ss)performRemainingMerges _ _ = return ()INLINEsortByBounds::VGMMVectorva=>a->a->Ordering->vsa->Int->Int->STs()sortByBounds cmp a l u| len < 2 = return ()| len == 2 = sort2ByOffset cmp a l| len == 3 = sort3ByOffset cmp a l| len == 4 = sort4ByOffset cmp a l| otherwise = sort4ByOffset cmp a l >> sortByBounds' cmp a l (l + 4) uwhere!len = u - lINLINEsortByBounds'::VGMMVectorva=>a->a->Ordering->vsa->Int->Int->Int->STs()sortByBounds' cmp a l m u = _sort mwhere_sort i| i < u = dov <- VGM.unsafeRead a iinsert cmp a l v i_sort (i + 1)| otherwise = return ()INLINEinsert::VGMMVectorva=>a->a->Ordering->vsa->Int->a->Int->STs()insert cmp a l = loopwhereloop val j| j <= l = VGM.unsafeWrite a l val| otherwise = doe <- VGM.unsafeRead a (j - 1)case cmp val e ofLT -> VGM.unsafeWrite a j e >> loop val (j - 1)_ -> VGM.unsafeWrite a j valINLINEsort2ByOffset::VGMMVectorva=>a->a->Ordering->vsa->Int->STs()sort2ByOffset cmp a off = sort2ByIndex cmp a off (off + 1)sort2ByIndex::VGMMVectorva=>a->a->Ordering->vsa->Int->Int->STs()sort2ByIndex cmp a i j = doa0 <- VGM.unsafeRead a ia1 <- VGM.unsafeRead a jcase cmp a0 a1 ofGT -> VGM.unsafeWrite a i a1 >> VGM.unsafeWrite a j a0_ -> return ()sort3ByOffset::VGMMVectorva=>a->a->Ordering->vsa->Int->STs()sort3ByOffset cmp a off = sort3ByIndex cmp a off (off + 1) (off + 2)sort3ByIndex::VGMMVectorva=>a->a->Ordering->vsa->Int->Int->Int->STs()sort3ByIndex cmp a i j k = doa0 <- VGM.unsafeRead a ia1 <- VGM.unsafeRead a ja2 <- VGM.unsafeRead a kcase cmp a0 a1 ofGT -> case cmp a0 a2 ofGT -> case cmp a2 a1 ofLT -> doVGM.unsafeWrite a i a2VGM.unsafeWrite a k a0_ -> doVGM.unsafeWrite a i a1VGM.unsafeWrite a j a2VGM.unsafeWrite a k a0_ -> doVGM.unsafeWrite a i a1VGM.unsafeWrite a j a0_ -> case cmp a1 a2 ofGT -> case cmp a0 a2 ofGT -> doVGM.unsafeWrite a i a2VGM.unsafeWrite a j a0VGM.unsafeWrite a k a1_ -> doVGM.unsafeWrite a j a2VGM.unsafeWrite a k a1_ -> return ()sort4ByOffset::VGMMVectorva=>a->a->Ordering->vsa->Int->STs()sort4ByOffset cmp a off = sort4ByIndex cmp a off (off + 1) (off + 2) (off + 3)sort4ByIndex::VGMMVectorva=>a->a->Ordering->vsa->Int->Int->Int->Int->STs()sort4ByIndex cmp a i j k l = doa0 <- VGM.unsafeRead a ia1 <- VGM.unsafeRead a ja2 <- VGM.unsafeRead a ka3 <- VGM.unsafeRead a lcase cmp a0 a1 ofGT -> case cmp a0 a2 ofGT -> case cmp a1 a2 ofGT -> case cmp a1 a3 ofGT -> case cmp a2 a3 ofGT -> doVGM.unsafeWrite a i a3VGM.unsafeWrite a j a2VGM.unsafeWrite a k a1VGM.unsafeWrite a l a0_ -> doVGM.unsafeWrite a i a2VGM.unsafeWrite a j a3VGM.unsafeWrite a k a1VGM.unsafeWrite a l a0_ -> case cmp a0 a3 ofGT -> doVGM.unsafeWrite a i a2VGM.unsafeWrite a j a1VGM.unsafeWrite a k a3VGM.unsafeWrite a l a0_ -> doVGM.unsafeWrite a i a2VGM.unsafeWrite a j a1VGM.unsafeWrite a k a0VGM.unsafeWrite a l a3_ -> case cmp a2 a3 ofGT -> case cmp a1 a3 ofGT -> doVGM.unsafeWrite a i a3VGM.unsafeWrite a j a1VGM.unsafeWrite a k a2VGM.unsafeWrite a l a0_ -> doVGM.unsafeWrite a i a1VGM.unsafeWrite a j a3VGM.unsafeWrite a k a2VGM.unsafeWrite a l a0_ -> case cmp a0 a3 ofGT -> doVGM.unsafeWrite a i a1VGM.unsafeWrite a j a2VGM.unsafeWrite a k a3VGM.unsafeWrite a l a0_ -> doVGM.unsafeWrite a i a1VGM.unsafeWrite a j a2VGM.unsafeWrite a k a0-- VGM.unsafeWrite a l a3_ -> case cmp a0 a3 ofGT -> case cmp a1 a3 ofGT -> doVGM.unsafeWrite a i a3-- VGM.unsafeWrite a j a1VGM.unsafeWrite a k a0VGM.unsafeWrite a l a2_ -> doVGM.unsafeWrite a i a1VGM.unsafeWrite a j a3VGM.unsafeWrite a k a0VGM.unsafeWrite a l a2_ -> case cmp a2 a3 ofGT -> doVGM.unsafeWrite a i a1VGM.unsafeWrite a j a0VGM.unsafeWrite a k a3VGM.unsafeWrite a l a2_ -> doVGM.unsafeWrite a i a1VGM.unsafeWrite a j a0-- VGM.unsafeWrite a k a2-- VGM.unsafeWrite a l a3_ -> case cmp a1 a2 ofGT -> case cmp a0 a2 ofGT -> case cmp a0 a3 ofGT -> case cmp a2 a3 ofGT -> doVGM.unsafeWrite a i a3VGM.unsafeWrite a j a2VGM.unsafeWrite a k a0VGM.unsafeWrite a l a1_ -> doVGM.unsafeWrite a i a2VGM.unsafeWrite a j a3VGM.unsafeWrite a k a0VGM.unsafeWrite a l a1_ -> case cmp a1 a3 ofGT -> doVGM.unsafeWrite a i a2VGM.unsafeWrite a j a0VGM.unsafeWrite a k a3VGM.unsafeWrite a l a1_ -> doVGM.unsafeWrite a i a2VGM.unsafeWrite a j a0VGM.unsafeWrite a k a1-- VGM.unsafeWrite a l a3_ -> case cmp a2 a3 ofGT -> case cmp a0 a3 ofGT -> doVGM.unsafeWrite a i a3VGM.unsafeWrite a j a0-- VGM.unsafeWrite a k a2VGM.unsafeWrite a l a1_ -> do-- VGM.unsafeWrite a i a0VGM.unsafeWrite a j a3-- VGM.unsafeWrite a k a2VGM.unsafeWrite a l a1_ -> case cmp a1 a3 ofGT -> do-- VGM.unsafeWrite a i a0VGM.unsafeWrite a j a2VGM.unsafeWrite a k a3VGM.unsafeWrite a l a1_ -> do-- VGM.unsafeWrite a i a0VGM.unsafeWrite a j a2VGM.unsafeWrite a k a1-- VGM.unsafeWrite a l a3_ -> case cmp a1 a3 ofGT -> case cmp a0 a3 ofGT -> doVGM.unsafeWrite a i a3VGM.unsafeWrite a j a0VGM.unsafeWrite a k a1VGM.unsafeWrite a l a2_ -> do-- VGM.unsafeWrite a i a0VGM.unsafeWrite a j a3VGM.unsafeWrite a k a1VGM.unsafeWrite a l a2_ -> case cmp a2 a3 ofGT -> do-- VGM.unsafeWrite a i a0-- VGM.unsafeWrite a j a1VGM.unsafeWrite a k a3VGM.unsafeWrite a l a2_ -> do-- VGM.unsafeWrite a i a0-- VGM.unsafeWrite a j a1-- VGM.unsafeWrite a k a2-- VGM.unsafeWrite a l a3return ()minrun::Int->Intminrun n0 = (n0 .>>. extra) + if (lowMask .&. n0) > 0 then 1 else 0where!n1 = n0 .|. (n0 .>>. 1)!n2 = n1 .|. (n1 .>>. 2)!n3 = n2 .|. (n2 .>>. 4)!n4 = n3 .|. (n3 .>>. 8)!n5 = n4 .|. (n4 .>>. 16)!n6 = n5 .|. (n5 .>>. 32)!lowMask = n6 .>>. 6!extra = popCount lowMaskINLINEdata Order = Ascending | Descending derivingEqShownextRun::VGMMVectorva=>a->a->Ordering->vsa->Int->Int->STsOrderIntnextRun _ _ i len | i + 1 >= len = return (Ascending, 1)nextRun cmp vec i len = dox <- VGM.unsafeRead vec iy <- VGM.unsafeRead vec (i + 1)if x `gt` y then desc y 2 else asc y 2wheregt a b = cmp a b == GTdesc _ !k | i + k >= len = return (Descending, k)desc x !k = doy <- VGM.unsafeRead vec (i + k)if x `gt` y then desc y (k + 1) else return (Descending, k)asc _ !k | i + k >= len = return (Ascending, k)asc x !k = doy <- VGM.unsafeRead vec (i + k)if x `gt` y then return (Ascending, k) else asc y (k + 1)INLINEminGallop::IntminGallop = 7INLINEmerge::VGMMVectorva=>a->a->Ordering->vsa->Int->Int->Int->vsa->STsvsamerge cmp vec l m u tmpBuf = dovm <- VGM.unsafeRead vec ml' <- gallopingSearchLeftPBounds (`gt` vm) vec l mif l' >= mthen return tmpBufelse dovn <- VGM.unsafeRead vec (m - 1)u' <- gallopingSearchRightPBounds (`gte` vn) vec m uif u' <= mthen return tmpBufelse (if (m - l') <= (u' - m) then mergeLo else mergeHi) cmp vec l' m u' tmpBufwheregt a b = cmp a b == GTgte a b = cmp a b /= LTINLINEmergeLo::VGMMVectorva=>a->a->Ordering->vsa->Int->Int->Int->vsa->STsvsamergeLo cmp vec l m u tempBuf' = dotmpBuf <- cloneSlice l tmpBufLen vec tempBuf'vi <- VGM.unsafeRead tmpBuf 0vj <- VGM.unsafeRead vec miter tmpBuf 0 m l vi vj minGallop minGallopreturn tmpBufwheregt a b = cmp a b == GTgte a b = cmp a b /= LTtmpBufLen = m - lfinalize tmpBuf i k = dolet from = VGM.unsafeSlice i (tmpBufLen - i) tmpBufto = VGM.unsafeSlice k (tmpBufLen - i) vecVGM.unsafeCopy to fromiter _ i _ _ _ _ _ _ | i >= tmpBufLen = return ()iter tmpBuf i j k _ _ _ _ | j >= u = finalize tmpBuf i kiter tmpBuf i j k _ vj 0 _ = doi' <- gallopingSearchLeftPBounds (`gt` vj) tmpBuf i tmpBufLenlet gallopLen = i' - ifrom = VGM.unsafeSlice i gallopLen tmpBufto = VGM.unsafeSlice k gallopLen vecVGM.unsafeCopy to fromwhen (i' < tmpBufLen) $ dovi' <- VGM.unsafeRead tmpBuf i'iter tmpBuf i' j (k + gallopLen) vi' vj minGallop minGallopiter tmpBuf i j k vi _ _ 0 = doj' <- gallopingSearchLeftPBounds (`gte` vi) vec j ulet gallopLen = j' - jfrom = VGM.slice j gallopLen vecto = VGM.slice k gallopLen vecVGM.unsafeMove to fromif j' >= u then finalize tmpBuf i (k + gallopLen) else dovj' <- VGM.unsafeRead vec j'iter tmpBuf i j' (k + gallopLen) vi vj' minGallop minGallopiter tmpBuf i j k vi vj ga gb| vj `gte` vi = doVGM.unsafeWrite vec k viwhen (i + 1 < tmpBufLen) $ dovi' <- VGM.unsafeRead tmpBuf (i + 1)iter tmpBuf (i + 1) j (k + 1) vi' vj (ga - 1) minGallop| otherwise = doVGM.unsafeWrite vec k vjif j + 1 >= uthen finalize tmpBuf i (k + 1)else dovj' <- VGM.unsafeRead vec (j + 1)iter tmpBuf i (j + 1) (k + 1) vi vj' minGallop (gb - 1)INLINEmergeHi::VGMMVectorva=>a->a->Ordering->vsa->Int->Int->Int->vsa->STsvsamergeHi cmp vec l m u tmpBuf' = dotmpBuf <- cloneSlice m tmpBufLen vec tmpBuf'vi <- VGM.unsafeRead vec (m - 1)vj <- VGM.unsafeRead tmpBuf (tmpBufLen - 1)iter tmpBuf (m - 1) (tmpBufLen - 1) (u - 1) vi vj minGallop minGallopreturn tmpBufwheregt a b = cmp a b == GTgte a b = cmp a b /= LTtmpBufLen = u - mfinalize tmpBuf j = dolet from = VGM.unsafeSlice 0 (j + 1) tmpBufto = VGM.unsafeSlice l (j + 1) vecVGM.unsafeCopy to fromiter _ _ j _ _ _ _ _ | j < 0 = return ()iter tmpBuf i j _ _ _ _ _ | i < l = finalize tmpBuf jiter tmpBuf i j k _ vj 0 _ = doi' <- gallopingSearchRightPBounds (`gt` vj) vec l ilet gallopLen = i - i'from = VGM.slice (i' + 1) gallopLen vecto = VGM.slice (k - gallopLen + 1) gallopLen vecVGM.unsafeMove to fromif i' < lthen finalize tmpBuf jelse dovi' <- VGM.unsafeRead vec i'iter tmpBuf i' j (k - gallopLen) vi' vj minGallop minGallopiter tmpBuf i j k vi _ _ 0 = doj' <- gallopingSearchRightPBounds (`gte` vi) tmpBuf 0 jlet gallopLen = j - j'from = VGM.slice (j' + 1) gallopLen tmpBufto = VGM.slice (k - gallopLen + 1) gallopLen vecVGM.unsafeCopy to fromwhen (j' >= 0) $ dovj' <- VGM.unsafeRead tmpBuf j'iter tmpBuf i j' (k - gallopLen) vi vj' minGallop minGallopiter tmpBuf i j k vi vj ga gb| vi `gt` vj = doVGM.unsafeWrite vec k viif i - 1 < lthen finalize tmpBuf jelse dovi' <- VGM.unsafeRead vec (i - 1)iter tmpBuf (i - 1) j (k - 1) vi' vj (ga - 1) minGallop| otherwise = doVGM.unsafeWrite vec k vjwhen (j - 1 >= 0) $ dovj' <- VGM.unsafeRead tmpBuf (j - 1)iter tmpBuf i (j - 1) (k - 1) vi vj' minGallop (gb - 1)INLINEcloneSlice::VGMMVectorva=>Int->Int->vsa->vsa->STsvsacloneSlice i len vec tmpBuf = dotmpBuf' <- ensureCapacity len tmpBufVGM.unsafeCopy (VGM.unsafeSlice 0 len tmpBuf') (VGM.unsafeSlice i len vec)return tmpBuf'INLINEensureCapacity::VGMMVectorva=>Int->vsa->STsvsaensureCapacity l tmpBuf| l <= VGM.length tmpBuf = return tmpBuf| otherwise = VGM.unsafeNew (2 * l)INLINEgallopingSearchLeftPBounds::VGMMVectorva=>a->Bool->vsa->Int->Int->STsIntgallopingSearchLeftPBounds p vec l u| u <= l = return l| otherwise = dox <- VGM.unsafeRead vec lif p x then return l else iter (l + 1) l 2wherebinSearch = binarySearchPBounds p veciter !i !j !_stepSize | i >= u - 1 = dox <- VGM.unsafeRead vec (u - 1)if p x then binSearch (j + 1) (u - 1) else return uiter !i !j !stepSize = dox <- VGM.unsafeRead vec iif p x then binSearch (j + 1) i else iter (i + stepSize) i (2 * stepSize)INLINEgallopingSearchRightPBounds::VGMMVectorva=>a->Bool->vsa->Int->Int->STsIntgallopingSearchRightPBounds p vec l u| u <= l = return l| otherwise = iter (u - 1) (u - 1) (-1)wherebinSearch = binarySearchPBounds p veciter !i !j !_stepSize | i <= l = dox <- VGM.unsafeRead vec lif p x then return l else binSearch (l + 1) jiter !i !j !stepSize = dox <- VGM.unsafeRead vec iif p x then iter (i + stepSize) i (2 * stepSize) else binSearch (i + 1) jINLINEbinarySearchPBounds::VGMMVectorva=>a->Bool->vsa->Int->Int->STsIntbinarySearchPBounds p vec = loopwhereloop !l !u| u <= l = return l| otherwise = VGM.unsafeRead vec k >>= \e -> if p e then loop l k else loop (k + 1) uwherek = midPoint u lINLINEmidPoint::Int->Int->IntmidPoint a b = toInt $ (toWord a + toWord b) `div` 2wheretoWord::Int->WordtoWord = fromIntegraltoInt::Word->InttoInt = fromIntegralINLINEinfixl 8 .<<., .>>.(.<<.)::Bitsb=>b->Int->b(.<<.) = unsafeShiftLINLINE(.>>.)::Bitsb=>b->Int->b(.>>.) = unsafeShiftRINLINE