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;
#define rep(i,j,k) for(int i = (int)(j);i <= (int)(k);i ++)
#define debug(x) cerr<<#x<<":"<<(x)<<endl
#define fix cout<<fixed<<setprecision(20);
const int maxn=(int)1e6+5;
struct dat{
    int mn,sum;
    //data(int mn=0,int sum=0):mn(mn),sum(sum){}
    bool operator<(const  dat &a)const{
        return mn==a.mn?  sum>a.sum:mn<a.mn;
    }
};
int main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int n;cin>>n;
    multiset<dat> st;
    rep(i,1,n){
        string s;cin>>s;
        int now=0;
        int mn=0,sm=0;
        for(auto c:s){
            if(c=='(')now++;else now--;
            mn=min(mn,now);
        }
        //debug(mn);
        //st.insert(data(mn,now));
        st.insert({mn,now});
    }
    //for(auto t:st)debug(t.mn),debug(t.sum);
    int cur=0;
    int flag=1;
    rep(i,1,n){
        auto it=st.lower_bound({-cur,(int)1e7});
        //debug((*it).mn);
        if(it==st.end()){flag=0;break;}
        cur+=it->sum;
        st.erase(it);
    }
    if(cur!=0)flag=0;
    cout<<(flag?"Yes":"No")<<endl;
}
/* 

 */