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 Perl (5.26.1) (judge verdict: Accepted)

my $s = <>;
chomp $s;
my @PDB;
my @MDB;
my $state  =0;
my $mstate =0;
my $pmmax  =0;
my $pmmin  =0;
my $sum=0;
for(my $i=0;$i<$s;$i++){
    my $line = <>;chomp $line;
    my @dat = split(//,$line);
    #print "@dat\n";
    my $min=0;
    my $max=0;
    my $total=0;
    for(my $j=0;$j<=$#dat;$j++){
        #print "$dat[$j]\n";
      if($dat[$j] eq '(' ){
         #print "plus \n";
        $total++;
      }else{
        $total--;
      }
      if($min >$total ){ $min =$total;}
      if($max <$total ){ $max =$total;}
    }
    $max = $max - $total;
    #print "$total $min\n";
    $sum = $sum + $total;
    if($total ==0){
      if($pmmin > $min){$pmmin = $min;}
    }elsif($total >0){
      if( $min >=0 ){#-にならないならここで足してしまう
        $state = $state + $total;
        next;
      }
      my @row = ($total,$min);
      push (@PDB,\@row);
    }else{
      $min = $min - $total;#左からみた最小
      if( $min >=0){
        $mstate = $mstate + $total;
        #print"$min $mstate\n";
        next;
      }
      my @row = ($total,$min);
      push (@MDB,\@row);
    }
    #print "$sum $total \n";
}
#print "$state $mstate \n";

@PDB = sort{ $b->[1] <=> $a->[1]} @PDB;
#my @amari;
for(my $i=0;$i<=$#PDB;$i++){
  if(($state+$PDB[$i][1]) >= 0){#採用
    $state = $state + $PDB[$i][0];
    #print "@{$PDB[$i]} state $state \n ";
  }else{
    print "No";exit;
  }
}
#print "$state $pmmin \n";
if( ($state+$pmmin) < 0){ print "No";exit;}
#print "MDB $#MDB\n";

@MDB = sort{ $b->[1] <=> $a->[1]} @MDB;
for(my $i=0;$i<=$#MDB;$i++){
  if((-$mstate+$MDB[$i][1]) >= 0){#採用
    $mstate = $mstate + $MDB[$i][0];
    #print "@{$MDB[$i]} mstate $mstate \n ";
  }else{
    print "No";exit;
  }
}
$state = $state + $mstate;

if( $state == 0){
    print "Yes";
}else{
    print "No";
}