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 Rust (1.42.0) (judge verdict: Accepted)

use proconio::input;
use proconio::marker::Chars;

fn f(p: &mut Vec<(i64, i64)>) -> bool {
    p.sort_by_key(|&p_i| std::cmp::Reverse(p_i));
    let mut c = 0;
    for &(b, r) in p.iter() {
        if c + b < 0 {
            return false;
        }
        c += r;
    }
    true
}

fn main() {
    input! {
        n: usize,
        s: [Chars; n],
    };
    let mut sum = 0;
    let mut p_l = vec![];
    let mut p_r = vec![];
    for s_i in s.iter() {
        // 初期位置から b まで下がって r で終わるものという表現に変換する
        let (b, r) = s_i.iter().fold((0, 0), |(b, r), &c| match c {
            '(' => (b, r + 1),
            ')' => (std::cmp::min(b, r - 1), r - 1),
            _ => unreachable!(),
        });
        // 左半分に配置するものと右半分に配置するものに分ける
        // 右半分の配置は左右を反転させたものとして解釈する
        if r > 0 {
            p_l.push((b, r));
        } else {
            p_r.push((b - r, -r))
        }
        sum += r;
    }
    let ans = if sum == 0 && f(&mut p_l) && f(&mut p_r) {
        "Yes"
    } else {
        "No"
    };
    println!("{}", ans);
}