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 all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define forn(i, n) for (int i = 0; i < (int)(n); ++i)
#define for1(i, n) for (int i = 1; i <= (int)(n); ++i)
#define ford(i, n) for (int i = (int)(n) - 1; i >= 0; --i)
#define fore(i, a, b) for (int i = (int)(a); i <= (int)(b); ++i)

template<class T> bool umin(T &a, T b) { return a > b ? (a = b, true) : false; }
template<class T> bool umax(T &a, T b) { return a < b ? (a = b, true) : false; }

using namespace std;

int main(int argc, char** argv) 
{
// #ifdef HOME
// 	if(IsDebuggerPresent())
// 	{
// 		freopen("../in.txt", "rb", stdin);
// 		freopen("../out.txt", "wb", stdout);
// 	}
// #endif
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.precision(10);
	int N;
	cin >> N;
	vector<string> S(N);
	vector<pair<int, int>> v1, v2;
	int fs = 0, p = 0;
	forn(i, N)
	{
		cin >> S[i];
		int m = 0, f = 0;
		for(char c : S[i])
		{
			if (c == '(')
				++f;
			else
				--f;
			m = min(m, f);
		}
		fs += f;
		if (m == 0)
			p += fs;
		else if (f < 0)
			v1.push_back(make_pair(m,f));
		else if(f >= 0)
			v2.push_back(make_pair(m, f));
	}
	if (fs != 0)
	{
		cout << "NO\n";
	}
	bool ok = true;
	sort(all(v2));
	reverse(all(v2));
	forn(i, v2.size())
	{
		if (p + v2[i].first < 0)
			ok = false;
		p += v2[i].second;
	}
	sort(all(v1));
	forn(i, v1.size())
	{
		if (p + v1[i].first < 0)
			ok = false;
		p += v1[i].second;
	}
	if(ok)
	{
		cout << "YES\n";
	}
	else
	{
		cout << "NO\n";
	}
	return 0;
}