items <- replicateM n getTuple let dp = accumArrayDP @UArray f max 0 (0, wx) [(0, 0)] items where f (w, acc) (wi, vi) = [(w, acc), (w + wi, acc + vi)] print $ maximum (elems dp)
getInt as <- getInts let binSearch (ok, ng) | abs (ng - ok) == 1 = ok | otherwise = do let m = (ok + ng) `div` 2 count = length $ filter (>= m) as if count >= m then binSearch (m, ng) else binSearch (ok, m) print $ binSearch (0, 10 ^ 18)
で境界を引く bisect2 :: (Integral a) => (a, a) -> (a -> Bool) -> (a, a) bisect2 (ok, ng) f | abs (ng - ok) == 1 = (ok, ng) | f m = bisect2 (m, ng) f | otherwise = bisect2 (ok, m) f where m = (ok + ng) `div` 2 let (ok, _) = bisect2 (0, 10 ^ 18) (¥x -> countBy (>= x) as >= x) print ok
minBound (0, wx) [(0, 0)] wvs accumArrayDP :: ( IArray a e, Ix v, Eq e, Show e, Show v, Show (a v e), Foldable t ) => ((v, e) -> x -> [(v, e')]) -> -- 状態遷移関数 f v / x をみて v の次の遷移可能性を返す (e -> e' -> e) -> -- 緩和の二項演算 e -> -- 初期値 (0, minBound, maxBound, False など) (v, v) -> -- 状態空間の下界、上界 [(v, e')] -> -- 開始時点の状態 t x -> -- 入力 (時間遷移) a v e -- Array or UArray accumArrayDP f combine initial (l, u) v0s xs = let dp = accumArray combine initial (l, u) v0s in foldl' transition dp xs where transition dp x = accumArray combine initial (l, u) $ concatMap (filter (inRange (bounds dp) . fst) . (`f` x)) (assocs dp)
replicateM n getTuple let dp = accumArrayDP @UArray f max 0 (0, wx) [(0, 0)] items where f (w, acc) (wi, vi) = [(w, acc), (w + wi, acc + vi)] print $ maximum (elems dp)
items <- replicateM n getTuple let dp = accumArrayDP @UArray f max 0 (0, wx) [(0, 0)] items where f (w, acc) (wi, vi) = [(w, acc), (w + wi, acc + vi)] print $ maximum (elems dp)