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>
#define ll int
#define ld long double
#define fs first
#define sc second
#define task "tet"
using namespace std;
const ll N = 1e6 + 9;
const ll inf = 1e9 + 7;
typedef pair<ll,ll> LL;
struct tempo{
    string x;
    ll cond,diff;
};
tempo s[N];
ll n,i,cur,j,depth;
ll Get1(string x){
    ll n = x.size(),deep = 0;
    for (ll i = 0;i < n;i++){
        if (x[i] == '(') deep++;
        else deep--;
        if (deep < 0) deep = 0;
    }
    return deep;
}
ll Get2(string x){
    ll n = x.size(),deep = 0;
    for (ll i = 0;i < n;i++){
        if (x[i] == '(') deep++;
        else deep--;
        if (deep > 0) deep = 0;
    }
    return deep;
}
ll Count(string x){
    bool flag = true;
    ll n = x.size(),deep = 0;
    for (ll i = 0;i < n;i++){
        if (x[i] == '(') deep++;
        else deep--;
        if (deep < 0) flag = false;
    }
    if (flag) return 0;
    else{
        if (deep >= 0) return 1;
        return 2;
    }
}
bool lf(tempo x,tempo y){
    if (x.cond < y.cond) return true;
    else if (x.cond > y.cond) return false;
    else return x.diff > y.diff;
}
bool chk(){
    for (i = 1;i <= n;i++){
        string p = s[i].x;
        for (j = 0;j < p.size();j++){
            if (p[j] == '(') depth++;
            else depth--;
            if (depth < 0) return false;
        }
    }
    return (depth == 0);
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    if (fopen(task".inp", "r")){
        freopen(task".inp", "r", stdin);
        //freopen(task".out", "w", stdout);
    }
    cin>>n;
    for (i = 1;i <= n;i++){
        cin>>s[i].x;
        s[i].cond = Count(s[i].x);
        if (s[i].cond == 1) s[i].diff = Get2(s[i].x);
        if (s[i].cond == 2) s[i].diff = Get1(s[i].x);

    }
    sort(s + 1,s + n + 1,lf); //cout<<s[1].x<<"\n";
    if (chk()) cout<<"Yes";
    else cout<<"No";

}