Problem:
Score : 600 points

Problem Statement

A bracket sequence is a string that is one of the following:

An empty string;

The concatenation of (, A, and ) in this order, for some bracket sequence A ;

The concatenation of A and B in this order, for some non-empty bracket sequences A and B /

Given are N strings S_i. Can a bracket sequence be formed by concatenating all the N strings in some order?

Constraints

1 \leq N \leq 10^6

The total length of the strings S_i is at most 10^6.

S_i is a non-empty string consisting of ( and ).

Input

Input is given from Standard Input in the following format:

N
S_1
:
S_N

Output

If a bracket sequence can be formed by concatenating all the N strings in some order, print Yes; otherwise, print No.

Sample Input 1

2
)
(()

Sample Output 1

Yes

Concatenating (() and ) in this order forms a bracket sequence.

Sample Input 2

2
)(
()

Sample Output 2

No

Sample Input 3

4
((()))
((((((
))))))
()()()

Sample Output 3

Yes

Sample Input 4

3
(((
)
)

Sample Output 4

No

Solution in Haskell (GHC 8.8.3) (judge verdict: Accepted)


module Main where

import           Control.Monad
import           Debug.Trace
import qualified Data.Vector                   as V
import qualified Data.Vector.Mutable           as VM
import qualified Data.Vector.Unboxed           as VU
import qualified Data.Vector.Unboxed.Mutable   as VUM
import           Data.List
import qualified Data.ByteString               as BS
import qualified Data.ByteString.Char8         as BSC8
import           Data.Char
import           Data.Maybe
import           Data.Ord
--import           Data.Vector.Algorithms.Search
import qualified Data.Array                    as A
import qualified Data.Array.Unboxed            as AU
import qualified Data.Array.IO                 as AIO
import qualified Data.Set                      as S
import qualified Data.Map.Strict               as M

main = do
    aN <- getI

    aS <- V.fromList <$> replicateM aN getVUS

    let
        (mL, mR) = foldl
            (\acc@(mL, mR) x ->
                let
                    pLR@(l, r) = foldl
                        (\acc@(l, r) y -> if r == 0
                            then if aS V.! x VU.! y == ')'
                                then (l + 1, 0)
                                else (l, 1)
                            else if aS V.! x VU.! y == ')'
                                then (l, r - 1)
                                else (l, r + 1)
                        )
                        ((0, 0) :: (Int, Int))
                        [0 .. VU.length (aS V.! x) - 1]

                    targetList | l > r     = mR M.!? r
                               | otherwise = mL M.!? l
                    newML
                        | l <= r = M.insert l (r : (fromJustList targetList)) mL
                        | otherwise = mL
                    newMR
                        | l > r = M.insert r (l : (fromJustList targetList)) mR
                        | otherwise = mR
                in
                    (newML, newMR)
            )
            (M.empty, M.empty)
            [0 .. V.length aS - 1]


    let ret1 =
            foldl
                    (\acc key ->
                        let values    = mL M.! key
                            lenValues = length values
                        in  if acc < 0 || acc < key
                                then -1
                                else acc + lenValues * (-key) + sum values
                    )
                    0
                $ M.keys mL

    let ret3 =
            foldl
                    (\acc key ->
                        let values    = mR M.! key
                            lenValues = length values
                        in  if acc < 0 || acc < key
                                then -1
                                else acc + lenValues * (-key) + sum values
                    )
                    0
                $ M.keys mR


    let ans = if ret1 == -1 || ret3 == -1 || ret1 /= ret3 then "No" else "Yes"
    putStrLn ans

myFilter :: (a -> Bool) -> [a] -> ([a], [a])
myFilter _pred [] = ([], [])
myFilter pred (x : xs)
    | pred x    = let (l, r) = myFilter pred xs in (x : l, r)
    | otherwise = let (l, r) = myFilter pred xs in (l, x : r)

fromJustList :: Maybe [a] -> [a]
fromJustList (Just x) = x
fromJustList Nothing  = []

fromJustInt :: Maybe Int -> Int
fromJustInt (Just x) = x
fromJustInt Nothing  = 0

getVUI :: IO (VU.Vector Int)
getVUI = VU.unfoldr (BSC8.readInt . BSC8.dropWhile isSpace) <$> BSC8.getLine
getVUS :: IO (VU.Vector Char)
getVUS = VU.fromList <$> getLine
readI :: BSC8.ByteString -> Int
readI = fst . fromJust . BSC8.readInt
readIL :: BSC8.ByteString -> [Int]
readIL = map readI . BSC8.words
readIT2 :: BSC8.ByteString -> (Int, Int)
readIT2 bs =
    let words = BSC8.words bs in (readI $ head words, readI $ last words)
getI :: IO Int
getI = readI <$> BSC8.getLine
getIL :: IO [Int]
getIL = readIL <$> BSC8.getLine
get2IT :: IO (Int, Int)
get2IT = readIT2 <$> BSC8.getLine

getNIS :: Int -> IO [(Int, BSC8.ByteString)]
getNIS 0 = return []
getNIS n = do
    [aFst, aSnd] <- BSC8.words <$> BSC8.getLine
    next         <- (getNIS (n - 1))
    return ((readI aFst, aSnd) : next)

il2ss :: [Int] -> String
il2ss = unwords . map show

il2sn :: [Int] -> String
il2sn = unlines . map show

--modNum = 10 ^ 9 + 7
modNum = 998244353
newtype Mint = M Int
instance Num Mint where
    (M a) + (M b) = M $ mod (a + b) modNum
    (M a) - (M b) = M (a - b)
    (M a) * (M b) = M $ mod (a * b) modNum
    fromInteger a = M $ mod (fromInteger a) modNum
    abs (M a) = M $ abs a
    signum (M a) = M $ signum a
instance Show Mint where
    show (M a) = show (mod a modNum)

int2MInt :: Int -> Mint
int2MInt a = M (mod a modNum)

fact :: Int -> Int
fact 0         = 1
fact n | n > 0 = n * fact (n - 1)

knappsackMaxVal
    :: AIO.IOArray (Int, Int) Int
    -> VU.Vector Int
    -> VU.Vector Int
    -> Int
    -> IO Int
knappsackMaxVal dp volumeVec valueVec dpSize = do
    mapM_
        (\i -> mapM_
            (\v -> do
                let volume = volumeVec VU.! i
                    value  = valueVec VU.! i
                newdp <- if v < volume
                    then AIO.readArray dp (i, v)
                    else do
                        dpIVm <- AIO.readArray dp (i, v - volume)
                        dpIV  <- AIO.readArray dp (i, v)
                        return (max (dpIVm + value) dpIV)
                AIO.writeArray dp (i + 1, v) newdp
            )
            [0 .. dpSize]
        )
        [0 .. VU.length volumeVec - 1]
    AIO.readArray dp (VU.length volumeVec, dpSize)

knappsackMinVol
    :: AIO.IOArray (Int, Int) Int
    -> VU.Vector Int
    -> VU.Vector Int
    -> Int
    -> Int
    -> IO Int
knappsackMinVol dp volumeVec valueVec dpSize maxVolume = do
    mapM_
        (\i -> mapM_
            (\v -> do
                let volume = volumeVec VU.! i
                    value  = valueVec VU.! i
                newdp <- if (v + value) > dpSize
                    then AIO.readArray dp (i, v)
                    else do
                        dpIVm <- AIO.readArray dp (i, v + value)
                        dpIV  <- AIO.readArray dp (i, v)
                        return (min (dpIVm - volume) dpIV)
                AIO.writeArray dp (i + 1, v) newdp
            )
            (reverse [0 .. dpSize])
        )
        [0 .. VU.length valueVec - 1]

    foldM
        (\acc x -> do
            num <- AIO.readArray dp (VU.length volumeVec, x)
            return $ if num <= maxVolume then x else acc
        )
        0
        [0 .. dpSize]