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;
using ll=long long;
/*
R0とL0がそれぞれ存在して、＋－が打ち消しあえばよさそう
+++----
0のやつが互いに端にならぶ
どちらも0でない、はありうるか
最小値がマイナスになったらOUT
0のやつの総和を、調整できないやつが超えてもOUT
((() (()((( (((     )))((()))(((    )))() (())) )))
R余力　　　　　　　　ちょうど分ける？　　　　　　  L余力

))(  )))))(   )((((((

))((( -2 -3
()) -1 0
)() -1 0
*/
int main(){
  ll N; cin>>N;
  vector<ll> R(N,0), L(N,0);
  for(ll i=0; i<N; i++){
    string S; cin>>S;
    ll sz=S.size(), tmp=0, left=0, right=0;
    for(ll j=0; j<sz; j++){// )のあぶれ数
      if(S[j]=='(') tmp++;
      else{
        tmp--;
        left=min(left,tmp);
      }
    }
    L[i]=left;
    tmp=0;
    for(ll j=sz-1; j>=0; j--){// (のあぶれ数
      if(S[j]==')') tmp++;
      else{
        tmp--;
        right=min(right,tmp);
      }
    }
    R[i]=right;
  }
  ll L0=0, R0=0;
  for(ll i=0; i<N; i++) if(L[i]==0) L0+=R[i];// ( の余力
  for(ll i=0; i<N; i++) if(R[i]==0) R0+=L[i];// ) の余力
  for(ll i=0; i<N; i++) if(L[i]!=0) L0-=L[i];// ) のあまり
  for(ll i=0; i<N; i++) if(R[i]!=0) R0-=R[i];// ( のあまり
  if(L0==0 && R0==0) cout<<"Yes"<<endl;
  else cout<<"No"<<endl;
}