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;

int main() {
	long n,m,i,j,k,ans,cur,res,mod=998244353;
	cin >> n;
	vector<pair<long,long>> t(n); //first.min second.total
	string s;
	for(i=0; i<n; i++){
		t[i].first=0; t[i].second=0;
	}
	ans=0;
	
	for(i=0; i<n; i++){
		cin >> s;
		cur=0;
		for(j=0; j<s.size(); j++){
			if(s[j]=='('){
				cur++;
			}else{
				cur--;
				t[i].first=min(t[i].first,cur);
			}
		}
		t[i].second=cur;
		ans+=cur;
	}
	if(ans!=0){
		cout << "No" << endl; return 0;
	}
	
	sort(t.begin(), t.end());
	reverse(t.begin(), t.end());
	
	/*
	for(i=0; i<n; i++){
		cout << t[i].first << t[i].second << endl;
	}
	*/
	res=0;
	for(i=0; i<n && t[i].first==0; i++){
		res+=t[i].second;
	}
	
	reverse(t.begin(),t.end());
	vector<pair<long,long>> tpos(0),tneg(0);
	for(i=0; i<n && t[i].first<0; i++){
		if(t[i].second>0){
			tpos.push_back(t[i]);
		}else{
			tneg.push_back(t[i]);
		}
	}
	for(i=0; i<tpos.size(); i++){
		tpos[i].first*=-1;
	}
	//cout << res << endl;
	sort(tpos.begin(),tpos.end());
	for(i=0; i<tpos.size(); i++){
		tpos[i].first*=-1;
	}
	for(i=0; i<tpos.size(); i++){
		if(tpos[i].first+res<0){
			cout << "No" << endl; return 0;
		}
		res+=tpos[i].second;
	}
	cout << "Yes" << endl;
	return 0;
}