| Safe Haskell | None |
|---|---|
| Language | GHC2021 |
AtCoder.Extra.Vector
Description
Miscellaneous vector functions. These functions are not the fastest implementations, but fills in some lacking features.
Since: 1.2.2.0
Synopsis
- argsort :: (HasCallStack, Ord a, Unbox a) => Vector a -> Vector Int
- compress :: Vector Int -> (Vector Int, Vector Int)
- iconcatMap :: (HasCallStack, Vector v a, Vector v b) => (Int -> a -> v b) -> v a -> v b
- concatMapM :: (HasCallStack, Monad m, Vector v a, Vector v b) => (a -> m (v b)) -> v a -> m (v b)
- iconcatMapM :: (HasCallStack, Monad m, Vector v a, Vector v b) => (Int -> a -> m (v b)) -> v a -> m (v b)
- mapAccumL :: forall v s a b. (HasCallStack, Vector v a, Vector v b) => (s -> a -> (s, b)) -> s -> v a -> (s, v b)
- chunks :: Vector v a => Int -> v a -> Vector (v a)
- prescanlM :: (HasCallStack, Monad m, Vector v a, Vector v b) => (a -> b -> m a) -> a -> v b -> m (v a)
- prescanlM' :: (HasCallStack, Monad m, Vector v a, Vector v b) => (a -> b -> m a) -> a -> v b -> m (v a)
- postscanlM :: (HasCallStack, Monad m, Vector v a, Vector v b) => (a -> b -> m a) -> a -> v b -> m (v a)
- postscanlM' :: (HasCallStack, Monad m, Vector v a, Vector v b) => (a -> b -> m a) -> a -> v b -> m (v a)
- scanlM :: (HasCallStack, Monad m, Vector v a, Vector v b) => (a -> b -> m a) -> a -> v b -> m (v a)
- scanlM' :: (HasCallStack, Monad m, Vector v a, Vector v b) => (a -> b -> m a) -> a -> v b -> m (v a)
- scanl1M :: (HasCallStack, Monad m, Vector v a) => (a -> a -> m a) -> v a -> m (v a)
- scanl1M' :: (HasCallStack, Monad m, Vector v a) => (a -> a -> m a) -> v a -> m (v a)
- maxRangeSum :: (Vector v a, Ord a, Num a) => v a -> a
- minRangeSum :: (Vector v a, Ord a, Num a) => v a -> a
- slideMinIndices :: HasCallStack => Int -> Vector Int -> Vector Int
- slideMaxIndices :: HasCallStack => Int -> Vector Int -> Vector Int
Sort functions
argsort :: (HasCallStack, Ord a, Unbox a) => Vector a -> Vector Int Source #
\(O(n \log n)\) Returns indices of the vector elements, stably sorted by their value.
Example
>>>import AtCoder.Extra.Vector qualified as EV>>>import Data.Vector.Unboxed qualified as VU>>>EV.argsort $ VU.fromList @Int [0, 1, 0, 1, 0][0,2,4,1,3]
Since: 1.2.3.0
Index compression
compress :: Vector Int -> (Vector Int, Vector Int) Source #
\(O(n \log n)\) One dimensional index compression: xs -> (nubSortXs, xs')
Example
>>>import AtCoder.Extra.Bisect (lowerBound)>>>import AtCoder.Extra.Vector qualified as EV>>>import Data.Vector.Unboxed qualified as VU>>>let xs = VU.fromList [0, 20, 40, 10, 30]>>>let (dict, xs') = EV.compress xs>>>xs'[0,2,4,1,3]>>>lowerBound dict 101
Since: 1.5.1.0
Vector Utilities
iconcatMap :: (HasCallStack, Vector v a, Vector v b) => (Int -> a -> v b) -> v a -> v b Source #
Maps each element to a vector and concatenate the results.
Example
>>>import AtCoder.Extra.Vector qualified as EV>>>import Data.Vector.Unboxed qualified as VU>>>EV.iconcatMap (\i x -> VU.fromList [i + x, i + x]) $ VU.replicate @Int 3 0[0,0,1,1,2,2]
Since: 1.5.1.0
concatMapM :: (HasCallStack, Monad m, Vector v a, Vector v b) => (a -> m (v b)) -> v a -> m (v b) Source #
Maps each element to a vector and concatenate the results.
Example
>>>import AtCoder.Extra.Vector qualified as EV>>>import Data.Vector.Unboxed qualified as VU>>>EV.iconcatMap (\x -> pure (VU.fromList [x, x])) $ VU.generate @Int 3 id[0,0,1,1,2,2]
Since: 1.5.1.0
iconcatMapM :: (HasCallStack, Monad m, Vector v a, Vector v b) => (Int -> a -> m (v b)) -> v a -> m (v b) Source #
Maps each element to a vector and concatenate the results.
Example
>>>import AtCoder.Extra.Vector qualified as EV>>>import Data.Vector.Unboxed qualified as VU>>>EV.iconcatMapM (\i x -> pure (VU.fromList [i + x, i + x])) $ VU.replicate @Int 3 0[0,0,1,1,2,2]
Since: 1.5.1.0
mapAccumL :: forall v s a b. (HasCallStack, Vector v a, Vector v b) => (s -> a -> (s, b)) -> s -> v a -> (s, v b) Source #
\(O(n)\) Maps a vector with an accumulator.
Example
>>>import AtCoder.Extra.Vector qualified as EV>>>import Data.Vector.Unboxed qualified as VU>>>EV.mapAccumL (\s x -> (s + 1, s * x)) (0 :: Int) $ VU.generate @Int 4 id(4,[0,1,4,9])
Since: 1.5.1.0
chunks :: Vector v a => Int -> v a -> Vector (v a) Source #
\(O(n)\) Converts a vector into chunks of vectors with lenth \(k\). The last vector may have smaller length than \(k\).
>>>import AtCoder.Extra.Vector qualified as EV>>>import Data.Vector.Unboxed qualified as VU>>>EV.chunks 3 $ VU.fromList ([1, 2, 3, 4, 5, 6, 7] :: [Int])[[1,2,3],[4,5,6],[7]]
Since: 1.5.1.0
Monadic scanl
prescanlM :: (HasCallStack, Monad m, Vector v a, Vector v b) => (a -> b -> m a) -> a -> v b -> m (v a) Source #
Since: 1.5.1.0
prescanlM' :: (HasCallStack, Monad m, Vector v a, Vector v b) => (a -> b -> m a) -> a -> v b -> m (v a) Source #
Since: 1.5.1.0
postscanlM :: (HasCallStack, Monad m, Vector v a, Vector v b) => (a -> b -> m a) -> a -> v b -> m (v a) Source #
Since: 1.5.1.0
postscanlM' :: (HasCallStack, Monad m, Vector v a, Vector v b) => (a -> b -> m a) -> a -> v b -> m (v a) Source #
Since: 1.5.1.0
scanlM :: (HasCallStack, Monad m, Vector v a, Vector v b) => (a -> b -> m a) -> a -> v b -> m (v a) Source #
Since: 1.5.1.0
scanlM' :: (HasCallStack, Monad m, Vector v a, Vector v b) => (a -> b -> m a) -> a -> v b -> m (v a) Source #
Since: 1.5.1.0
scanl1M :: (HasCallStack, Monad m, Vector v a) => (a -> a -> m a) -> v a -> m (v a) Source #
Since: 1.5.1.0
scanl1M' :: (HasCallStack, Monad m, Vector v a) => (a -> a -> m a) -> v a -> m (v a) Source #
Since: 1.5.1.0
Queries
maxRangeSum :: (Vector v a, Ord a, Num a) => v a -> a Source #
\(O(n)\) Returns maximum range sum.
Example
>>>import AtCoder.Extra.Vector qualified as EV>>>import Data.Vector.Unboxed qualified as VU>>>EV.maxRangeSum $ VU.fromList @Int [-3, 1, 6, -2, 7, -5]12
Since: 1.5.1.0
minRangeSum :: (Vector v a, Ord a, Num a) => v a -> a Source #
\(O(n)\) Returns minimum range sum.
Example
>>>import AtCoder.Extra.Vector qualified as EV>>>import Data.Vector.Unboxed qualified as VU>>>EV.minRangeSum $ VU.fromList @Int[-3, 1, 6, -20, 7, -9]-22
Since: 1.5.1.0
slideMinIndices :: HasCallStack => Int -> Vector Int -> Vector Int Source #
\(O(N)\) Returns indices of minimum values in the windows with the specified length.
Constraints
- \(k \gt 0\)
Example
>>>slideMinIndices 3 (VU.fromList [0 .. 5])[0,1,2,3]>>>slideMinIndices 3 (VU.fromList [5, 4 .. 0])[2,3,4,5]
Since: 1.5.1.0
slideMaxIndices :: HasCallStack => Int -> Vector Int -> Vector Int Source #
\(O(N)\) Returns indices of maximum values in the windows with the specified length.
Constraints
- \(k \gt 0\)
Example
indices: 0 1 2 3 4 5
values: 0 1 2 3 4 5 max value indices:
[---] 2
[---] 3
[---] 4
[---] 5
>>>slideMaxIndices 3 (VU.fromList [0 .. 5])[2,3,4,5]>>>slideMaxIndices 3 (VU.fromList [5, 4 .. 0])[0,1,2,3]
Since: 1.5.1.0