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: Accepted)

//In the name of GOD
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const ll maxn = 1e6 + 100;
const ll mod = 1e9 + 7;
const ll inf = 1e18;

#define fast_io ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io freopen("input.txt" , "r+" , stdin) ; freopen("output.txt" , "w+" , stdout);
#define pb push_back
#define Mp make_pair
#define pll pair<ll, ll>
#define F first
#define S second

ll n;
pll p;
string s[maxn], ans;
vector<pair<pll, ll> > a, b;

pll check(string bs){
	ll x = 0, y = 0;
	for(ll i = 0; i < ll(bs.size()); i++){
		if(bs[i] == '(') x++;
		else x--;
		y = max(y, -x);
	}
	return Mp(x, y);
}

int main(){
	fast_io;
	
	cin >> n;
	for(ll i = 0; i < n; i++){
		cin >> s[i];
		p = check(s[i]);
		if(p.F >= 0){
			a.pb(Mp(Mp(p.S, -p.F), i));
		}
		else{
			b.pb(Mp(Mp(p.S + p.F, -p.S), i));
		}
	}
	sort(a.begin(), a.end());
	for(ll i = 0; i < a.size(); i++){
		ans += s[a[i].S];
	}
	sort(b.begin(), b.end(), greater<pair<pll, ll> >());
	for(ll i = 0; i < b.size(); i++){
		ans += s[b[i].S];
	}
	p = check(ans);
	if(p.F != 0 || p.S != 0) cout << "No";
	else cout << "Yes";
	
	
	return 0;
}