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 Go (1.14.1) (judge verdict: Wrong Answer)

package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
)

type Frags [][]int

func (a Frags) Len() int           { return len(a) }
func (a Frags) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a Frags) Less(i, j int) bool { return a[i][0] < a[j][0] }

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n int
	fmt.Fscan(reader, &n)

	var sum int
	var l, m, r Frags
	for i := 0; i < n; i++ {
		var s string
		fmt.Fscan(reader, &s)
		var d, min int
		for j := 0; j < len(s); j++ {
			if s[j] == '(' {
				d++
			} else {
				d--
			}
			if min > d {
				min = d
			}
		}
		if d == 0 {
			m = append(m, []int{min, d})
		} else if d > 0 {
			l = append(l, []int{min, d})
		} else {
			r = append(r, []int{min, d})
		}
		sum += d
	}

	if sum != 0 {
		fmt.Println("No")
		return
	}

	sort.Sort(sort.Reverse(l))
	sort.Sort(r)

	var h int
	t := func(frags Frags) bool {
		for _, f := range frags {
			if h+f[0] < 0 {
				return false
			}
			h += f[1]
		}
		return true
	}

	if t(l) && t(m) && t(r) {
		fmt.Println("Yes")
	} else {
		fmt.Println("No")
	}
}