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 <iostream>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <set>
#include <queue>

using namespace std;
typedef long long int ll;


bool sort1(const pair<int, int> a, const pair<int, int> b)
{
    return a.second < b.second;
}

bool sort2(const pair<int, int> a, const pair<int, int> b)
{
    return a.first < b.first;
}
// use case
//sort(V.begin(), V.end(), compare_function);

void print(vector <pair <int,int>> M)
{
    cout<<"Pradedam"<<endl;
    for (int i=0; i<M.size(); i++)
    {
        cout<<M[i].first<<" "<<M[i].second<<endl;
    }
    cout<<endl;
}

void solve (int n, vector <string> &S)
{
    vector <pair <int,int>> O(n);
    vector <pair <int,int>> C(n);
    for (int i=0; i<n; i++)
    {
        int o=0;
        int c=0;
        string s=S[i];
        for (int j=0; j<s.length(); j++)
        {
            if (s[j]=='(')
            {
                o++;
            }
            else
            {
                if (o>0)
                {
                    o--;
                }
                else
                {
                    c++;
                }
            }
        }
        if (o>=c)
        {
           // cout<<"O "<<i<<" "<<o<<" "<<c<<endl;
            O.push_back({o,c});
        }
        else
        {
            //cout<<"C "<<i<<" "<<o<<" "<<c<<endl;
            C.push_back({o,c});
        }
    }
    int ats=0;
    //print(O);
    //print(C);
    sort(O.begin(),O.end(),sort2);
    sort(C.begin(),C.end(),sort1);
    for (int i=0; i<O.size(); i++)
    {
        if (ats<O[i].second)
        {
            cout<<"No"<<endl;
            return;
        }
        ats=ats+O[i].first-O[i].second;
    }
    for (int i=0; i<C.size(); i++)
    {
        if (ats<C[i].second)
        {
            cout<<"No"<<endl;
            return;
        }
        ats=ats+C[i].first-C[i].second;
    }
    if (ats!=0)
    {
        cout<<"No"<<endl;
        return;
    }
    cout<<"Yes"<<endl;
    return;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin>>n;
    vector <string> S(n,"00");
    for (int i=0; i<n; i++)
    {
        cin>>S[i];
    }
    solve(n,S);
    return 0;
}