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 C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include<bits/stdc++.h>
using namespace std;
using UL = unsigned int;
using ULL = unsigned long long;
using LL = long long;
#define rep(i, n) for(UL i = 0; i < (n); i++)

struct Problem{

    void Solve() {
        UL N; cin >> N;
        vector<pair<int, int>> M(N);
        rep(i, N) {
            string S; cin >> S;
            for (char c : S) {
                if (c == '(') M[i].second++;
                else {
                    if (M[i].second > 0) M[i].second--;
                    else M[i].first++;
                }
            }
        }
        {
            int L, R; L = R = 0;
            rep(i, N) { L += M[i].first; R += M[i].second; }
            if (L != R) { cout << "No" << endl; return; }
        }

        sort(M.begin(), M.end());
        int R = 0;
        priority_queue<int> Q;
        UL p = 0;
        while (true) {
            while (true) {
                if (p >= N) break;
                if (M[p].first > R) break;
                Q.push(M[p].second - M[p].first);
                p++;
            }
            if (Q.empty()) break;
            int d = Q.top(); Q.pop();
            R += d;
        }
        cout << "No" << endl;
    }
};
int main() {
    unique_ptr<Problem> p(new Problem());
    p->Solve();
    return 0;
}