{-# OPTIONS_GHC -O2 #-}
import qualified Data.Vector as V
import qualified Data.Vector.Mutable as VM
import Data.Array.Unboxed
import Data.Array.ST
import qualified Data.ByteString.Char8 as BS
import Control.Monad
import Data.List
import Data.Char
import qualified Data.Map.Strict as M

fun :: M.Map Int Int -> Int
fun m = sum [ k*l | (k,l) <- M.toList m ]

push :: M.Map Int Int -> Int -> M.Map Int Int
push m k = M.insertWith (+) k 1 m

popMin :: M.Map Int Int -> (Int,M.Map Int Int)
popMin m = let (k,i) = M.findMin m in if i == 1 then (k,M.delete k m) else (k,M.update (\x -> Just $ x-1) k m)

popMax :: M.Map Int Int -> (Int,M.Map Int Int)
popMax m = let (k,i) = M.findMax m in if i == 1 then (k,M.delete k m) else (k,M.update (\x -> Just $ x-1) k m)

main :: IO ()
main = do
    n <- readLn
    xs <- unfoldr (BS.readInt . BS.dropWhile isSpace) <$> BS.getLine
    let (as,oo) = splitAt n xs
        (bs,cs) = splitAt n oo
        bb = V.fromList bs
    let u :: V.Vector (M.Map Int Int,Int)
        u = V.create $ do
            u <- VM.new (n+1)
            VM.write u 0 (M.fromListWith (+) [(a,1) | a <- as],sum as)
            forM_ [1..n] $ \i-> do
                (m,s) <- VM.read u (i-1)
                let (k,m') = popMin $ push m (bb V.! (i-1))
                VM.write u i (m',s-k+(bb V.! (i-1)))
            return u
        v :: V.Vector (M.Map Int Int,Int)
        v = V.create $ do
            v <- VM.new (n+1)
            VM.write v n (M.fromListWith (+) [(c,1) | c <- cs],sum cs)
            forM_ [n-1,n-2..0] $ \i -> do
                (m,s) <- VM.read v (i+1)
                let (k,m') = popMax $ push m (bb V.! i)
                VM.write v i (m',s-k+(bb V.! i))
            return v
    print $ maximum [ (snd $ (V.!) u i) - (snd $ (V.!) v i) | i <- [0..n] ]